欢迎来到 黑吧安全网 聚焦网络安全前沿资讯,精华内容,交流技术心得!

解决SSRF导致命令执行可反弹Shell漏洞

来源:本站整理 作者:佚名 时间:2016-07-09 TAG: 我要投稿

 迅雷官方论坛(discuz)被乌云平台检测出一个SSRF漏洞,攻击者通过SSRF成功反弹shell,漏洞存在于一个远程图片下载的接口,没有对url进行有效的合法性检测。今天临时解决了这个漏洞,记录一下修复方法。

ssrf
 
 
漏洞还没有公开,现在是凭密码才能访问。
 
这个存在漏洞的url地址是http://bbs.demo.com//forum.php?mod=ajax&action=downremoteimg&message=
 
攻击者请求这个地址即可进行SSRF攻击:
 
http://bbs.demo.com//forum.php?mod=ajax&action=downremoteimg&message=
 
这里message包含用户在论坛发布的图片地址,正常情况下是图片格式后缀,虽然对后缀进行了判断,但是判断不严格,这个地址可以传任意的脚本。
 
解决办法是在接口增加合法性判断,判断url真实的后缀是否合法,即使合法,也可能通过url rewrite方式伪造,更严格的判断通过curl请求获取头信息,根据返回的报文头判断Content-Type是否合法。
 
于是,在文件/source/module/forum/forum_ajax.php文件新增以下几个函数:
 
PHP
 
//获取上传图片url列表
function getImageList($temp)
{
    $urlList = array();
    foreach ($temp as $item) {
        $urlList[] = $item[1];
    }
    return $urlList;
}
 
/**
 * 检查content-type是否合法
 * @param $imageList array 图片url列表
 * @return bool true合法 false非法
 */
function checkContentType($imageList)
{
    $allowExtensions = array('jpg', 'jpeg', 'png', 'gif', 'bmp');
    $allowTypes = array('image/png', 'image/x-png', 'image/gif', 'image/jpeg', 'image/pjpeg');
    foreach ($imageList as $url) {
        $extension = getUrlExtension($url);
        if(!in_array(strtolower($extension), $allowExtensions)){
            return false;
        }
        $contentType = getContentType($url);
        if (!in_array($contentType, $allowTypes)) {
            return false;
        }
    }
    return true;
}
 
//获取content-type
function getContentType($url)
{
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_HEADER, 1);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
    curl_setopt($ch, CURLOPT_NOBODY, 1);
    curl_exec($ch);
    $contentType = curl_getinfo($ch, CURLINFO_CONTENT_TYPE);
    return $contentType;
}
 
//获取url后缀
function getUrlExtension($url)
{
    $parseurl = parse_url($url);
    $extension = pathinfo($parseurl['path'], PATHINFO_EXTENSION);
    return $extension;
}
 
//获取上传图片url列表
function getImageList($temp)
{
    $urlList = array();
    foreach ($temp as $item) {
        $urlList[] = $item[1];
    }
    return $urlList;
}
 
/**
 * 检查content-type是否合法
 * @param $imageList array 图片url列表
 * @return bool true合法 false非法
 */
function checkContentType($imageList)
{
    $allowExtensions = array('jpg', 'jpeg', 'png', 'gif', 'bmp');
    $allowTypes = array('image/png', 'image/x-png', 'image/gif', 'image/jpeg', 'image/pjpeg');
    foreach ($imageList as $url) {
        $extension = getUrlExtension($url);
        if(!in_array(strtolower($extension), $allowExtensions)){
            return false;
        }
        $contentType = getContentType($url);
        if (!in_array($contentType, $allowTypes)) {

[1] [2] [3]  下一页

【声明】:黑吧安全网(http://www.myhack58.com)登载此文出于传递更多信息之目的,并不代表本站赞同其观点和对其真实性负责,仅适于网络安全技术爱好者学习研究使用,学习中请遵循国家相关法律法规。如有问题请联系我们,联系邮箱admin@myhack58.com,我们会在最短的时间内进行处理。
  • 最新更新
    • 相关阅读
      • 本类热门
        • 最近下载