文件上传绕过
程序员文章站
2022-07-16 20:52:00
...
- 查看是否前端检查文件类型
- 抓包修改content-type
- 黑名单验证的话,可以使用php3,php5,phtml,pht等来绕过,但需要在httpd-conf中开启
默认是被注释掉的,且默认只有.php 和 .phtml
- 使用
.htaccess
绕过
因此先上传一个.htaccess文件,这样所有文件都会当成php来解析
然后上传一个1.jpg的文件
.htaccess文件内容如下:
上传test.htacess,但是上传的时候抓包将名字去掉,改为.htaccess
上传1.jpg,然后访问连接,然后使用菜刀连接
- 先上传一个以auto_prepend_file=1.gif为内容的**.user.ini**文件
然后再上传一个内容为php的一句话的脚本,命名为1.gif
.user.ini文件里的意思是:所有的php文件都自动包含1.gif文件
.user.ini相当于一个用户自定义的php.ini。
所以上传1.gif后,访问图像地址,将文件名改为readme.php,然后通过密码连接
- 大小写绕过
- 通过文件名末尾加空格的方式绕过
- 通过文件末尾加点的方式进行绕过
- 特殊字符
::$DATA
绕过
使用::$DATA
前提:
必须是windows, 必须是php, 必须是那个源文件
php在window的时候如果文件名+::$DATA
,会把::$DATA
之后的数据当成文件流处理,不会检测后缀名.且保持::$DATA
之前的文件名
$file_ext = str_ireplace('::$DATA', '', $file_ext);//去除字符串::$DATA
这一句,我们可以采用Windows文件流特性绕过,文件名改成::$DATA之前的文件名
- 代码先是去除文件名前后的空格,再去除文件名最后所有的.,再通过strrchar函数来寻找.来确认文件名的后缀,但是最后保存文件的时候没有重命名而使用的原始的文件名,导致可以利用1.php. .(点+空格+点)来绕过
- 如果代码使用str_ireplace()函数只替换一次,可以通过修改文件名双写1.pphphp来绕过
- 使用
%00截断
前提:
1.php版本小于5.3.4;2.php的magic_quotes_gpc为OFF状态(phpinfo中可以查看,在php.ini中可以修改)
原理:
php的一些函数的底层是C语言,而move_uploaded_file就是其中之一,遇到0x00会截断,0x表示16进制,URL中%00解码成16进制就是0x00。
在magic_quotes_gpc=On的情况下,如果输入的数据有
单引号(’)、双引号(”)、反斜线()与 NUL(NULL 字符)等字符都会被加上反斜线。这些转义是必须的,如果这个选项为off,那么我们就必须调用addslashes这个函数来为字符串增加转义。
…/upload/1.php%00会截断后面的1.jpg(因为代码中使用拼接的方式来取得文件路径)
在上传后,访问…/upload/1.php,然后使用该链接连接菜刀
$img_path = $_GET['save_path']."/".rand(10, 99).date("YmdHis").".".$file_ext;
- 如果POST传参使用00截断的话
save_path参数通过POST方式传递
POST不会像GET对%00进行自动解码,所以需要在二进制中进行修改
将25改为00
- 条件竞争
如果文件是先上传后验证,发现非法就删除
就可以利用条件竞争,通过burp暴破模块,寻找还没来得及删除的文件