[GKCTF 2020]cve版签到
查看响应头发现有几个可能利用的信息
1.hint 里面的Flag in localhost
2.apache 2.4.38
3. php 7.3.15
我们发现第一个是提示 第二个apache版本没有什么漏洞 但是php 7.3.15 存在cve漏洞
这里题目规定 *.ctfhub.com 所以我们 要以这个结尾
在 php 7.3中 get_headers()会截断URL中空字符后的内容
所以我们可以通过空字符绕过
通过%00截断
这里显示要123
我们构造127.0.0.123
[NSSCTF 2022 Spring Recruit]babyphp
<?php
highlight_file(__FILE__); #高亮显示当前文件的页面
include_once('flag.php'); #包含flag.php这个文件
if(isset($_POST['a'])&&!preg_match('/[0-9]/',$_POST['a'])&&intval($_POST['a'])){ #通过post出个传入一个a的值 ,同时过滤数字 intval用于将a的值进行处理 如果a的值带字符串会被转换为0 如果是数字会转换为整数
if(isset($_POST['b1'])&&$_POST['b2']){ #通过post传入b1和b2 并判断是不是空
if($_POST['b1']!=$_POST['b2']&&md5($_POST['b1'])===md5($_POST['b2'])){ #判断b1和b2不一样但是md5值一样 这里是强匹配
if($_POST['c1']!=$_POST['c2']&&is_string($_POST['c1'])&&is_string($_POST['c2'])&&md5($_POST['c1'])==md5($_POST['c2'])){ #通过post传入c1和c2通过is_string判断传入的值是不是字符串 在md5匹配 c1和c2 这里弱匹配
echo $flag;
}else{
echo "yee";
}
}else{
echo "nop";
}
}else{
echo "go on";
}
}else{
echo "let's get some php";
}
?> let's get some php
这题就是一步一步的绕过
先传入a的值 这里考察绕过preg_match()我们使用数组绕过
成功进入下一个if
这后是b1 b2 md5 值强匹配
而在md5如果传入的不是字符串而是数组会被解析成null 所以这里用数组绕过
进入c1 c2 的绕过 这里还会判断是不是字符串
这里是弱匹配 所以直接0e就行
这题就是md5值的考察 和其他的一样就是0e 开头的在php 进行哈希处理 会通过 != 和== 来匹配的时候0e开头的会被解析成0 所以这里使用0e的数
[HCTF 2018]Warmup
发现source.php
<?php
highlight_file(__FILE__); #高亮显示当前文件的代码
class emmm #定义一个叫emmm的类
{
public static function checkFile(&$page)
{
$whitelist = ["source"=>"source.php","hint"=>"hint.php"];
if (! isset($page) || !is_string($page)) { #判断page是不是空 并判断是不是字符串
echo "you can't see it";
return false;
}
if (in_array($page, $whitelist)) { #通过in_arry 判断 page的文件识别在$whitelist中
return true;
}
$_page = mb_substr( #通过mb_substr截取
$page, #截取page
0, #从0位字符开
mb_strpos($page . '?', '?') #代表截取?之前在url中如 source.php?a=z 那就会是$_page = mb_substr($page,0,11);
);
if (in_array($_page, $whitelist)) { #通过in_arry 判断 page的文件识别在$whitelist中
return true;
}
$_page = urldecode($page); #url解码 page
$_page = mb_substr( #这里和上面一样
$_page,
0,
mb_strpos($_page . '?', '?')
);
if (in_array($_page, $whitelist)) {
return true;
}
echo "you can't see it";
return false;
}
}
if (! empty($_REQUEST['file']) #通过$_REQUEST['file']获取文件名 empty 判断是不是空
&& is_string($_REQUEST['file']) #判断是不是字符串
&& emmm::checkFile($_REQUEST['file']) #使用emmm类中的checkFile判断
) {
include $_REQUEST['file']; #包含这个文件
exit;
} else {
echo "<br><img src=\"https://i.loli.net/2018/11/01/5bdb0d93dc794.jpg\" />";
}
?>
从文件我们知道只允许source.php hint.php两个文件
也就是我们通过这里知道了flag在哪里 再通过source中的文件包含获取
1、是否存在file参数
2、file参数是否为字符串
3、emmm类的checkFile方法判断
重点漏洞成因是
我们发现这里对于url做了第二次过滤 正是因为考虑的太过于详细所以导致了漏洞
如我们的url为http://node4.anna.nssctf.cn:28523/source.php?file=hint.php
这里的url为source.php?file=hint.php%253F
这个是?的两次url编码 那我们也就知道了这的的第二个?会通过
此时根据第二个过滤的代码 会解析第二个?之前的内容 ?后面的内容就可以绕过了
这题是CVE-2018-12613的变化题
那我们知道原理就可以进行绕过
这里要用到目录
. 代表当前目录
.. 代表上一级目录
./ 同一目录下的不同文件
../ 上一级目录下的文件
这里我们有a 目录 下有b c目录 b目录下有d e目录 d目录下有zx 文件
我们可以看到.代表的
我们现在再d中写入一个d文件
我们可以知道./的作用
现在我们再a中创建zx文件
我们就知道了目录移动
所以下面我们就尝试包含flag文件