代码文本
<?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);
?>
分析
而HTTP_REMOTE_ADDR
是不可控的除非是挂代理,所以不能控制HTTP_REMOTE_ADDR
,我们便从第一排判断切入,发现CLIENT-IP
是可控的,由此进行抓包分析,在包里面加上client-ip
并给他赋值
此时如果是盲注的话就用order by
查询里面有多少个字段,然后进入注入
把此sql语句放在数据库中执行,发现有四个字段,而ip_address所在的第三个字段就是我们可以注入的点,所以在这里进行注入
然后在burp中进行验证
解决了client-ip,现在从X-forworded-for注入
方式与client-ip一样,但是要把client-ip改为X-forworded-for即可得出结果
只要是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;
设置好正则后进行测试