BlueCMS是一款专注于地方门户网站建设解决方案,基于PHP+MySQL的技术开发,全部源码开放。
复现版本为bluecmsv1.6版本,各位可自行下载。
先使用Seay工具审计一波,根据关键代码回溯。
工具显示comment.php获取ip地址可伪造,我们打开代码所在php文件进一步查看。
关键代码:
$sql = "INSERT INTO ".table('comment')." (com_id, post_id, user_id, type, mood, content, pub_date, ip, is_check)
VALUES ('', '$id', '$user_id', '$type', '$mood', '$content', '$timestamp', '".getip()."', '$is_check')";
$db->query($sql);
我们可以看到ip值通过getip()函数直接获取,带入sql语句执行。
去到getip()函数处,没有过滤,可进行伪造。
function getip()
{
if (getenv('HTTP_CLIENT_IP'))
{
$ip = getenv('HTTP_CLIENT_IP');
}
elseif (getenv('HTTP_X_FORWARDED_FOR'))
{
$ip = getenv('HTTP_X_FORWARDED_FOR');
}
elseif (getenv('HTTP_X_FORWARDED'))
{
$ip = getenv('HTTP_X_FORWARDED');
}
elseif (getenv('HTTP_FORWARDED_FOR'))
{
$ip = getenv('HTTP_FORWARDED_FOR');
}
elseif (getenv('HTTP_FORWARDED'))
{
$ip = getenv('HTTP_FORWARDED');
}
else
{
$ip = $_SERVER['REMOTE_ADDR'];
}
return $ip;
}
漏洞出现在新闻的评论处,后台发表一个新闻,注册一个用户去评论。
使用burp抓包,发送到repeater模块。
修改一下源代码,让sql语句显示出来,我们好分析。
$sql = "INSERT INTO ".table('comment')." (com_id, post_id, user_id, type, mood, content, pub_date, ip, is_check)
VALUES ('', '$id', '$user_id', '$type', '$mood', '$content', '$timestamp', '".getip()."', '$is_check')";
$db->query($sql);
echo $sql;
exit();
正常go一下,查看返回的sql语句。
尝试伪造一下ip,查看返回的sql语句。
CLIENT-IP: 8.8.8.8