unseping-wp

图片[1]-unseping-wp-Drton1博客

调用链: wakeup() —> waf() —> _destruct() —> ping()

考点 : 一道反序列化的RCE,执行系统命令拿到flag **

关键点: 绕过waf()的过滤

困扰: 看代码 时候下面这一句代码一直看不懂 ,查了很久资料,终于弄懂了

call_user_func_array(array($this, $this->method), $this->args);

调用本类的 ping方法 把args当作参数丢进去。

示例:

public static function fnCallBack( $msg1 , $msg2 )


{


echo 'msg1:'.$msg1;


echo "<br />\\n";


echo 'msg2:'.$msg2;


}


}


$className = 'MyClass';


$fnName = "fnCallBack";


$params = array( 'hello' , 'world' );


call_user_func_array( array( $className , $fnName ) , $params );

 

代码说明:

这段代码和第1种方法的代码很相似,我们将类名(MyClass)也作为call_user_func_array的第1个参数传递进去,就可以实现类的 静态方法的回调了。注意,这时call_user_func_array的第1个参数是一个数组了,数组的第1个元素是类名,第二个元素是要调用的函数名

那么整个代码的逻辑思路已经清晰了:

  • 先调用wakeup() 调函数把我们输入的值过滤用waf()函数过滤一次
  • 然后程序结束,对象销毁 调用_destruct() 检查我们构造的method是否有ping
  • 如果有ping这个字符串,就回调本类的ping()函数 进行exec 命令执行函数

    图片[2]-unseping-wp-Drton1博客

图片[3]-unseping-wp-Drton1博客图片[4]-unseping-wp-Drton1博客

我们构造ls 发现被waf()拦截。因为我们构造的参数中有ls 被拦截了,这个时候想办法打破拦截规则

加双引号进行绕过。

图片[5]-unseping-wp-Drton1博客

但是这个flag_1s_here 不是 一个php文件 是一个目录 我们不能直接读取他 所以 想办法ls -al flag_1s_here

但是这个空格属实是难饶 试过了各种方法 都很难

最后用八进制绕过

利用php特性:

图片[6]-unseping-wp-Drton1博客

我们利用python 把我们的命令进行拆分。

图片[7]-unseping-wp-Drton1博客

得到八进制:

图片[8]-unseping-wp-Drton1博客

得到base64加密 :

图片[9]-unseping-wp-Drton1博客

找到flag文件:

 

cat flag_1s_here/flag_831b69012c67b35f.php

图片[10]-unseping-wp-Drton1博客

图片[11]-unseping-wp-Drton1博客

图片[12]-unseping-wp-Drton1博客

拿到flag 结束。

坑爹的点: 这个在线代码运行 tab 还识别不了 坑了我好长时间

另外 base64加密 一个tab 跟几个空格 虽然间距一样 但是加密出来的值是不一样的。

© 版权声明
THE END
喜欢就支持一下吧
点赞13 分享
评论 抢沙发

请登录后发表评论