upload-labs是一个和sqli-labs类似的靶场平台,只不过是一个专门学习文件上传的。整理的很好,虽然并不能将服务器解析漏洞考虑进去,但毕竟一个靶场不可能多个web容器吧,关键是思路很重要,github地址:https://github.com/c0ny1/upload-labs
感觉这个思路图做的很好,测试的时候大体流程可以按照这个来,同时将服务器特性以及中间件的解析漏洞考虑进去就差不多了。
开始做题,同时看下后台的实现代码对代码审计也很有帮助的。
第一关是一个前端校验,第二关是服务器端对content-type的一个判断,由于个人习惯,我一般都是在本地写一个一句话木马后文件名改为jpg之类的,直接上传(这个时候content-type是图片格式),抓包将文件名后最改为.php脚本后缀,所有能通过绕过这两关。
第三关是服务器端对文件后缀的黑名单校验(后面的关卡中不特殊说明默认都是服务器端校验)。先看下代码:
采用的黑名单,php的话有时候(配置的原因)php、php3、php4、php5、phtml、pht这些后缀也是可以被解析的,其他语音也有类似的情况,需要尝试:
由于我这里使用的是phpstudy+windows,所以复现不了(由于配置原因是解析不了php3等等这些后缀的)。
第四关:上传php文件显示不合法,然后上传了个aaa后缀的可以,说明还是使用的黑名单。看下源码可以发现基本上将所有非法的脚本后缀就禁用了
但是没有禁用.htaccess,可以通过上传.htaccess文件然后将该文件夹下的所有例如.jgp的文件都按照脚本语言解析,详细信息可以问度娘,上传如下内容的.htaccess文件
意思是将该文件夹下的one.jpg文件按照php格式去解析,然后再上传一个文件名是one.jpg内容是一句话木马的文件,然后访问,可以执行代码。
第五关:将.htaccess后缀也禁止了,但是相比第四关,没有将文件后缀置换成小写,所有可以通过大小写绕过
第六关:依然是黑名单,但这次程序没有对文件后缀去空(其实如果程序没有对文件进行重命名的话,可以借one.php .jpg绕过白名单的)
上传一个php文件,抓包将文件名后缀加上空格,如下图
可以发现windows下保持文件时会自动将空格去除
第七关和第六关类似,利用windows特性,会自动去掉后缀名中最后的”.”,可在后缀名中加”.”绕过,所以
这里访问的时候是可以不要.的,存在windows下的时候也是没有.的
第八关;老实说第八关这个绕过方式我之前是不知道的,就是在php+windows的情况下:如果文件名+"::$DATA"会把::$DATA之后的数据当成文件流处理,不会检测后缀名.且保持"::$DATA"之前的文件名。
可以看到在服务器中保存的文件还是以php结尾的,访问该文件即可。具体原理参考这篇文章(https://xz.aliyun.com/t/2539)
第九关:这关算是一个逻辑漏洞吧
程序先是去除文件名前后的空格,再去除文件名最后所有的.,再通过strrchar来寻找.来确认文件名的后缀,但是最后保存文件的时候没有重命名而使用的原始的文件名,导致可以利用类似one.php. .(两个点号之间有一个空格)绕过,如果重名名了文件的话应该会用$file_ext来进行拼凑文件,这样保存在服务器中的文件将没有后缀(去除了.空格)
第十关:
看代码可以发现程序将所有脚本后缀名都替换为空了,但是可以利用.phphpp这样,去除中间的php后再一次组成了.php。
第十一关:白名单校验
这关考验的是一个00截断的漏洞,当有php环境中有两个截断条件: 1.php版本小于5.3.4 详情关注CVE-2006-7243 2.php的magic_quotes_gpc为OFF状态
给请求中会自动将%00进行url解码,在后台进行拼凑的时候会自动阶段后面的字符串
于是存在服务器中的文件是这样的
第十二关:也是00截断,只不过由于文件路径这个参数是通过post请求发送的,需要抓包后再hex中修改
第十三、十四关、十五关、十六关:
都是利用copy one.jpg /b + one.php /a one.jpg 制作图片马后上传,再结合文件包含漏洞使用,没什么好说的。
十三关是对比文件的前两个字节
十四关是用了getimagesize
函数来对文件类型做判断
十五关是用的exif_imagetype
函数
十六关是用的二次渲染
第十七关:
可以看到并没有对文件名的后缀做任何校验,但是上传后会改名并马上删除该文件,需要用到并发漏洞(网上都喜欢叫条件竞争)。可以正常上传php文件,抓包后放入intruder模块中选择发送多次,然后在浏览器中访问就好了,在就算程序会对文件名改名也没关系的,直接访问原文件名就好了(one.php)
第十八关:
也是考验竞争条件的问题,由于程序对文件后缀做了白名单校验,所以只能是上传图片木马然后用文件包含。
第十九关:
利用CVE-2015-2348这个漏洞也是00截断的问题,由于也是需要在低版本的php中就不演示了
------------------------------------------------------------------2019.2.27 补充 -------------------------------------------------------------
php中的%00截断 PHP<5.3.29,且GPC关闭 两个条件缺一不可
但当%00截断不能用时,也可以使用zip协议 参考文章https://www.cnblogs.com/milantgh/p/5293628.html 我有时间再补上实例吧
最后我再自己补上各中间件的解析漏洞吧
iis5.x iis6.0
1. 如果能创建文件夹的话,创建xx.asp文件夹,那么该文件夹下的所有文件都会按asp格式去解析,在该文件夹下上传evil.jpg 访问www.xxx.com/xx.asp/evil.jpg 执行代码
2. 直接上传evil.asp;.jpg文件绕过黑白名单校验,访问www.xxx.com/evil.asp;.jpg时iis会按照asp文件去解析
IIS 5.x/6.0在从文件路径中读取文件后缀时,遇到一个“.”后,便进入了一种截断状态,在该状态下遇到特殊符号——“/”和“;”,都会进行截断,只保留特殊符号前的部分,即:“.asp”,从而认为文件后缀为“.asp”。
IIS 7.0/IIS 7.5/ Nginx <8.03畸形解析漏洞:
在默认Fast-CGI开启状况下,黑阔上传一个名字为evil.jpg,内容为 <?PHP fputs(fopen('shell.php','w'),'<?php eval($_POST[cmd])?>');?> 的文件,
然后访问evil.jpg/.php,在这个目录下就会生成一句话木马 shell.php
要验证是否有漏洞很简单,只需访问分别访问robots.txt和robots.txt/1.php就可以了,前者返回正常后者返回不正常说明有漏洞。
Nginx <8.03 空字节代码执行漏洞 影响版:0.5.,0.6., 0.7 <= 0.7.65, 0.8 <= 0.8.37
Nginx在图片中嵌入PHP代码然后通过访问 evil.jpg%00.php 来执行其中的代码
Apache解析漏洞 :
Apache 是从右到左开始判断解析,如果为不可识别解析,就再往左判断. 比如 evil.php.owf.rar “.owf”和”.rar” 这两种后缀是apache不可识别解析,apache就会把wooyun.php.owf.rar解析成php.
如何判断是不是合法的后缀就是这个漏洞的利用关键,测试时可以尝试上传一个evil.php.rara.jpg.png…(把你知道的常见后缀都写上…)去测试是否是合法后缀
------------------------再补上一种特殊情况--------------
双文件并发上传
另附一篇不错的文章 https://www.cnblogs.com/shellr00t/p/6426945.html