• Buuctf [MRCTF2020]Ez_bypass 1 WP解析


    题目来源:MRCTF2020
    题目名称:Ez_bypass 1

    打开网页

    查看源代码

    1. I put something in F12 for you
    2. include 'flag.php';
    3. $flag='MRCTF{xxxxxxxxxxxxxxxxxxxxxxxxx}';
    4. if(isset($_GET['gg'])&&isset($_GET['id'])) {
    5. $id=$_GET['id'];
    6. $gg=$_GET['gg'];
    7. if (md5($id) === md5($gg) && $id !== $gg) {
    8. echo 'You got the first step';
    9. if(isset($_POST['passwd'])) {
    10. $passwd=$_POST['passwd'];
    11. if (!is_numeric($passwd))
    12. {
    13. if($passwd==1234567)
    14. {
    15. echo 'Good Job!';
    16. highlight_file('flag.php');
    17. die('By Retr_0');
    18. }
    19. else
    20. {
    21. echo "can you think twice??";
    22. }
    23. }
    24. else{
    25. echo 'You can not get it !';
    26. }
    27. }
    28. else{
    29. die('only one way to get the flag');
    30. }
    31. }
    32. else {
    33. echo "You are not a real hacker!";
    34. }
    35. }
    36. else{
    37. die('Please input first');
    38. }
    39. }Please input first

    此php文件分为两次第一次的强类型的比较,传参方式为GET,判断参数gg和id的md5值是否相同,因为是一个==所以属于是一个md5的弱比较可以将参数设置成为数组进行绕过部分字符串md5加密之后为0exxxx的格式,相当于0的xxxx次方,所以无论xxxx是什么,函数判断时都会认为相等

    例如

    a=QNKCDZO,加密后为0e830400451993494058024219903391

    b=240610708,加密后为0e462097431906509019562988736854

    所以既满足了a!=b,也满足了md5($a) == md5($b)

    并且:md5函数不能处理数组,处理数组会报错,就会返回null,然后经过md5就相等了,传入的参数不同,gg和id的值就不同

    payload:

    /?gg[]=QNKCDZO1&id[]=240610708

    有了回显,是一个warning的报错说明我们的GET的md5弱比较执行成功,接着审计剩下的代码

    1. if(isset($_POST['passwd'])) {
    2. $passwd=$_POST['passwd'];
    3. if (!is_numeric($passwd))
    4. {
    5. if($passwd==1234567)
    6. {
    7. echo 'Good Job!';
    8. highlight_file('flag.php');
    9. die('By Retr_0');
    10. }
    11. else
    12. {
    13. echo "can you think twice??";
    14. }
    15. }
    16. else{
    17. echo 'You can not get it !';
    18. }
    19. }
    20. else{
    21. die('only one way to get the flag');
    22. }
    23. }
    24. else {
    25. echo "You are not a real hacker!";
    26. }
    27. }
    28. else{
    29. die('Please input first');
    30. }
    31. }Please input first

    思路:

            is_numeric()函数,它的作用就是判断参数是否为数字或者是字符串数字,如果不是则返回false,这里!is_numeric所以这是不是数字或者不是字符串数字就返回true,并且这里是弱类型比较还需要等于1234567,php的弱类型比较1234567a==1234567返回的true,我们只需要使用post传参就可以了

    Burpsuite传参:

    1. 请求方式修改为POST
    2. 消息头中加上Content-Type:application/x-www-form-urlencoded
    3. 在消息主体中加上需要上传的POST数据
    4. 在Reoeater模块右键点击change body encoding

    payload:

            passwd=1234567a

    修改后直接发送包获得flag

     

     

  • 相关阅读:
    17-GuliMall 搭建虚拟域名访问环境
    踩坑记录---openFeign高并发阻塞分析与解决
    BUFLAB
    Redis快速上手篇(三)(事务+Idea的连接和使用)
    9. SQL中Insert into/Update/Delete的用法
    CentOS密码重置
    代码随想录打卡第四十六天|完全背包 ● 518. 零钱兑换 II ● 377. 组合总和 Ⅳ
    自建图床实现typora图片上传
    小程序跨页面传递参数的几种方式
    OLTP 负载性能优化实践
  • 原文地址:https://blog.csdn.net/qq_60115503/article/details/127787126