<?php
error_reporting(0);
class SYCLOVER {
public $syc;
public $lover;
public function __wakeup(){
if( ($this->syc != $this->lover) && (md5($this->syc) === md5($this->lover)) && (sha1($this->syc)=== sha1($this->lover)) ){
if(!preg_match("/\<\?php|\(|\)|\"|\'/", $this->syc, $match)){
eval($this->syc);
} else {
die("Try Hard !!");
}
}
}
}
if (isset($_GET['great'])){
unserialize($_GET['great']);
} else {
highlight_file(__FILE__);
}
?>
扫了一眼,反序列化的wakeup利用,里面的if语句很简单,利用数组绕过就行了,syc属性会经过一次正则表达式
preg_match("/\<\?php|\(|\)|\"|\'/", $this->syc, $match)
那我们先试试传入最基础的php代码试一试
?发现成功的绕过了正则输出了自己设的代码echo flag,但是eval函数执行不了,难道是数组的原因么,独立做一个程序试试
发现eval函数无法只能数组的php语句,这里就陷入为难了,一方面要利用数组绕过md5和sha1的强比较,但是我们构造的payload无法执行,看来超出我的知识储备了,找找资料去浅析PHP原生类 - 百度文库
又考到了原生类,这里利用的是Error类,当当作字符串的时候会触发toString函数导致XSSPHP原生类的利用_长球的鱼的博客-CSDN博客
利用原生类错误代码的不显现来绕过两个参数的不同,这里可以看到报错了行数,因此要把两个代码放在同一行上?
可以看到报错信息一样,因此可以绕过md5和sha1了?
绕过成功,现在要想怎么构造payload了,因为过滤了( )? ‘? “啥的,?这里就用到网上wp的include函数吧,第一次直到可以不用打括号php中return,require,include加括号和不加括号的区别 - 百度文库
我们可以用 include /flag来读取flag(因为我感觉日常不是注入的话不会为难你题目文件,一般都是flag.php或者/flag,其实就是自己懒了,不想写脚本跑不可见字符来跑显示目录的命令)?
习惯好记得urlencode编码一下,避免一些不注意的不可见字符导致失败,url编码后直接上传就行
但其实我有点想不通的是为什么不直接include /flag,它又不需要引号,也没有过滤一些东西,但是实践出来是打不开这个文件,很疑惑
|