目录
[第五空间 2021]WebFTP
[SWPUCTF 2021 新生赛]Do_you_know_http
[NCTF 2018]签到题
[HNCTF 2022 Week1]What is Web
[HNCTF 2022 Week1]Interesting_http
[HCTF 2018]Warmup
[第五空间 2021]WebFTP
使用dirsearch扫描,发现有git泄露
使用GitHack克隆目录,但提示为空仓库
python2 GitHack.py http://node4.anna.nssctf.cn:28914/?m=login&a=in/.git
还有其他目录,在phpinfo.php中发现flag
[SWPUCTF 2021 新生赛]Do_you_know_http
打开环境提示说,请使用“WLLM”浏览器!
bp抓包修改UA头为WLLM,发包后提示只能本地访问 id为183.224.81.105
添加X-Forwarded-For:127.0.0.1,回显可看到地址已经变为本地
发包得flag
[NCTF 2018]签到题
抓包发到重发器,回显后发现flag。
[HNCTF 2022 Week1]What is Web
跟上题一样,bp抓包发到重发器,回显后发现flag(base64解码)。
[HNCTF 2022 Week1]Interesting_http
打开环境 提示 POST 发包,参数名为 want
使用HackBar POST传参want,提示有flag
令want=flag,提示不是 admin 用户
bp抓包将cookie中的user改为admin
改了之后又提示 不是本地,添加xff(X-Forwarded-For:127.0.0.1)回显得到flag。
[HCTF 2018]Warmup
[HCTF 2018]WarmUp(代码审不好,看大佬wp)
打开环境只有一个表情包,查看源代码发现source.php
访问source.php,得到代码
代码审计:
<?php highlight_file(__FILE__); // 引入当前文件 class emmm { public static function checkFile(&$page) { // 定义一个白名单,包含允许访问的文件名"source.php"和"hint.php" $whitelist = ["source"=>"source.php","hint"=>"hint.php"];
//定义了一个名为emmm的类,在该类中有一个静态方法checkFile用于检查要包含的文件是否在白名单中,白名单是一个关联数组$whitelist,其中包含了允许包含的文件的键值对。
// 如果没有设置$page变量或者$page不是字符串,则返回错误信息
if (! isset($page) || !is_string($page)) {
echo "you can't see it";
return false;
}
// 如果$page在白名单中,则返回true
if (in_array($page, $whitelist)) {
return true;
}
// 截取$page字符串,直到第一个问号的位置
$_page = mb_substr(
$page,
0,
mb_strpos($page . '?', '?')
);
// 如果截取后的$_page在白名单中,则返回true
if (in_array($_page, $whitelist)) {
return true;
}
// 对$page进行URL解码
$_page = urldecode($page);
$_page = mb_substr(
$_page,
0,
mb_strpos($_page . '?', '?')
);
// 如果截取后的$_page在白名单中,则返回true
if (in_array($_page, $whitelist)) {
return true;
}
// 如果都不满足条件,则返回错误信息
echo "you can't see it";
return false;
}
}
符号点 '.' 是 PHP 中的字符串连接运算符,它用于将两个字符串连接在一起,形成一个更长的字符串。
它将 $page 变量的值和一个问号字符 '?' 连接在一起,形成一个新的字符串,在这个新的字符串中查找问号是否存在,那么很明显肯定能找到。
$_page = mb_substr( $page, 0, mb_strpos($page . '?', '?') );
//先使用mb_strpos函数找到$page中第一个问号的位置,然后使用mb_substr函数将问号之前的部分作为$_page进行处理。
if (! empty($_REQUEST['file']) && is_string($_REQUEST['file']) && emmm::checkFile($_REQUEST['file']) ) { include $_REQUEST['file']; exit; }else { echo "<br><img src=\"https://i.loli.net/2018/11/01/5bdb0d93dc794.jpg\" />"; }
//检查$_REQUEST['file']是否存在且为字符串类型,并调用emmm::checkFile方法进行检查。如果返回值为true,则通过include语句包含$_REQUEST['file']指定的文件并终止程序执行,否则输出一个图片标签。
始终在source.php页面下进行的传参操作,目的是利用include函数将flag文件包含出来
尝试访问hint.php,提示flag在ffffllllaaaagggg中。
source.php?file=hint.php
//php代码的判断过程:
传入file=hint.php,首先检查'hint.php'是否是一个字符串,它是字符串,条件通过;
检查'hint.php'是否在白名单中(白名单包括hint.php和source.php),在,继续执行后面的代码;
对'hint.php'执行mb_substr函数,但是函数内一个参数是来自另一个函数mb_strpos的返回值,因此我们先看mb_strpos函数,使用.进行字符连接,即连接了一个问号字符 '?',得到hint.php?
然后查找'?'在字符串'hint.php?'中第一次出现的位置,从0开始算,返回8,即length=8
接下来执行mb_substr函数,即 mb_substr('hint.php',0,8)
从字符串中的第一个字符处开始,返回8个字符,还是返回hint.php;
然后对返回的内容进行url解码,重复执行上面的检查和截取操作。
构造payload,得到flag。
source.php?file=hint.php?/../../../../ffffllllaaaagggg
或
source.php?file=source.php?/../../../../ffffllllaaaagggg
//因为当前的source.php一般是在html目录下,往上是www,var,然后到根目录。
flag一般就放在根目录下面,这里还有一个hint.php?/或source.php?/,因此需要返回四层才能到根目录。
即 hint.php?/var/www/html/ffffllllaaaagggg