05day_sql _基于client-ip、X-forworded-for注入(4)

代码文本

<?php
header("Content-type:text/html;charset=utf-8");
$link = mysqli_connect('localhost','root','root','security');
//获取IP https://www.cnblogs.com/rendd/p/6183094.html
function ip() {
    //strcasecmp 比较两个字符,不区分大小写。返回0,>0,<0。
    if(getenv('HTTP_CLIENT_IP') && strcasecmp(getenv('HTTP_CLIENT_IP'), 'unknown')) {
        $ip = getenv('HTTP_CLIENT_IP');
    } elseif(getenv('HTTP_X_FORWARDED_FOR') && strcasecmp(getenv('HTTP_X_FORWARDED_FOR'), 'unknown')) {
        $ip = getenv('HTTP_X_FORWARDED_FOR');
    } elseif(getenv('REMOTE_ADDR') && strcasecmp(getenv('REMOTE_ADDR'), 'unknown')) {
        $ip = getenv('REMOTE_ADDR');
    } elseif(isset($_SERVER['REMOTE_ADDR']) && $_SERVER['REMOTE_ADDR'] && strcasecmp($_SERVER['REMOTE_ADDR'], 'unknown')) {
        $ip = $_SERVER['REMOTE_ADDR'];
    }
    // $res =  preg_match ( '/[\d\.]{7,15}/', $ip, $matches ) ? $matches [0] : '';
    return  $ip;
}
@$ip = ip();
// $sqlinsert = "insert into access (ip) values ('$ip')";
// mysqli_query($link,$sqlinsert);
$sql = "select * from uagents where ip_address = '$ip'";
echo $sql;
echo '<br>-------------<br>';
$result = mysqli_query($link,$sql);
if ($row = mysqli_fetch_assoc($result)) {
    echo '您的ip是:'.@$row['ip_address'];
}else{
    echo '您的ip没有记录';
}
mysqli_close($link);
?>

分析

05day_sql _基于client-ip、X-forworded-for注入(4)
05day_sql _基于client-ip、X-forworded-for注入(4)
05day_sql _基于client-ip、X-forworded-for注入(4)
HTTP_REMOTE_ADDR是不可控的除非是挂代理,所以不能控制HTTP_REMOTE_ADDR,我们便从第一排判断切入,发现CLIENT-IP是可控的,由此进行抓包分析,在包里面加上client-ip并给他赋值
05day_sql _基于client-ip、X-forworded-for注入(4)
此时如果是盲注的话就用order by 查询里面有多少个字段,然后进入注入

把此sql语句放在数据库中执行,发现有四个字段,而ip_address所在的第三个字段就是我们可以注入的点,所以在这里进行注入
05day_sql _基于client-ip、X-forworded-for注入(4)
05day_sql _基于client-ip、X-forworded-for注入(4)
05day_sql _基于client-ip、X-forworded-for注入(4)
然后在burp中进行验证
05day_sql _基于client-ip、X-forworded-for注入(4)

解决了client-ip,现在从X-forworded-for注入
方式与client-ip一样,但是要把client-ip改为X-forworded-for即可得出结果

05day_sql _基于client-ip、X-forworded-for注入(4)
只要是HTTP开头的都是可控的

如何避免sql注入就带入正则表达式,符合的话就返回结果。否则的话就不返回

//正则,返回$res,否则就没有含义啦
//匹配数字或者.,最少7次,最多15次 比如:1.1.1.1 就是七次;111.111.111.111就是15次
$res =  preg_match ( '/[\d\.]{7,15}/', $ip, $matches ) ? $matches [0] : '';
return  $res;

设置好正则后进行测试

05day_sql _基于client-ip、X-forworded-for注入(4)
05day_sql _基于client-ip、X-forworded-for注入(4)

由此可得,如果ip没有正则那么此处就存在注入

上一篇:PHP中获取来访者IP的方法


下一篇:071_C语言查找PC环境变量的状态以及值