打开之后我们就可以进行php的代码审计。我们从头开始看起。 在第一个if中我们就可以看到要满足里面的等式才可以看到。(从代码来看,当给text传入“welcome to the zjctf”时可以进入到If语句。直接传值会被file_get_contents过滤掉,所以这里利用php伪协议来给text传值。1payload为text=data://text/plain;base64,d2VsY29tZSB0byB0aGUgempjdGY=)file_get_contents()函数的功能是读取文件内容到一个字符串,但这里没没有一个文件,而是读取的text变量。没查到相关这方面的用法,特别是那个r参数。 这里我们如果直接将text与这段话进行等值那么我们就可以看到这个网站没有回显,也就是说我们要想办法绕过这个。 用php的伪协议也就是data://伪协议来进行漏洞利用。 这里也就说明了我绕过了。 然后我们再看下一个if语句。 因为在一开始的界面我们就可以看到,这里面给了一个提示也就是useless.php,从这里我们可以联想到PHP伪协议里面有一个php://filter伪协议这是一个用来读取文件的一个伪协议。接下来我们就要开始构造payload。 ?text=data:text/plain;base64,d2VsY29tZSB0byB0aGUgempjdGY=(这个是welcome to the zjctf的base64编码后的一个)&file=php://filter/read=convert.base64-encode/resource=useless.php 之后我们就可以看到 下面的这一段话就是一个base64的编码我们解码出来就可以看到这个就是useless.php的源码。 file不为空将读取flag.php。所以。构造一个序列化字符串。
我们可在菜鸟教程上面进行一下运行(记得要用php的编译器)我们就可以看到这个最后我们再一次的构造payload:?text=data:text/plain;base64,d2VsY29tZSB0byB0aGUgempjdGY=&file=useless.php&password=O:4:“Flag”:1:{s:4:“file”;s:8:“flag.php”;} 在源码中我们可以找到flag
php反序列化
serialize()将对象的用字符串的方式进行表示,unserialize()将序列化的字符串,构造成相应的对象。 O:4:”Flag”:1:{s:4:”file”;s:8:”flag.php”;}1对象类型:对象名长度:“对象名”:对象成员变量个数:{变量1类型:变量名1长度:变量名1; 参数1类型:参数1长度:参数1; 变量2类型:变量名2长度:“变量名2”; 参数2类型:参数2长度:参数2;… …}
(https://blog.csdn.net/weixin_39927214/article/details/116281659)这个里面讲了php反序列化的知识点。
|