飞道的博客

【极客出发】web2_welcome to Hash Team

448人阅读  评论(0)

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=文件名

php://filter用法详解

这里的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
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场