文件上传

最理想的情况当然是可以任意文件上传(这里忽略了前端的检验),然后服务端返回给我们上传文件的地址,这样就可以直接访问了。

文件后缀名检测

如果是基于黑名单的,可以产生尝试绕过黑名单;

还有一种方法是通过%00字节。攻击者手动修改上传过程的POST包,在文件名后添加一个%00字节,就可以截断某些函数对文件名的判断。因为在很多语言(如C、PHP)的常用的字符串处理函数中,0x00被认为是终止符。
比如说只认可JPG文件的应用,可以构造文件名(需要修改POST包)为xxx.php[\0].JPG,其中[\0]为十六进制的0x00字符。
.JPG绕过了应用的上传文件类型判断,但是对于服务器来说,此文件因为0字节截断的关系,最终会变为xxx.php

第三种方法是通过各种解析漏洞:
比如apache的:
在Apache1.x和2.x中,对文件名的解析是从后往前解析的,直到遇见一个Apache认识的文件类型为止。
Apache认识的文件类型被定义在Apache的mime.types中。
那么对于如下文件名:
Phpshell.php.rar.rar.rar.rar.rar
Apache并不认识rar这个文件类型,所以会一直遍历后缀到.php,然后认为这是一个PHP类型的文件。
而.rar又是一个合法的上传需求,在一些应用中可能只判断文件的后缀是否是.rar,这时用户上传的上述文件就有可能导致脚本被执行了。

再比如IIS的:
IIS 6在处理文件解析的时候也出现过类似漏洞,就如同之前的0x00截断一样。不过在IIS和Windows环境下阶段字符变为了分号“;”
如下文件名:
http://www.target.com/path/xyz.asp;abc.jpg
IIS 6会将此文件解析为abc.asp,文件名被截断了,从而导致脚本的执行。

IIS 6还曾经出现过一个漏洞:因为处理文件夹扩展名出错,导致将/*.asp/目录下的所有文件都作为ASP文件进行解析,比如:
http://www.target.com/path/xyz.asp/abc.jpg
这个abc.jpg会被当成ASP文件进行解析。

MIME类型检测

mime类型可以通过content-type进行控制
content-type有哪些

正常情况下,通过判断前10个字节,基本就能判断出一个文件的真实类型。

浏览器的MIME Sniff功能实际上也是通过读取文件的前256个字节来判断文件的类型。对此常用的攻击技巧是伪造一个合法的文件头,而将真实的PHP等脚本代码附在合法的文件头之后。但此时,仍需要通过PHP来解释此文件才行。

如何绕过上述两种检测:

通过.user.ini

php.ini是php的一个全局配置文件,对整个web服务起作用;而.user.ini和.htaccess一样是目录的配置文件,.user.ini就是用户自定义的一个php.ini,我们可以利用这个文件来构造后门和隐藏后门。

所以是.user.ini加一个图片马(假设可以上传图片)即可。



通过.htaccess

htaccess文件是Apache服务器中的一个配置文件,它负责相关目录下的网页配置。通过htaccess文件,可以帮我们实现:网页301重定向、自定义404错误页面、改变文件扩展名、允许/阻止特定的用户或者目录的访问、禁止目录列表、配置默认文档等功能。

.htaccess叫分布式配置文件,它提供了针对目录改变配置的方法——在一个特定的文档目录中放置一个包含一个或多个指令的文件, 以作用于此目录及其所有子目录。并且子目录中的指令会覆盖更高级目录或者主服务器配置文件中的指令。

因为只能上传jpg格式的文件,那么可以配合上传的htaccess文件,将jpg文件解析为php文件,过程如下:
先上传.htaccess文件:

AddType application/x-httpd-php .jpg                 //将.jpg后缀的文件解析成php

或者可以是:

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

再上传图片马:



直接访问图片马即可代码执行:



其实.htaccess文件也有如下两项,可以为需要在顶部或底部加载文件的文件夹服务:
php_value auto_prepend_file "/home/fdipzone/header.php"
php_value auto_append_file "/home/fdipzone/footer.php"

文件内容检测

比如说,在上面例子的基础上,对上传文件的内容有检测,不允许包含php字段,那么绕过方法就是短标签等:

<? echo '123';?>               //前提是开启配置参数short_open_tags=on
<?=(表达式)?>  等价于 <?php echo (表达式)?>             //不需要开启参数设置
<% echo '123';%>                              //前提是开启配置参数asp_tags=on
<script language=”php”>echo '123'; </script>                //不需要修改参数开关

不过第三种与第四种只能在php7.0以下使用。

继续内容过滤,过滤了[],可以换为{}

<?=eval($_GET{1});?>

反引号可以直接执行系统命令:

<?=`tac ../f*`?>

注意:PHP 支持一个执行运算符:反引号(``)。注意这不是单引号!PHP 将尝试将反引号中的内容作为 shell 命令来执行,并将其输出信息返回(即,可以赋给一个变量而不是简单地丢弃到标准输出)。使用反引号运算符的效果与函数 shell_exec()相同。但是,关闭了 shell_exec() 时反引号运算符是无效的。

文件上传与文件包含的结合

还是上头的例子,.user.ini文件没有问题,但是对图片马过滤较为严格,那么可以在图片马中进行文件包含:

<?=include"ph"."p://filter/convert.base64-encode/resource=../flag.p"."hp"?>

或者日志包含:

<?=include"/var/lo"."g/nginx/access.lo"."g"?>

文件头部检测

getimagesize(): 会对目标文件的16进制去进行一个读取,去读取头几个字符串是不是符合图片的要求。
几种文件头:

gif: GIF89a
jpg,jpeg: FF D8 FF
png: 89 50 4E 47 0D 0A

在上面的基础上,图片马的内容加一个文件头即可:



当然,.user.ini也要加:


Session文件包含的利用

这个场景是把文件内容中的.给过滤了,那么.user.ini中可以auto_append_file以下png这个图片马,这里没有.出现,但是图片马怎么构造才能没有.,就需要去包含session文件了。


然后进行条件竞争即可。

二次渲染

其实也是基于内容的检测
二次渲染绕过

gif的二次渲染:

找到二次渲染中没有变化的位置插入代码即可

png的二次渲染:

PNG定义了两种类型的数据块,一种是称为关键数据块(critical chunk),这是标准的数据块,另一种叫做辅助数据块(ancillary chunks),这是可选的数据块。关键数据块定义了3个标准数据块(IHDR,IDAT, IEND),每个PNG文件都必须包含它们。
第一种方法:写入PLTE数据块
php底层在对PLTE数据块验证的时候,主要进行了CRC校验.所以可以再chunk data域插入php代码,然后重新计算相应的crc值并修改即可。
第二种方法:写入IDAT数据块

jpg的二次渲染

用脚本对上传后再下载的图片进行处理,然后再上传。

防御

1、文件上传的目录设置为不可执行。很多上传应用中,文件上传后会放到独立的存储上,做静态文件处理。

2、判断文件类型时可以结合MIME Type以及后缀检查等方式;在文件类型检查中可以使用白名单。此外,对于图片的处理可以使用压缩函数或者resize函数,这样可以破坏图片中可能包含的HTML代码。

3、使用随机数改写文件名和文件路径。即能上传,但是难以访问,很大程度上增加了攻击的成本。

4、单独设置文件服务器的域名。这涉及到浏览器同源策略的问题。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 0x00 漏洞原理与危害 网站web应用程序都有一些文件上传功能,比如文档、图片、头像、视频上传,当上传功能的实现...
    Z1ng3r阅读 5,578评论 0 1
  • 参考:https://www.wlhhlc.top/posts/14827/#web155[https://www...
    一碗海鲜汤阅读 5,472评论 0 0
  • 前言: 实习工作以后,我才发现自己对于渗透测试还没形成自己的测试体系,对于一些常见的漏洞测试方法了解得不够全,更加...
    book4yi阅读 6,882评论 0 3
  • 我是黑夜里大雨纷飞的人啊 1 “又到一年六月,有人笑有人哭,有人欢乐有人忧愁,有人惊喜有人失落,有的觉得收获满满有...
    陌忘宇阅读 12,772评论 28 53
  • 人工智能是什么?什么是人工智能?人工智能是未来发展的必然趋势吗?以后人工智能技术真的能达到电影里机器人的智能水平吗...
    ZLLZ阅读 9,436评论 0 5

友情链接更多精彩内容