侧边栏壁纸
  • 累计撰写 19 篇文章
  • 累计收到 4 条评论
CTF

2024年NSSCTF秋季招新赛中的一次代码审计(详细解题思路)

eson
2024-10-18 / 0 评论 / 89 阅读 / 正在检测是否收录...

这个题做完以后第一时间就和好友分享,因为在这道题上走的弯路太多了,中途一度想要放弃,最后整理思路,一点一点代码审计解出来,那种喜悦还是比较大的。

但是回顾起来,如果刨除了弯路,这道题其实并不难,就是简单的代码审计。

打开题目,一个注册按钮,一个查看已注册信息的按钮

微信截图_20241018194909.png

常规思路,先注册一下

222.png

注册成功之后,跳转到注册信息的页面,说实话看到这个页面,第一个想法真的是SSRF,你就说你的想法是不是吧?

但也是这个想法坑了我好久好久

333.png

这里先不谈弯路部分,因为首页有两个按钮,咱们先看看另外一个按钮的作用。

444.png

555.png

点进去后可以看到就是以用户名为信息显示的,看上面一张图的路径,可能大家第一反应是文件包含,但是说实话,我的第一反应莫名其妙的就是序列化,可能当时感觉既然选择了读取txt,那么存放数据大概率会以序列化的形式吧,后面也印证了这点。

中间有过错误思路SSRF部分,也尝试了dict、PHP、data等协议,发现可用的就是file协议

微信截图_20241018195726.png

走到这里的时候,相信你和我的感觉一样,这把稳了。但是尝试读取/flag的时候,发现提示文件不存在,后来发现实际上是有这个文件的。

666.png

然后开始各种尝试flag文件名,又浪费了好久好久。。。

最后痛定思痛,既然file可以读取文件,而已知探测出的是nginx(这个不用聊了吧?)

那么 /var/www/html 下面的 index.php 是要看一看的,再加上之前涉及的save_user.php、submit.php、show_blog.php 都要看一看,于是开启了代码审计之旅。

但是在代码审计上也踩了很多坑,事后想想,其实可以直接排除的,比如submit.php中的file_put_content,我在这个上面也下了很多功夫。

777.png

排除万难之后,终于找到了show_blog.php中的这段。

if (isset($_GET['file'])) {
    $filename = basename($_GET['file']);
    $filepath = 'data/user_profiles/' . $filename;

    if (file_exists($filepath)) {
        ob_start();
        include $filepath;
        $fileContent = ob_get_clean();
        
        preg_match('/Username: (.*)/', $fileContent, $usernameMatch);
        preg_match('/Blog: (.*)/', $fileContent, $blogMatch);
        $username = isset($usernameMatch[1]) ? htmlspecialchars($usernameMatch[1]) : 'Unknown User';
        $blogUrl = isset($blogMatch[1]) ? htmlspecialchars($blogMatch[1]) : '';

        $content = "";
        $content .= <<<EOD

这个include ,激动不激动?再加上我们之前的线索发现,data/user_profiles/ 下以用户名为文件名保存的txt文档里面其实就存放了用户名和blog,如下图

888.png

那么我们在访问show_blog.php的时候,一定会加载我们填写的blog里面的内容,既然是include,那么只要有php标签一定会被解析。

于是,开始构造payload

https://www.baidu.com/<?=passthru('ls${IFS}>a.txt');?>//

看到这个PAYLOAD你肯定很奇怪,因为代码审计里面还有一些细节,我就不赘述了,比如下图

999.png

构造完以后,我们需要访问一下show_blog.php?file=admin.txt ,好让它执行一下。

1011.png

然后去访问网站根目录下a.txt,就发现了一个令人开心的东西!

1012.png

于是构造最终payload

https://www.baidu.com/<?=passthru('/var/www/html/readflag.sh${IFS}>a.txt');?>//

1013.png

记录此文主要是提醒自己,其实有些坑仔细想想根本不用踩,一道简单题生生被自己做成了难题。

1

评论 (0)

取消