type
status
date
slug
summary
tags
category
icon
password
😀
这里写文章的前言: 一个简单的开头,简述这篇文章讨论的问题、目标、人物、背景是什么?并简述你给出的答案。
可以说说你的故事:阻碍、努力、结果成果,意外与转折。
 

📝 主旨内容

[网鼎杯 2020 青龙组]AreUSerialz(BUUCTF)

notion image
题目到手第一步,代码审计
①对每个函数进行联系
②对代码流程分析
关键点在于file_get_content()函数,可以用来读取flag文件,对file_get_content()函数追踪后流程如下所示
  • $str = $_GET['str']
    • is_vail($str)
      • unserialize($str)
        • ___destruct()
          • process()
            • read()
              • output($res)
                • $res == read()
                  • $res = file_get_contents(filename)
notion image
同时:
(1)FileHandler三个变量权限都是protected,而protected权限的变量在序列化的时会有%00*%00字符,%00字符的ASCII码为0,就无法通过上面的is_valid函数校验
绕过方法1:对于PHP版本7.1+,对属性的类型不敏感,可以将protected类型改为public,直接进行序列化,这样既不会出现%00*%00,同时也可以输出变量。   绕过方法2:利用大写S采用的16进制,来绕过is_valid中对空字节的检查。 //00 替换 %00 。  (2)强比较和弱比较的利用。将op设置为int型的2,op === "2"为false,op == "2"为true,绕过析构函数中的if判断,同时又可以调用到读文件的流程
第一遍传入
可以发现index.php的绝对路径/var/www/html/inde.php,同时flag.php在同一目录下
/var/www/html/flag.php
payload如下
(只在burp中看见flag,浏览器没渲染出来?)
notion image

🤗 总结归纳

考点:
(1)FileHandler三个变量权限都是protected,而protected权限的变量在序列化的时会有%00*%00字符,%00字符的ASCII码为0,就无法通过上面的is_valid函数校验
绕过方法1:对于PHP版本7.1+,对属性的类型不敏感,可以将protected类型改为public,直接进行序列化,这样既不会出现%00*%00,同时也可以输出变量。   绕过方法2:利用大写S采用的16进制,来绕过is_valid中对空字节的检查。 //00 替换 %00 。  (2)强比较和弱比较的利用。将op设置为int型的2,op === "2"为false,op == "2"为true,绕过析构函数中的if判断,同时又可以调用到读文件的流程

📎 参考文章

  • 一些引用
  • 引用文章
 
💡
有关Notion安装或者使用上的问题,欢迎您在底部评论区留言,一起交流~
记录第二次打红日靶场一hyper-v虚拟机连接vmware虚拟机