概述
漏洞产生原因:服务端代码未对客户端上传的文件进行严格的验证和过滤,就容易造成可以上传任意文件的情况。
文件上传绕过
(1)js检测绕过
1.删除js中检测文件的代码;
2.上传的文件改为允许的后缀绕过js检测后再抓包,把后缀名改为可执行的文件。
(2)文件后缀名绕过
1.绕过服务器限制上传文件的后缀
2.有些Apache是允许解析其他文件后缀名,例如httpd.conf中配置以下代码:
AddType application/x-httpd-php .php .phtml
3.Apache解析文件的顺序是从右到左的,遇见不认识的后缀会继续像左判断。
(3)文件类型绕过
可以上传一个符合的文件,然后burp抓包,再更改后缀。这样Content-Type是符合的。
或者抓包,直接更改Content-Type绕过。
(4)截断
%00截断。只有在数据包中含有文件上传目录时才能利用。
NULL字符截断是最有名的截断漏洞之一,其原理是,PHP内核是由c语言实现的,因此使用了c语言中的一些字符串处理函数,在遇到NULL(\x00)字符时,处理函数就会将它当作结束标记。这个漏洞能够帮助我们去掉变量结尾不想要的字符。例如:
正常逻辑的话,这段代码并不能直接包含任意文件。但是在NULL字符的帮助下,我们只需要提交:
?file= . . / . . / . . /etc/passwd%00
即可读取到passwd文件,与之类似的是利用路径长度绕过。例如:
?file= . . / . . / / / / / /{*N}/etc/passwd
系统在处理过长的路径的时候会选择主动截断它。不过这两个漏洞随着PHP版本的更新主见消逝了。真正用到的情况越来越少。
另一个造成截断的情况是 不正确的使用iconv函数:
在遇到file变量中包含非法UTF-8字符时,iconv函数就会截断这个字符串。
所以在这个情况,我们只需提交 ?file = shell.jpg%ff 即可,因为在utf-8字符集中,单个“\x80-\xff" 都是非法的。 这个漏洞Windows系统存在,在新版的PHP中也得到修复。
::$DATA绕过必须是Windows系统,必须是php环境,必须是那个源文件
原理:php在windows系统的时候如果文件名+“::$DATA”会把该词之后的数据当成文件流处理不会检测文件后缀名
例如: shell.php -- shell.php::$DATA
%00截断GET用法:%00截断:php5.3版本以下GET提交不需要解码,直接在get文件目录处截断
当是POST接收情况的时候,正确的用法应该是我们需要对 %00 做一个URL解码
上传一个一句话木马php文件,发现被过滤。
所以更改其后缀为.jpg上传,更改filename后缀为.php 。
看见 nonono bad file。 我们再试一试php3,php4,phtml。发现phtml可以。
写入我们的一句话木马,发现存在[] 或者;就没有response。那直接命令执行。
构造
得到flag。
` `命令执行符,作用相当于shell_exec().
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?