php 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=[img]http://tv.phpinfo.me/exp.php?s=ftp%26ip=127.0.0.1%26port=6379%26data=helo.jpg[/img]

这里message参数传的是用户在论坛发布的图片地址,正常情况下是图片格式后缀,虽然程序有对后缀进行了判断,但是判断不严格,只需要通过在url加图片后缀就可以蒙混过去。

解决办法是修改对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;
}

在具体接口处理的地方新增:

//检测图片是否合法 Added by tanteng<tanteng@xunlei.com> 2016.07.07
if(is_array($temp) && !empty($temp)){
   $imageList = getImageList($temp);
   $check = checkContentType($imageList);
   if ($check === false) {
       die('file upload error!');
   }
}
首先判断文件后缀是否合法,再通过curl请求判断header的Content-Type是否合法,因为后者不容易伪造。其中curl判断文件Content-Type方法:

PHP

//获取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传入非法格式的文件,程序不再继续执行。

不过,这样做有一个问题,有的图片地址并不是真实的静态文件,如:http://image.demo.com/avatar/100/150*150,这个路径就是一个图片,尽管不是图片格式的静态路径,那么这样判断就会误判,不过这种情况是很少数,暂且不管。

时间: 2024-10-26 01:08:49

php ssrf漏洞修复代码的相关文章

Linux下ImageMagick远程代码执行漏洞修复

漏洞描述:   ImageMagick是一款广泛流行的图像处理软件.近日,该软件被爆出存在远程代码执行漏洞,编号为CVE-2016–3714.此漏洞允许攻击者通过上传恶意构造的图像文件,在目标服务器执行任意代码.由于ImageMagick应用十分广泛,目前已确定Wordpress等知名应用受此漏洞影响.   影响范围:   ImageMagick <= 6.9.3-9   漏洞修复:     安装最新版本的软件   一.下载软件包:   cd /usr/local/src #进入软件包存放目录

我是如何在github企业版本上通过ssrf漏洞导致命令执行的?

本文讲的是我是如何在github企业版本上通过ssrf漏洞导致命令执行的?,在我上一篇文章中,我提到了以后攻击的新目标-github企业版,同样也提到了如何去除混淆的ruby代码,并在其中寻找sql注入.再次之后,我就开始阅读很多大牛挖掘github企业版的思路 通过这些挖掘思路,我非常懊恼当时为啥我没挖到这些洞,因此我决定自己挖到一个很高危的漏洞. 漏洞 在我检查github企业版本的架构时,我的知觉告诉我在这个系统内部一定有很多服务,如果我能够访问到这些服务,那么可能会发现很多有趣的东西.

glibc gethostbyname 缓冲区溢出漏洞 修复建议

包括Linux不支持在线升级替换内核在内, 还有这个CASE, 还是不如AIX啊. http://www.ksyun.com/indexNotice/info/2015/2185.html#80b8ba67-599d-4f7d-a0e3-196dcc238f03 一.漏洞背景 代码审计公司Qualys的研究人员在glibc库中的__nss_hostname_digits_dots()函数中发现了一个缓冲区溢出的漏洞,这个bug可以经过gethostbyname*()函数被本地或者远程的触发. 1

利用SSRF漏洞滥用AWS元数据服务

本文讲的是利用SSRF漏洞滥用AWS元数据服务,我最近在一个小型玩具项目上工作,是在Docker容器中执行不信任的Python代码.我测试了几个在线的代码执行引擎,想看看它们对各种攻击的反应.在我这样做的时候,我发现Qualified开发的代码执行引擎中有几个有趣的漏洞,这些漏洞已经被广泛使用,包括CodeWars或InterviewCake等网站.能够运行代码与网络访问的这两个组合以及在Amazon Web Services中运行的基础架构使得我可以在本文中展示一些非常有趣的漏洞. 首先介绍一

Java反射库中的安全漏洞修复

安全组织Security Explorations发现了Java 7u25中的一个安全漏洞,通过这个漏洞攻击者可以完全摆脱Java沙箱.Oracle在更新的7u40中包含了一个补丁,但是据Security Explorations 在今年早些时候声称,这个补丁仅仅在理念上对其进行了修正,对代码稍加修改之后,依然可以利用这个漏洞.另外,随后的研究表明这个漏洞甚至比最初报道的更加严重.在这个问题公开之后,Oracle发布了一个补丁,作为8u77的一部分. 这个漏洞可以在新的反射库中找到,该库从Jav

Jsp万能密码漏洞修复例子

如果网站出现这种"万能密码"漏洞该怎么办呢 'or'='or' 漏洞修复 方法有很多在这里介绍两种,咱们使用第2种 方法1: Replace过滤字符 解决方法:查找login.asp下的  代码如下 复制代码 username=request.Form("name") pass=request.Form("pass") 修改为:  代码如下 复制代码 username=Replace(request.Form("name"),

360漏洞修复在哪

360漏洞修复在哪   360漏洞修复这里是特指您的Windows操作系统在逻辑设计上的缺陷或在编写时产生的错误. 2.为什么要修补修通漏洞? 系统漏洞可以被不法者或者电脑黑客利用,通过植入木马.病毒等方式来攻击或控制整个电脑,从而窃取您电脑中的重要资料和信息,甚至破坏您的系统. 3.如何修复? 根据界面提示查看是否有需要修补的漏洞,如需修复点击"立即修复".          相关知识:360安全卫士ctrl快捷搜索怎么禁止  手机软件教程 手机技巧 电脑教程

360安全卫士领航版自动漏洞修复功能怎么关闭

  360安全卫士领航版自动漏洞修复功能怎么关闭 1.打开360安全卫士领航版; 2.选择360安全卫士软件界面右上角的三角按钮,选择:设置(如下图); 3.选择:弹窗设置下的:漏洞修复方式; 4.将默认设置:无需提醒,直接自动修复,改成自己需要的方式,如:关闭安全提醒,不修复!

360自动漏洞修复怎么关闭

  关闭360自动漏洞修复功能的方法 1.打开360安全卫士,本次演示的软件为360安全卫士领航版; 2.选择360安全卫士软件界面右上角的三角按钮,选择:设置(如下图); 3.选择:弹窗设置下的:漏洞修复方式; 4.将默认设置:无需提醒,直接自动修复,改成自己需要的方式,如:关闭安全提醒,不修复!