type
status
date
slug
summary
tags
category
icon
password
这里写文章的前言:
一个简单的开头,简述这篇文章讨论的问题、目标、人物、背景是什么?并简述你给出的答案。
可以说说你的故事:阻碍、努力、结果成果,意外与转折。
📝 主旨内容
[网鼎杯 2020 青龙组]AreUSerialz(BUUCTF)
题目到手第一步,代码审计
①对每个函数进行联系
②对代码流程分析
关键点在于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)
同时:
(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,浏览器没渲染出来?)
🤗 总结归纳
考点:
(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安装或者使用上的问题,欢迎您在底部评论区留言,一起交流~
- 作者:Yuki
- 链接:https://yuki8888.top/article/38f2b430-bdc4-4221-b99c-8433487748cd
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。
相关文章