web2_welcome to Hash Team
key:php伪协议+php反序列化
①打开环境后直接开幕雷击——一段php代码👇
②简单地代码审计一下👇
👉GET传参变量$text、$file、$password
👉isset($text)表示$text存在,file_get_contents($text,'r')表示读取字符串$text,使其===(强等于)"welcome to Hash Team",如果这两个条件都满足,就会打印出file_get_contents($text,'r'),也就是"welcome to Hash Team"
👉对$file进行正则匹配,如果找到flag字样,直接退出;如果没找到,那么就将$file文件包含进来
👉然后将$password反序列化,输出password
③至此思路就有了,首先想方设法令text=welcome to Hash Team,但是问题是URL传参不能存在空格
解决方法是使用php伪协议php://input
php://input可以读取没有处理过的POST数据
所以可以使text=php://input,同时POST提交字符串welcome to Hash Team
另外我们要尝试读取useless.php中的文件
解决方法是使用php伪协议php://filter
php://filter可以进行任意文件的读取
例:变量=php://filter/read=convert.base64-encode/resource=文件名
这里的password有关反序列化,猜测在下一步用到,构造好我们的payload👇
/?text=php://input&file=php://filter/read=convert.base64-encode/resource=useless.php
别忘了底部POST提交字符串welcome to Hash Team👇
得到了useless.php文件的base64编码
④将代码放到base64里解码得到源码👇
进行代码审计👇
👉定义了一个Flag类,里面有一个变量$file和一个函数__tostring(),这个函数在将Flag类作为字符串执行时会自动执行
👉在__tostring()函数中,echo file_get_contents($this->file)表示将变量$file作为文件名输出文件内容
⑤再回看开始的php代码,这里的file变量要经过flag的正则表达,显然不能直接赋值为flag.php
但是password需要被反序列化,给了我们突破口👇
所以可以这样操作:令file=useless.php,再令password=O:4:"Flag":1:{s:4:"file";s:8:"flag.php";},目的是将类内变量file赋值为flag.php
表示含义
- O(大写):对象class
- 4:4个字符
- "Flag":对象名
- 1:数量,一个
- s:string
- {}里的为参数
构造好的payload👇
/?text=php://input&file=useless.php&password=O:4:"Flag":1:{s:4:"file";s:8:"flag.php";}
参考博客:https://blog.csdn.net/qq_38680693/article/details/81430057
转载:https://blog.csdn.net/Mitchell_Donovan/article/details/116136317