XFF注入攻击
X-Forwarded-For简称XFF头,它代表客户端真实的IP地址,通过修改X-Forwarded-For
的值可以伪造客户端IP地址,在请求头中将X-Forwarded-For
设置为127.0.0.1
,然后访问该URL,页面返回正常,如图1所示。
- 图2
将X-Forwarded-For设置为127.0.0.1’,再次访问该URL,页面返回MySQL的报错信息,结果如图2所示。
- 图3
将X-Forwarded-For分别设置为127.0.0.1′ and 1=1#和127.0.0.1′ and 1=2#,再次访问该URL,结果分别如图3和图4所示。
- 图3
- 图4
通过页面的返回结果,可以判断出该地址存在SQL注入漏洞,接着使用order by判断表中的字段数量,最终测试出数据库中存在4个字段,尝试使用Union查询注入方法,语法是X-Forwarded-for:-1′ union select 1,2,3,4#,如图5所示。
- 图5
接着,使用Union注入方法完成此次注入。
XFF注入代码分析
PHP中的getenv()
函数用于获取一个环境变量的值,类似于SERVER
或_ENV
,返回环境变量对应的值,如果环境变量不存在,则返回FALSE。
使用以下代码即可获取客户端IP地址。程序先判断是否存在HTTP头部参数HTTP_CLIENT_IP
,如果存在,则赋给$ip;如果不存在,则判断是否存在HTTP头部参数
HTTP_X_FORWARDED_FOR
。如果存在,则赋给ip;如果不存在,则将HTTP头部参数REMOTEADDR
赋给ip。
接下来,将$ip拼接到select语句中,然后将查询结果输出到界面上。
由于HTTP头部参数是可以伪造的,所以可以添加一个头部参数CLIENT_IP或X_FORWARDED_FOR。
当设置X_FORWARDED_FOR =-1' union select 1,2,3,4%23
时,执行的SQL语句如下:
此时,SQL语句可以分为select * from winfo where `ip`='-1'
和union select 1,2,3,4
这两条,利用第二条语句(Union查询)就可以获取数据库中的数据。
暂无评论内容