目录
二、pass-02(ContentTpye头检测文件类型绕过)
一、pass-01(js前端验证)
直接跳出弹幕框--前端认证(在前端已经被拦截了,没有上传到后端,所以无法第一时间进行抓包)
查看源码
发现前端对文件类型进行了过滤
解决方法:
- 在本地客户端禁用js.(用户点击上传按钮(submit)后,会触发js事件--οnsubmit='return checkfile()";)
- 通过浏览器审查元素对网页代码的查看,删除onsubmit事件
作者采用了第二种方法,删除后,复制图像信息进行访问。
上传成功:
二、pass-02(ContentTpye头检测文件类型绕过)
上传一个php文件
提示文件类型不正确--当浏览器上传文件到服务器的时候,服务器会对文件Content-Type类型进行检查,如果 白名单允许则上传成功,否则上传失败。
解决方法:利用burpsuite对Content-Type类型修改为符合上传类型
改包:改content-type
三 、pass-03(文件后缀的判断(黑名单绕过)
通过查询服务器核心源代码发现,服务端对文件后缀进行了判断,防止脚本文件的上传。
解决方法:
phpt,phtml,php3,php4,php5,php6为php扩展,这些文件名也是可以解析的,通过上传php扩展绕过黑名单检查。
环境配置:配置httpd-conf文件,添加php扩展,注意去掉注释符#,配置完后重启phpstudy
用burpsuite抓包,修改后缀名(可以直接修改完后放包,也可使用重发器)
复制图像信息进行访问验证
四、pass-04(重写解析规则绕过)
.htaccess文件是Apache 服务器中的一个配置文件,他负责相关目录下的网页配置。一般.htaccess可以用来留后门和针对黑名单绕过。
上传覆盖.htaccess文件,重写解析规则,将上传的带有脚本马的图片以脚本方式解析。.htaccess文件内容如下
用notepad++编写代码(和phpinfo验证或一句话木马在同一目录下)一般只用命名.htaccess然后在上传shell.php(phpinfo验证,或一句话木马)文件,把文件名称改包修改为.htaccess中设置的一样的名字01.png,这个时候01.png就会被当做php执行
五、pass-05(大小写绕过)
漏掉了转换大小写
六、pass-06(后缀名加空格绕过)
漏掉去除空格
七、pass-07(后缀名加点绕过)
漏掉除去末尾的点,利用windows会制动处理文件末尾的点和空格,可在文件后缀加点绕过
八、pass-08(后缀名加::$DATA绕过)
漏掉::$DATA
上传成功后,在upload目录下的文件名会自动的去掉::$DATA,之后访问直接访问php就行了
九、pass-09(利用函数依次执行来绕过)(. .)
之前所用到的方法均被限制,所以开辟新的思路,我们可以看到,上传时路径拼接的是$file_name(源文件名),利用代码执行一个漏洞,可以一个函数一个函数从上到下绕过 故可以构造1.php. .(点空格点)绕过,上传后,deldot先删除掉文件名最后一个".",再由trim出去空格,最后剩下了1.php.,结合Windows特性会自动去掉后缀的“.” 、“空格”和“::$DATA”,就变成了1.php,即可上传成功。
十、pass-10(双写绕过替换规则)
str_ireplace(find,replace,string,count)函数替换字符串中的一些字符(不区分大小写)。如果搜索的字符串是一个数组,那么它将对数组中的每个元素进行查找和替换。上面代码中是,在上传的文件原名中,查找是否有包含在黑名单($deny_ext)中的,有的话就替换为空。对str_ireplace()函数的绕过可以用双写绕过替换规则。
上传文件1.php,抓包,修改文件名为1.pphphp,这样str_ireplace将后缀中的php删除了,但两边的"p"和"hp"拼起来又是一个“php”了
十一、pass-11(白名单GET的%00绕过)
环境配置:(11,12都需要)配置php版本小于5.3.29且php.ini中的magic_quotes_gpc为OFF状态,配置好后记得重启。
保存的时候是用get方式获取拼接的,所以说前面是可控的
这样就$img_path =/upload/1.php%00/.rand(10, 99).date("YmdHis").".".$file_ext;(保存后的文件名),由于00截断,%00后面的全部忽略,就只剩下$img_path =/upload/01.php,并且01.png被保存为了01.php
十二、POST的00截断
GET传参的时候,会自动进行URL解码,POST不会,所以本题需要用hex进行修改
%00用来拦截和占位,将%00改为 00 00 00
同样返回php文件即可
十三、pass-13(文件头检测,图片马文件包含)
制作图片马
利用文件包含漏洞访问图片马
十四、(文件头检测,图片马文件包含)
getimagesize()函数读取文件头检测是否为图片
也可利用13题类似方法绕过
问题采用添加文件幻数(文件开头两个字节)绕过
在原有的phpinfo验证带吗文件前加GIF89a
同样利用文件包含漏洞访问
十五、pass-15(文件头检测,图片马文件包含)
同13方法
十六、pass-16(二次渲染绕过)
$is_upload = false;
$msg = null;
if (isset($_POST['submit'])){
// 获得上传文件的基本信息,文件名,类型,大小,临时文件路径
$filename = $_FILES['upload_file']['name'];
$filetype = $_FILES['upload_file']['type'];
$tmpname = $_FILES['upload_file']['tmp_name'];
$target_path=UPLOAD_PATH.'/'.basename($filename);
// 获得上传文件的扩展名
$fileext= substr(strrchr($filename,"."),1);
//判断文件后缀与类型,合法才进行上传操作
if(($fileext == "jpg") && ($filetype=="image/jpeg")){
if(move_uploaded_file($tmpname,$target_path)){
//使用上传的图片生成新的图片
$im = imagecreatefromjpeg($target_path);
if($im == false){
$msg = "该文件不是jpg格式的图片!";
@unlink($target_path);
}else{
//给新图片指定文件名
srand(time());
$newfilename = strval(rand()).".jpg";
//显示二次渲染后的图片(使用用户上传图片生成的新图片)
$img_path = UPLOAD_PATH.'/'.$newfilename;
imagejpeg($im,$img_path);
@unlink($target_path);
$is_upload = true;
}
} else {
$msg = "上传出错!";
}
}else if(($fileext == "png") && ($filetype=="image/png")){
if(move_uploaded_file($tmpname,$target_path)){
//使用上传的图片生成新的图片
$im = imagecreatefrompng($target_path);
if($im == false){
$msg = "该文件不是png格式的图片!";
@unlink($target_path);
}else{
//给新图片指定文件名
srand(time());
$newfilename = strval(rand()).".png";
//显示二次渲染后的图片(使用用户上传图片生成的新图片)
$img_path = UPLOAD_PATH.'/'.$newfilename;
imagepng($im,$img_path);
@unlink($target_path);
$is_upload = true;
}
} else {
$msg = "上传出错!";
}
}else if(($fileext == "gif") && ($filetype=="image/gif")){
if(move_uploaded_file($tmpname,$target_path)){
//使用上传的图片生成新的图片
$im = imagecreatefromgif($target_path);
if($im == false){
$msg = "该文件不是gif格式的图片!";
@unlink($target_path);
}else{
//给新图片指定文件名
srand(time());
$newfilename = strval(rand()).".gif";
//显示二次渲染后的图片(使用用户上传图片生成的新图片)
$img_path = UPLOAD_PATH.'/'.$newfilename;
imagegif($im,$img_path);
@unlink($target_path);
$is_upload = true;
}
} else {
$msg = "上传出错!";
}
}else{
$msg = "只允许上传后缀为.jpg|.png|.gif的图片文件!";
}
}
利用hex编辑器解码
上传图片马,将上传前后的图片马进行对比
在不同的地方加上验证<?php phpinfo();?>上传访问
十七、条件竞争绕过文件删除
文件上传之竞争条件
在服务器删除我们上传的非法文件之前,访问这个文件,从而生成另一个木马文件,用这个木马文件getshell
文件上传过程
用户上传文件,服务器获取文件,然后保存临时文件,然后使用移动函数(比如php中的move_uploaded_file() ),才会将文件移动到站点的根目录下面
竞争条件原理
网站允许上传任意文件,然后检测文件中若有webshell,就删除文件;若不是指定类型文件,那么就使用unlink删除文件
在删除之前访问上传的php文件,从而执行上传文件中的php代码
(竞争条件攻击)
审计代码,发现这关是先允许上传任意文件,,然后用白名单对比检查上传的文件,,如果上传的文件后缀不被白名单包含,,则直接删除
方法:写一个php脚本(被访问时会创建另一个脚本,这个如果创建成功,不会被删除),,用burpsuite抓包,,多线程去一直上传,,再抓个访问包,,多线程一直访问,同时进行,总有一刻会在文件被删除之前访问到脚本,,创建shell成功
创建webshell文件
本片博客参照如下文章学习,大部分方法知识来源于这篇文章