最新XFF注入攻击和代码分析技术

点击星标,即时接收最新推文

da01c6b6cab79b6985c8976a0bca638f.png

本文选自《web安全攻防渗透测试实战指南(第2版)》

点击图片五折购书

c5c15859928654fcbff7904e88cead5a.gif

XFF注入攻击

XFF注入攻击的测试地址在本书第2章。

X-Forwarded-For简称XFF头,它代表客户端真实的IP地址,通过修改X-Forwarded-For的值可以伪造客户端IP地址,在请求头中将X-Forwarded-For设置为127.0.0.1,然后访问该URL,页面返回正常,如图4-67所示。

db94c8f1c8214762292b5edb278db62a.jpeg

图4-67 

将X-Forwarded-For设置为127.0.0.1',再次访问该URL,页面返回MySQL的报错信息,结果如图4-68所示。

9cf0ad96bddd47f8f1eedfd448206c1d.jpeg

图4-68

将X-Forwarded-For分别设置为127.0.0.1' and 1=1#和127.0.0.1' and 1=2#,再次访问该URL,结果分别如图4-69和图4-70所示。

90617eac6be2070f4c8aa75b3237e093.jpeg

图4-69  

c486bf87f48dd29177760fc75b88a594.jpeg

图4-70  

通过页面的返回结果,可以判断出该地址存在SQL注入漏洞,接着使用order by判断表中的字段数量,最终测试出数据库中存在4个字段,尝试使用Union查询注入方法,语法是X-Forwarded-for:-1' union select 1,2,3,4#,如图4-71所示。

a90f2d26d9945d34e2bc034f9d46b6c4.jpeg

图4-71  

接着,使用Union注入方法完成此次注入。

8efaf60d2f8914f60dbd2bcae649dd85.gif

XFF注入代码分析

PHP中的getenv()函数用于获取一个环境变量的值,类似于$_SERVER或$_ENV,返回环境变量对应的值,如果环境变量不存在,则返回FALSE。

使用以下代码即可获取客户端IP地址。程序先判断是否存在HTTP头部参数HTTP_CLIENT_IP,如果存在,则赋给$ip;如果不存在,则判断是否存在HTTP头部参数

HTTP_X_FORWARDED_FOR。如果存在,则赋给$ip;如果不存在,则将HTTP头部参数REMOTE_ADDR赋给$ip。

<?php
    $con=mysqli_connect("localhost","root","123456","test");
    if (mysqli_connect_errno()){
       echo "连接失败: " . mysqli_connect_error();
    }




    if(getenv('HTTP_CLIENT_IP')) {
        $ip = getenv('HTTP_CLIENT_IP');
    } elseif(getenv('HTTP_X_FORWARDED_FOR')) {
        $ip = getenv('HTTP_X_FORWARDED_FOR');
    } elseif(getenv('REMOTE_ADDR')) {
        $ip = getenv('REMOTE_ADDR');
    } else {
        $ip = $HTTP_SERVER_VARS['REMOTE_ADDR'];
    }
    
    $result = mysqli_query($con,"select * from winfo where `ip`='$ip'");
    if (!$result) {
        printf("Error: %s\n", mysqli_error($con));
        exit();
    }
    $row = mysqli_fetch_array($result);
    echo $row['username'] . " : " . $row['address'];
    echo "<br>";
?>

接下来,将$ip拼接到select语句中,然后将查询结果输出到界面上。

由于HTTP头部参数是可以伪造的,所以可以添加一个头部参数CLIENT_IP或X_FORWARDED_FOR。

当设置X_FORWARDED_FOR =-1' union select 1,2,3,4%23时,执行的SQL语句如下:

select * from winfo where `ip`='-1' union select 1,2,3,4#'

此时,SQL语句可以分为select * from winfo where `ip`='-1'和union select 1,2,3,4这两条,利用第二条语句(Union查询)就可以获取数据库中的数据。

dee82d74d1ddb8841c5892a1e3ea86f1.gif

MS08067安全实验室视频号已上线

欢迎各位同学关注转发~

—  实验室旗下直播培训课程  —

19b95fb3b3718b61f7165f0f897654ff.png

766c7de3ae56df8c1c6658c64897a0a8.jpeg

a4c9036ad49896b16e873f746cff7686.jpege0c1e1f9a6e85aedc3ae9d12ec9f1298.png

9cda0a65119f4ede39cdb9fac73d8498.jpeg

76876e9447ce18266b7959abce249403.jpeg

aa3f7d1faaf11bb81a9816209938f1b6.jpeg

70889079d80968e8777b9d2142835760.jpeg

864784b16a9767c268783d1fcdcc5ed7.jpeg


和20000+位同学加入MS08067一起学习

aefa65855369e5db181fe3b3385a60ba.gif

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值