实战 | 文件上传漏洞之最全代码检测绕过总结

优采云 发布时间: 2022-08-13 23:23

  实战 | 文件上传漏洞之最全代码检测绕过总结

  文件上传漏洞漏洞介绍

  文件上传漏洞是指攻击者上传了一个可执行的脚本文件,并通过此脚本文件获得了执行服务端命令的能力。该漏洞在业务应用系统中出现概率较高,究其原因是业务场景中上传附件、头像等功能非常常见,若在系统设计中忽略了相关的安全检查,则容易导致文件上传漏洞。

  业务应用系统中的文件上传功能是导致上传漏洞的重要安全隐患之一。通过文件上传功能,用户可以直接将本地文件上传到服务端,若通过构造URL地址可以直接访问到已上传的文件,则会触发漏洞。例如,若上传的文件是一个非正常服务端文件,如JSP文件、ASP文件、ASPX文件、JSPX文件、PHP文件等可直接执行服务后端代码的文件,则该文件实际可视为“木马文件”。

  程序开发中不严格或不安全的逻辑问题会导致文件上传漏洞,程序开发所使用的编程语言以及版本、所用的操作系统,以及不同的应用场景也可能导致文件上传漏洞,所以文件上传漏洞的表现形式与其成因息息相关。

  借助文件上传漏洞,攻击者可以获取业务信息系统的WebShell,进一步通过WebShell对该业务系统以及服务器自身的操作系统进行操作,如增加、删除、修改、查看文件等敏感操作。因此相较于其它文件类型的漏洞,文件上传漏洞的危害更大。

  产生原因

  一些web应用程序中允许上传图片,文本或者其他资源到指定的位置,文件上传漏洞就是利用这些可以上传的地方将恶意代码植入到服务器中,再通过 URL 去 访问以执行代码。

  造成文件上传漏洞的原因是:

  •服务器配置不当•开源编辑器上传漏洞•本地文件上传限制被绕过•过滤不严格被绕过•文件解析漏洞导致文件执行•文件路径截断

  漏洞危害

  •上传文件是web脚本语言,服务器的web容器解释并执行了用户上传的脚本,导致代码执行。•上传文件是病毒或者木马时,主要用于诱骗用户或者管理员下载执行或者直接 自劢运行;•上传文件是Flash的策略文件 crossdomain.xml,黑客用以控制Flash在该域 下的行为(其他通过类似方式控制策略文件的情况类似);•上传文件是病毒、木马文件,黑客用以诱骗用户或者管理员下载执行;•上传文件是钓鱼图片或为包含了脚本的图片,在某些版本的浏览器中会被作为脚本执行,被用于钓鱼和欺诈。除此之外,还有一些不常见的利用方法,比如将上传文件作为一个入口,溢 出服务器的后台处理程序,如图片解析模块;或者上传一个合法的文本文件,其内容包含了PHP脚本,再通过"本地文件包含漏洞(Local File Include)"执行此脚本。

  审计要点

  在代码审计中进行上传漏洞检查时,首先需要判断上传功能的代码是否对上传的文件进行了校验,如果没有任何校验即存在任意文件上传漏洞,但危险程度仍需进一步判断。(需要检查此处上传的文件是在本地还是在远端,是否存在脚本执行权限或环境支持等,现在很多程序会将附件上传到远端的OSS对象中存储。)

  如果代码具有文件校验功能,接下来则需要验证文件校验代码是否完善,可以分别从前端和后端两个方面分析校验的完整性。

  •前端校验:主要是分析JavaScript对上传文件的后缀名进行校验的完整性•后端校验:主要是分析黑名单扩展名拦截、白名单扩展名拦截、HTTP Header的Content-Typ验证、文件头验证、二次渲染验证和文件名随机化等几个校验方法的完整性。

  总结审计要点:寻找上传点,检查后缀名是否可自定义,若设置防御,是否可绕过;文件内容是否有校验,校验是否可绕过;是否检查了文件类型;文件上传路径是否可控;文件目录是否要求禁止脚本解析等。

  image-230584防御建议

  前端防御主要采用前端校验,利用JavaScript对文件大小、扩展名等进行检验。后端校验是防御的核心,主要是禁止对上传的文件目录进行解析,上传的文件随机且检查后缀名,设置文件后缀白名单(在使用PHP的in_array函数进行后缀名检测时,要注意设置此函数的第三个参数为true,不然可通过此函数缺陷绕过检测),对文件内容、大小和类型进行检测等。

  实验靶场备注:

  接下来使用的靶场是c0ny1大大做的upload_labs,我在当时下的是老版本的,只有20关。新版本有21关,插入了一个新的Pass-5,使用的解法是上传.user.ini,这个解法我在这里使用的是SUCTF的Web题。

  靶场项目地址:

  客户端检验绕过

  一般都是在网页上写一段 javascript 脚本,校验上传文件的后缀名,有白名单形式也有黑名单形式。判断方式:在浏览加载文件,但还未点击上传按钮时便弹出对话框,内容如:只允许上传.jpg/.jpeg/.png后缀名的文件,而此时并没有发送数据包。

  

  前端检测的绕过方法十分简单,这里就不详细展开讲解了。绕过方法有如下几种:

  1.通过火狐插件 NOscript 插件或者禁用 IE 中 JS 脚本;2.通过元素审查修改代码(如删除 onsubmit=”return checkFile()” 事件);3.通过元素审查 javascirpt 脚本中添加上传文件类型;4.通过利用 burp 抓包改包,先上传一个 png 类型的木马,然后通过 burp 将其改为asp/php/jsp 后缀名即可 注意:这里修改文件名字后,请求头中的 Content-Length 的值也要改(burp默认会自动修改)。

  靶场绕过示例

  靶场:Upload-labs(Pass-01)

  当我们想要上传Webshell时,发现前端弹出告警窗口

  PS:文章中的是本地解析的靶机,不是在线靶场哦!

  image-220484

  审计源代码,其中有一段JavaScript代码用于检测文件扩展名。

  <br />    function checkFile() {<br />        var file = document.getElementsByName('upload_file')[0].value;<br />        if (file == null || file == "") {<br />            alert("请选择要上传的文件!");<br />            return false;<br />        }<br />        //定义允许上传的文件类型<br />        var allow_ext = ".jpg|.png|.gif";<br />        //提取上传文件的类型<br />        var ext_name = file.substring(file.lastIndexOf("."));<br />        //判断上传文件类型是否允许上传<br />        if (allow_ext.indexOf(ext_name) == -1) {<br />            var errMsg = "该文件不允许上传,请上传" + allow_ext + "类型的文件,当前文件类型为:" + ext_name;<br />            alert(errMsg);<br />            return false;<br />        }<br />    }<br />

  绕过技巧:

  首先更改webshell的扩展名为.png,并启用Burp代理抓包

  image-228473

  将文件扩展名改回.php,放行即可

  image-225219

  审查页面元素,上传成功

  image-248432服务端黑名单检验绕过扩展名黑名单绕过

  黑名单检测:一般有个专门的 blacklist 文件,或者黑名单数组,里面会包含常见的危险脚本文件扩展名。

  绕过方法:

  •找黑名单扩展名的漏网之鱼:比如 iis6.0 中的 asa 和 cer•可能存在大小写绕过漏洞:比如 aSp(iis6.0 中可以)和 pHp(只能在 小于 php5.3.39 中的 linux 中)之中•能被web容器解析的文件其他扩展名列表:

  语言

  可解析后缀

  

  ASP/ASPX

  asp,aspx,asa,ascx,ashx,asmx,cer,cdx

  PHP

  php,php5,php4,php3,phtml,pht

  JSP

  jsp,jspx,jspa,jsw,jsv,jspf,jtml

  靶场绕过示例

  靶场:Upload-labs(Pass-03)

  当我们想要上传Webshell时,提示不允许上传.asp,.aspx,.php,.jsp后缀文件。

  image-255619

  审计源代码,其中一段使用in_array函数判断所上传文件的扩展名是否存在指定的扩展名黑名单中。

  $is_upload = false;<br />$msg = null;<br />if (isset($_POST['submit'])) {<br />    if (file_exists(UPLOAD_PATH)) {<br />        $deny_ext = array('.asp','.aspx','.php','.jsp');<br />        $file_name = trim($_FILES['upload_file']['name']);<br />        $file_name = deldot($file_name);//删除文件名末尾的点<br />        $file_ext = strrchr($file_name, '.');<br />        $file_ext = strtolower($file_ext); //转换为小写<br />        $file_ext = str_ireplace('::$DATA', '', $file_ext);//去除字符串::$DATA<br />        $file_ext = trim($file_ext); //收尾去空<br /><br />        if(!in_array($file_ext, $deny_ext)) {<br />            $temp_file = $_FILES['upload_file']['tmp_name'];<br />            $img_path = UPLOAD_PATH.'/'.date("YmdHis").rand(1000,9999).$file_ext;            <br />            if (move_uploaded_file($temp_file,$img_path)) {<br />                 $is_upload = true;<br />            } else {<br />                $msg = '上传出错!';<br />            }<br />        } else {<br />            $msg = '不允许上传.asp,.aspx,.php,.jsp后缀文件!';<br />        }<br />    } else {<br />        $msg = UPLOAD_PATH . '文件夹不存在,请手工创建!';<br />    }<br />}

  绕过技巧:

  我们可以尝试使用PHP的其它扩展名绕过,如phtml

  image-205949

  注:PHPStudy环境默认还是不会解析phtml、php3等扩展名文件的,若想让实验顺利成功,还需要在http.conf配置文件中手动添加

  image-208493上传.htaccess文件绕过

  .htaccess文件的作用:

  .htaccess是一个纯文本文件,它里面存放着Apache服务器配置相关的指令。

  .htaccess主要的作用有:URL重写、自定义错误页面、MIME类型配置以及访问权限控制等。主要体现在伪静态的应用、图片防盗链、自定义404错误页面、阻止/允许特定IP/IP段、目录浏览与主页、禁止访问指定文件类型、文件密码保护等。

  .htaccess的用途范围主要针对当前目录。

  启用.htaccess的配置:

  启用.htaccess,需要修改httpd.conf,启用AllowOverride,并可以用AllowOverride限制特定命令的使用。

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线