SQL请求头注入
请求头注入
请求头注入就是将http请求中的一些头部进行注入,因为这些头部和数据库产生了交互,那么它们就有可能存在注入。下面是一个http请求,让我们看一
可能存在注入的点:
①Host(主机头)
在http1.0中没有Host字段,在http1.1中,增加这个字段,http协议的本质是建立tcp连接,而建立连接则需要知道对方的IP和端口号,然后才能发送数据建立连接。所有Host头域指定请求资源的Internet主机和端口。host头主要是用来将请求分派到指定的wen页面或者网站,它的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的两种场景,一是记录访问者的信息,如浏览器类型版本号等,二是获取用户的user-agent,然后根据信息来推送不同的页面,例如手机页面,各个浏览器页面等,这是已经进行了数据库的入库和查询操作,如果没对此进行过滤,漏洞产生。
③Cookie(储存在用户本地终端上的数据)
④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看是否产生报错
host头检测转载:https://www.jianshu.com/p/690acbf9f321