7.Web_php_include
1.php://input 伪协议
php://input
可用于执行php代码,构建url为111.200.241.244:59834?page=PHP://input,使用hackbar或burp抓包,使用post方式传递代码。<?php system('ls'); ?> 列出文件目录
<?php system('cat fl4gisisish3r3.php'); ?> 查看该文件,可得到flag (单双引号都可)
在查看器里查看flag!!!!!!!!!
注意:用bp先构建url再进行抓包,而hackbar先抓包,后构建!!!!!!!!!
12.unserialize3
这是一道反序列化题,那什么是反序列化呢?什么又是序列化?
序列化是将对象状态转换为可保持或可传输的格式的过程。与序列化相对的是反序列化,它将流转换为对象。这两个过程结合起来,可以轻松地存储和传输数据。
序列化通俗来讲就是将对象转化为可以传输的字符串;
反序列化就是把那串可以传输的字符串再变回对象。
序列化格式:
O:object对象 4:对象的函数名有四个占位 info:对象名 2:变量个数 s:string类型(i为int型)4:变量名占位 19:变量值
魔法函数:
__constuct() 在创建对象是自动调用
__destuct() 相当于c++中的析构最后会将对象销毁,所以在对象销毁时 被调用
__toString() 但一个对象被当成字符串使用时被调用
__sleep() 当对象被序列化之前使用
__wakeup() 将在被序列化后立即被调用
本题中用到了_wakeup(),执行unserialize()时,先会调用这个函数
unserialize()会检查是否存在一个 __wakeup()方法。如果存在,则会先调用 __wakeup方法,预先准备对象需要的资源。serialize()函数会检查类中是否存在一个魔术方法__sleep() ,若存在,同上。
__wakeup() 经常用在反序列化操作中,例如重新建立数据库连接,或执行其它初始化操作。
__wakeup()执行漏洞:一个字符串或对象被序列化后,如果其属性被修改,则不会执行__wakeup()函数。
本题中也是这样的思路,将这个对象进行序列化传值,修改其属性这样就可以进行绕过__wakeup了
<?php
class xctf{
public $flag = '111';
public function __wakeup(){
exit('bad requests');
}
}
$c = new xctf();
print(serialize($c));
?>
结果:O:4:"xctf":1:{s:4:"flag";s:3:"111";},修改变量个数即可绕过_wakeup()
当被反序列化的字符串其中对应的对象的属性个数发生变化时,会导致反序列化失败而同时使得_wakeup()函数失效。
flag:the answer is : cyberpeace{e6d1bdd16412171ac08f577aa70aa575}