提示
- git泄露
- 无参数rce
!!注意需要python3环境
github里dirsearch工具下载位置 ###可能需要开节点才能打开
百度网盘dirsearch下载地址 ###如果github里下载不了可以在网盘下载
提取码sx5d
只给了flag在哪里呢,那么应该就是要让信息收集了
对于我来说做ctf web题我有我自己的信息搜集三件套
- 抓包发包查看
- 目录扫描
- 查看页面源代码
这里在目录扫描的时候发现了git泄露
就像是下面图片方框里的,直接通过浏览器访问可直接下载,说明存在git泄露
这里我使用的是dirsearch来进行扫描的,每次扫buuctf的题时扫描速度太快他会一直报错429,就像下图箭头指向的一样,所以无论使用什么工具去扫描都得限速以及限制每次扫描时间
dirsearch -u 网站url -t 每秒扫描多少个 -s 每隔多少秒扫一次
如果想了解更多可以去看这位博主的博客dirsearch使用教程_dirsearch用法-CSDN博客
这里直接用githack把git泄露的源码扒下来
现在开始代码审计
- 首先过滤了伪协议我们不能通过伪协议注入后门了
- 将传入的字母以及符号替换为空以后如果有;则进入(#这里就已经限定了我们的格式只能是a(b(c()))这样的格式,如果将这些替换为空了还有其他东西比如“;;这样的就不匹配;)
- 不能有/et|na|info|dec|bin|hex|oct|pi|log/并且有/i匹配大小写所以不能大小写绕过
所以整体作者想要的思路应该是无参数rce
<?php
include "flag.php";
echo "flag在哪里呢?<br>";
if(isset($_GET['exp'])){
if (!preg_match('/data:\/\/|filter:\/\/|php:\/\/|phar:\/\//i', $_GET['exp'])) {
if(';' === preg_replace('/[a-z,_]+\((?R)?\)/', NULL, $_GET['exp'])) {
if (!preg_match('/et|na|info|dec|bin|hex|oct|pi|log/i', $_GET['exp'])) {
// echo $_GET['exp'];
@eval($_GET['exp']);
}
else{
die("还差一点哦!");
}
}
else{
die("再好好想想!");
}
}
else{
die("还想读flag,臭弟弟!");
}
}
// highlight_file(__FILE__);
?>
首先先来了解两个php函数
getallheaders()
返回所有http头信息,但是他返回的是数组状态的信息,然而它返回的信息需要给eval()来处理,但是eval()只能处理字符串类的信息
implode()
所以这里就要用到这个函数了,这个函数可以直接把getallheaders()返回的数组转换成字符串
这里先使用读取session的方式来做一次(###拓展###最后补充了一个做法,不过没有匹配et的话就可以使用)
- 一般php需要启动session才能使用,启动session使用函数session_start()
- session是存储在本地的和cookie同理的东西所以我们对于没有做防护的sesseion是可控的
- 通过函数session_id()函数来
session_id() 可以用来获取/设置 当前会话 ID。
为了能够将会话 ID 很方便的附加到 URL 之后, 你可以使用常量
SID
获取以字符串格式表达的会话名称和 ID最后通过highlight_file()来高亮显示文件
最后payload: highlight_file(session_id(session_start()));
拓展
payload:implode(getallheaders())
发包的同时抓包
这里随便加一个head头,他的值用来执行命令,最后加了\\来注释后面的内容
####有可能php版本不同输出顺序也不同,可以先尝试是从下至上输出还是从上至下输出
这里是从下往上读的,所以夹\\注释掉后面读取的上面的head头信息