SQL注入之请求头(Header)方式

请求头注入

请求头注入就是将 http 请求中的一些头部进行注入,因为这些头部和数据库产生了交互,那么它们就有可能存在注入。下面是一个 http 请求:

4aa1b1eaf1b3af6a4446c0bbdc8c2d52.png

可能存在注入的点:

① Host(主机头)

在 http1.0 中没有 Host 字段,在 http1.1 中,增加这个字段,http 协议的本质是建立 tcp 连接,而建立连接则需要知道对方的 IP 和端口号,然后才能发送数据建立连接。

所有 Host 头域指定请求资源的 Internet 主机和端口。host 头主要是用来将请求分派到指定的页面或者网站,它的 IP 来自于网络层和传输层,对于 http 协议来说,它是基于 tcp/ip 的一个封装。

在 http1.1 中不能缺少 Host 字段,缺少 host 字段服务器会返回 400 bad request ,http1.0 虽然不能缺少 Host 字段,但是该字段可以为空。

既然 host 头来自于客户,由客户端提供,而且可以修改,那么它是不可信的。当Host头部被修改为无效 Host 头会发生什么情况?

大多数 web 服务器配置为将无法识别的 Host 头传送给列表中的第一台虚拟主机或者返回错误信息。因此,这使得把携带有任意 Host 头的请求发送到第一台虚拟主机上是可能的。

例如下面,很多 host 都不做 HTML 编码,便直接输出到页面,当 host 被改为恶意连接时,出发恶意请求,容易造成缓存污染和密码重置这两种攻击

<link href=http://_SERVER["HTTP_HOST"]></link>    //触发一个get请求
<form method=”POST”></form>                       //触发POST请求

② User-agent(用户代理,识别用户的浏览器版本,操作系统等信息)

User-Agent 的两种场景: 1. 是记录访问者的信息,如浏览器类型版本号等;

  1. 是获取用户的 user-agent,然后根据信息来推送不同的页面,例如手机页面,各个浏览器页面等,这是已经进行了数据库的入库和查询操作,如果没对此进行过滤,漏洞产生。

④ referer

⑤X-Forwarded-For

XFF 头,它代表客户端,也就是 HTTP 的请求端真实的 IP,(通常一些网站的防注入功能会记录请求端真实 IP 地址并写入数据 库 or 某文件 [通过修改 XXF 头可以实现伪造 IP])。

当你对一个网站进行爆破或大量访问时,浏览器可能会限制你的访问,他通过什么来限制呢,http 是无状态连接,而且自 己也清掉了 cookie 信息,浏览器是如何限制自己的?

首先当你有攻击行为的时候, 服务器一般会把恶意用户的 ip 存入数据库。

当每次用户请求的时候(以 java 语言为例),服务器通过 request.getRemoteAddr() 这个方法来获取请求者的 ip。于是想到这个 ip 我们自己到底能不能伪造?答案是否定的。

因为 经过测试 request.getRemoteAddr 并不会回从数据包的请求头去获取 ip 字段的 Value。所以推测 ip 地址是 ip 包中的 soure 来的,当我 们发送 http 请求时是否可以更新 soure ip 来绕过限制呢,这个可以有!

但是你将不会收到对方的响应,因为在正常的 TCP/IP 通信 中,伪造数据包来源 IP 会让发送出去的数据包返回到伪造的 IP 上,无法实现正常的通信。这样我们也就失去的绕过的意义。

request.getRemoteAddr 方法我们没办法伪造,是不是我们就无法利用这个点了呢?

结合实际一般程序员是不会通过 request.getRemoteAddr 方法来获取 ip 的,这个方法虽然获取的 ip 比较准确,暂无办法绕过。但实际场景中往往服务器前面会有一个代理服务器和均衡负载服务器。当使用 request.getRemoteAddr 方法时,获取的只是代理服务器 的 ip 并不能获取请求者的真实 ip。这时候一些程序员为了实现获取真实 ip 会获取 XFF 方法。

综上所述,浏览器可以通过 request.getRemoteAddr() 方法获取请求者 IP,但是实际场景中服务器前面往往存在代理服务器,负载均衡等等,所以实际 request.getRemoteAddr() 不能获取到请求者的 IP,那么它可能会获取 X-Forwarded-For 的内容。

⑥ Client-IP同上

判断注入点在哪里

  1. 先一个个去掉请求包中的数据, 查看有哪些服务器是没有接受的,可以直接去掉的,过滤掉;

  2. 然后具体对每一个请求头做出判断,将每一个请求头当做参数即可,然后打一些 payload 看是否产生报错;

原文地址 www.cnblogs.com

文章作者:  BigYoung
版权声明:  本网站所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 BigYoung !



z