代码审计之逻辑上传漏洞挖掘

0×00 前言



话说一个人的快乐,两个人分享就成为两份快乐,这个我看未必吧,倘若分享与被分享的两者之间是情敌关系,而分享者快乐的原因恰好是… 哈哈,不说了,都懂的;

BUT, 倘若一个技巧被分享出来,那么受益的人我坚信肯定远远不只两个,所以我们更应该学会的是–分享!

Today,简单说说漏洞挖掘中由逻辑缺陷造成的文件上传漏洞。

Tips:传统的MIME验证、客户端js验证、黑名单验证、解析漏洞等这些都比较简单,不在我们讨论的范围内。

0×01 程序员对某些常用函数的错误认识



这些函数有:empty()、isset()、strpos()、rename()等,如下面的代码(摘自用友ICC软件):

if($operateId == 1){
    $date = date("Ymd");
    $dest = $CONFIG->basePath."data/files/".$date."/";
    $COMMON->createDir($dest);
    //if (!is_dir($dest))   mkdir($dest, 0777);
    $nameExt = strtolower($COMMON->getFileExtName($_FILES[‘Filedata‘][‘name‘]));
    $allowedType = array(‘jpg‘, ‘gif‘, ‘bmp‘, ‘png‘, ‘jpeg‘);
    if(!in_array($nameExt, $allowedType)){
        $msg = 0;
    }
    if(empty($msg)){
        $filename = getmicrotime().‘.‘.$nameExt;
        $file_url = urlencode($CONFIG->baseUrl.‘data/files/‘.$date."/".$filename);
        $filename = $dest.$filename;
        if(empty($_FILES[‘Filedata‘][‘error‘])){
            move_uploaded_file($_FILES[‘Filedata‘][‘tmp_name‘],$filename);
        }
        if (file_exists($filename)){
            //$msg = 1;
            $msg = $file_url;
            @chmod($filename, 0444);
        }else{
            $msg = 0;
        }
    }
    $outMsg = "fileUrl=".$msg;
    $_SESSION["eoutmsg"] = $outMsg;
    exit;
}

我们来看上面的这段代码,要想文件成功的上传, if(empty($msg)) 必须为True才能进入if的分支,接下来我们来看empty函数何时返回True,看看PHP Manual怎么说,如图

很明显,””、0、”0″、NULL、FALSE、array()、var $var; 以及没有任何属性的对象都将被认为是空的,如果var为空,则返回True。 非常好,接下来我们往回看,有这样的几行代码

$allowedType = array(‘jpg‘, ‘gif‘, ‘bmp‘, ‘png‘, ‘jpeg‘);
if(!in_array($nameExt, $allowedType)){
    $msg = 0;
}

看见没有,即使我们上传类似shell.php的文件,虽然程序的安全检查把$msg赋值为0,经empty($msg)后,仍然返回True,于是我们利用这个逻辑缺陷即可成功的上传shell.php。

具体详见漏洞案例:

http://www.wooyun.org/bugs/wooyun-2010-04685

0×02 程序员对某些常用函数的错误使用



这些函数有iconv()、copy()等,如下面的这段代码(摘自SiteStar)

public function img_create(){
     $file_info =& ParamHolder::get(‘img_name‘, array(), PS_FILES);
     if($file_info[‘error‘] > 0){
         Notice::set(‘mod_marquee/msg‘, __(‘Invalid post file data!‘));
         Content::redirect(Html::uriquery(‘mod_tool‘, ‘upload_img‘));
     }
     if(!preg_match(‘/\.(‘.PIC_ALLOW_EXT.‘)$/i‘, $file_info["name"])){
         Notice::set(‘mod_marquee/msg‘, __(‘File type error!‘));
         Content::redirect(Html::uriquery(‘mod_marquee‘, ‘upload_img‘));
     }
     if(file_exists(ROOT.‘/upload/image/‘.$file_info["name"])){
         $file_info["name"] = Toolkit::randomStr(8).strrchr($file_info["name"],".");
     }
     if(!$this->_savelinkimg($file_info)){
         Notice::set(‘mod_marquee/msg‘, __(‘Link image upload failed!‘));
         Content::redirect(Html::uriquery(‘mod_marquee‘, ‘upload_img‘));
      }
      //...
 }
private function _savelinkimg($struct_file){
    $struct_file[‘name‘] = iconv("UTF-8", "gb2312", $struct_file[‘name‘]);
    move_uploaded_file($struct_file[‘tmp_name‘], ROOT.‘/upload/image/‘.$struct_file[‘name‘]);
    return ParamParser::fire_virus(ROOT.‘/upload/image/‘.$struct_file[‘name‘]);
}

我们再来看看这段代码, img_create()函数的逻辑非常严密,安全检查做的很到位。然而问题出在了_savelinkimg()函数,即在保存文件的前面程序员错误的使 用了iconv()函数,并且文件名经过了此函数,为什么是错用了呢?因为啊 iconv函数在转码过程中,可能存在字符串截断的问题:

在iconv转码的过程中,utf->gb2312(其他部分编码之间转换同样存在这个问题)会导致字符串被截断,如:$filename="shell.php(hex).jpg";(hex为0×80-0×99),经过iconv转码后会变成$filename="shell.php ";

所以,经过iconv 后$struct_file[‘name‘])为shell.php,于是我们利用这个逻辑缺陷可以成功的上传shell.php(前提是上传的文件名为shell.php{%80-%99}.jpg)。

具体详见漏洞案例:

http://www.wooyun.org/bugs/wooyun-2010-048293

0×03 历史经典漏洞再次爆发



条件竞争漏洞,这类历史经典漏洞在逐渐淡出人们视线的时候,再次爆发..

接着看下面这段代码(摘自某VPN系统)

<?
if($_POST[‘realfile‘]){
    copy($_POST[‘realfile‘],$_POST[‘path‘]);
}
$file = mb_convert_encoding($_POST[file],"GBK","UTF-8");
header("Pragma:");
header("Cache-Control:");
header("Content-type:application/octet-stream");
header("Content-Length:".filesize($_POST[path]));
header("Content-Disposition:attachment;filename=\"$file\"");
readfile($_POST[path]);
if($_POST[‘realfile‘]){
    unlink($_POST["path"]);
}
?>

上述代码的逻辑表面上看起来是这样的(对于攻击者来说):

利用copy函数,将realfile生成shell.php-→删除掉shell.php

这样初看起来没办法利用,但是仔细一想, 这段代码其实是存在逻辑问题的,所以我们可以利用这个逻辑缺陷达到GetShell的目的。

具体利用方法:

copy成temp.php–>不断访问temp.php->temp.php生成shell.php->删除temp.php

具体详见漏洞案例:

http://www.wooyun.org/bugs/wooyun-2010-048202

http://www.wooyun.org/bugs/wooyun-2010-049794

时间: 2024-10-05 10:52:36

代码审计之逻辑上传漏洞挖掘的相关文章

2020/1/30 PHP代码审计之文件上传漏洞

0x00 漏洞简介 文件上传漏洞是指用户上传了一个可执行的脚本文件,并通过此脚本文件获得了执行服务器端命令的能力.这种攻击是最为直接和有效的,"文件上传"本身是没有问题,有问题的是文件上传后,服务器怎么处理,解释文件.如果服务器的处理逻辑做的不够安全,则会导致严重的后果,. 0x01漏洞条件 文件可上传 知道文件上传的路径 上传文件可以被访问 上传文件可以被执行 0x02 挖掘思路 上传点都调用同一个上传类,直接全局搜索上传函数 黑盒寻找上传点,代码定位. 0x03 写一个上传 我们先

php代码审计8审计文件上传漏洞

文件上传漏洞是指用户上传了一个可执行的脚步文件,并通过此脚本文件获得了执行服务器端命令的能力,这种攻击方式是最直接和有效的,文件上传本身是没问题的,有问题的是文件上传后,服务器怎么处理,解释文件,通过服务器的处理逻辑做的不够安全,则会导致严重后果 漏洞条件:文件可上传--知道文件上传路径--上传文件可以被访问--上传文件可以被执行 文件上传可控点:Content-Length,即上传内容大小MAX_FILE-SIZE,即上传内容的最大长度filename,即上传文件名Content-Type,即

小白日记38:kali渗透测试之Web渗透-手动漏洞挖掘(三)-文件上传漏洞

手动漏洞挖掘 文件上传漏洞[经典漏洞,本身为一个功能,根源:对上传文件的过滤机制不严谨] <?php echo shell_exec($_GET['cmd']);?> 直接上传webshell 修改文件类型上传webshell 文件头,扩展名 修改扩展名上传webshell 静态解析文件扩展名时可能无法执行 文件头让偶过滤上传webshell 上传目录权限 正常上传 当可以上传一个页面文件或一句话木马等时,则可验证存在该漏洞 #低安全级别 绕过:可截包重放,修改上传文件大小等限制 #中等级别

文件上传漏洞攻击与防御

前言 从一年前开始学习web安全以来,一直都是在吸收零碎的知识,不断地看书与一些前辈的文章,中间也经过一些实践,学习相关的工具,但是却没真真正正地在脑中形成一套完整的体系.从不久前就想着要写一些博客,趁着这个机会,便好好梳理一下所学的知识,只是这些文章所写大部分内容也是搬运前辈的文章,鲜有自己所想所悟. 关于文件上传漏洞,百度一下便有许多文章出来,在这里我也稍稍做整理. 0x00 文件上传漏洞所需满足的条件 一是文件可上传(感觉这一句是废话).二是上传文件路径可知,如果路径不可知就没法访问,亦无

PHP任意文件上传漏洞CVE-2015-2348浅析

昨晚安全新闻爆出一个“PHP任意文件上传漏洞”,CVE编号为:CVE-2015-2348. 当时楼主正准备收拾东西回家,看到这个新闻心里一惊:失传江湖多年的0字符截断上传漏洞又重现了?而且还影响这么多版本!如果漏洞属实,看来今晚又要通宵打补丁了啊. 不过经过简单分析后,发现漏洞的利用条件相当苛刻(很多人好奇到底有多苛刻),楼主简单记录自己的分析过程和大家分享一下,如有不当,请多多指正. 一.漏洞概述 漏洞报告者说php的上传函数 move_uploaded_file的目的路径参数可以使用空字符截

文件上传漏洞及解析漏洞总结

文件上传漏洞是指用户上传了一个可执行的脚本文件,并通过此脚本文件获得了执行服务器端命令的能力.这种攻击方式是最为直接和有效的,"文件上传"本身没有问题,有问题的是文件上传后,服务器怎么处理.解释文件.如果服务器的处理逻辑做的不够安全,则会导致严重的后果. 文件上传后导致的常见安全问题一般有: 1)上传文件是Web脚本语言,服务器的Web容器解释并执行了用户上传的脚本,导致代码执行. 2)上传文件是Flash的策略文件crossdomain.xml,黑客用以控制Flash在该域下的行为(

【渗透课程】第六篇-上传漏洞之解析漏洞

上传漏洞,我们为什么要上传?因为我们说过.在网站服务器上 肯定有一个Web容器,它里面装的就是Web应用程序 .某些脚本具有一定的执行和修改权限.这些权限可以说是服务器给客户端访问时提供的服务的同时提供的, 提供服务越多, 存在漏洞的几率就越大. 如果我们上传了某个具有对系统进行操作性权限的文件(一句话木马,大马,bat,dll等),那对于我们接下去的攻击提供了很大的方便. 上面这些我就不多说了 ,之前也讲过了.回归正题, 我们这篇要说的是: 解析漏洞 在这里我先说一个知识点吧,相信很多人都听说

DVWA系列之24 high级别上传漏洞

最后再来分析high级别的代码: 这里首先有一条语句需要理解: $uploaded_ext = substr($uploaded_name, strrpos($uploaded_name, '.') + 1); 在这条语句里,首先利用strrpos() 函数来查找"."在变量$uploaded_name中出现的位置,然后将得到的数值加1,最后利用substr()函数从变量$uploaded_name的指定位置截取部分字符串. 总之,这条语句的作用就是从我们所上传的文件名中截取出扩展名部

【Web安全】文件上传漏洞原理分析

0x01 文件上传漏洞简介 为了让用户将文件上传到网站,就像是给危机服务器的恶意用户打开了另一扇门.即便如此,在今天的现代互联网的Web应用程序,它是一种常见的要求,因为它有助于提高业务效率.企业支持门户,给用户各企业员工有效地共享文件.允许用户上传图片,视频,头像和许多其他类型的文件.向用户提供的功能越多,Web应用受到攻击的风险和机会就越大,这种功能会被恶意用户利用,获得到一个特定网站的权限,或危及服务器的可能性是非常高的.上传文件本身没有错,问题与漏洞在于服务器怎么处理上传的文件. 0x0