目录
[NISACTF 2022]easyssrf
[SWPUCTF 2021 新生赛]ez_unserialize
[SWPUCTF 2021 新生赛]no_wakeup
这里通过nssctf的题单web安全入门来写,会按照题单详细解释每题。题单在NSSCTF中。
想入门ctfweb的可以看这个系列,之后会一直出这个题单的解析,题目一共有28题,打算写10篇。
[NISACTF 2022]easyssrf
[NISACTF 2022]easyssrf |
curl网站 curl可以用于向远程服务器发送http请求,并获取服务器的响应
也就是从他的电脑上发送
我们可以通过file://来查看他的文件 file://是文件协议的url在url中使用file:///可以指定本地文件的路径,类似于在操作系统中通过绝对路径访问本地文件。
发现他说查看fl4g我们查看fl4g
这里显示要我们查看ha1x1ux1u.php
<?php
highlight_file(__FILE__); #通过highlight_file让当前代码显示到页面上
error_reporting(0); #过滤错误信息
$file = $_GET["file"]; #通过get方法获取file变量并赋值给file
if (stristr($file, "file")){ #if判断 stristr用于匹配$file中含不含有file如果含有则输出你败了
die("你败了.");
}
//flag in /flag
echo file_get_contents($file); #通过file_get_contents读取$file 并通过echo输出到页面上
这里因为通过file_get_content会读取file变量指定的文件,也就是我们通过指定flag文件通过file_get_contents打开并会输出到桌面 所以我们指定file的值为/flag
[SWPUCTF 2021 新生赛]ez_unserialize
[SWPUCTF 2021 新生赛]ez_unserialize |
f12发现disallow
Robots 协议(也称为爬虫协议、机器人协议等)的全称是 “网络爬虫排除标准”(Robots Exclusion Protocol),网站通过 Robots 协议告诉搜索引擎哪些页面可以抓取,哪些页面不能抓取。
disallow就是爬虫不能搜索的所以我们去看看robots
<?php
error_reporting(0); #通过error_reporting屏蔽报错
show_source("cl45s.php"); #将c145s.php的代码显示到页面上
class wllm{ #定义了一个wllm类
public $admin; #公共变量admin
public $passwd; #公共变量passwd
public function __construct(){ #construct当类创建时调用
$this->admin ="user"; #指定admin的值为user
$this->passwd = "123456"; #指定passwd的值为123456
}
public function __destruct(){ #destruct当对象要销毁时调用
if($this->admin === "admin" && $this->passwd === "ctf"){ #if判断 admin的值是不是admin passwd的值是不是ctf
include("flag.php"); #include包含flag 当if判断成立时执行
echo $flag; #输出flag
}else{
echo $this->admin;
echo $this->passwd;
echo "Just a bit more!";
}
}
}
$p = $_GET['p']; #通过get方法获取p并赋值给p
unserialize($p); #对p进行反序列话
?>
这里我们要序列话admin 值为admin passwd值为ctf
O:4:"wllm":2:{s:5:"admin";s:5:"admin";s:6:"passwd";s:3:"ctf";}
[SWPUCTF 2021 新生赛]no_wakeup
[SWPUCTF 2021 新生赛]no_wakeup |
<?php
header("Content-type:text/html;charset=utf-8"); #用于发送http报头
error_reporting(0); #屏蔽错误信息
show_source("class.php"); #将class.php的代码显示到页面上
class HaHaHa{ #定义一个叫HaHaHa的类
public $admin; #定义公共admin
public $passwd; #定义公共passwd
public function __construct(){ #当类调用时执行
$this->admin ="user"; #赋值admin user值
$this->passwd = "123456"; #赋值passwd 123456值
}
public function __wakeup(){ #在反序列化后立即调用
$this->passwd = sha1($this->passwd); #将passwd的值进行哈希加密
}
public function __destruct(){ #当类快要结束时调用
if($this->admin === "admin" && $this->passwd === "wllm"){ #if判断 admin的值是不是admin passwd的值是不是wllm
include("flag.php"); #通过include包含flag.php
echo $flag; #输出flag
}else{
echo $this->passwd;
echo "No wake up";
}
}
}
$Letmeseesee = $_GET['p']; #通过get方法获取到p并赋值给Letmeseesee
unserialize($Letmeseesee); #反序列话Letmeseesee
?>
这里和上面一题差不多就是多了和wakeup对密码进行哈希加密,我们进行绕过处理
漏洞名字叫CVE-2016-7124
O:6:"HaHaHa":3:{s:5:"admin";s:5:"admin";s:6:"passwd";s:4:"wllm";}
CVE-2016-7124绕过影响的版本PHP5 < 5.6.25;PHP7 < 7.0.10
若在对象的魔法函数中存在的__wakeup方法,那么之后再调用 unserilize() 方法进行反序列化之前则会先调用__wakeup方法,但是序列化字符串中表示对象属性个数的值大于真实的属性个数时会跳过__wakeup的执行
这里我们HaHaHa中有2个对象属性,我们保证序列化字符串中的对象属性大于2就可以绕过wakeup