web8

开卷看题

给了一段提示:txt????

代码审计题

代码分析

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?php
// 重点:extract函数将键值数组转换为变量
extract($_GET);

// $ac非空
if (!empty($ac)) {

// 将$fn文件内容拷贝给$f
$f = trim(file_get_contents($fn));

// 如果$ac值和$fn文件内容一致则输出flag
if ($ac === $f) {
echo "<p>This is flag:" . " $flag</p>";
} else {
echo "<p>sorry!</p>";
}
}
?>

总结一下:经过extract函数解析后,如果$ac值和$fn文件内容一致则输出flag

开始探索

现在问题是:我们怎么能确定文件内容呢?

  当时我(笨比)的想法是:找一个能确定内容的文件,于是灵光一闪,七窍接通,突然想到会不会存在其他的小文件,紧接着扫了一下目录。。。。

还真有(我可真是太机智了),访问flag.txt

NICE啊,得到了具体的内容

可以构造payload了:ac=flags&fn=flag.txt

NICE啊,拿到了flag,不禁给自己鼓掌(当时膨胀的差点飞出宇宙)

后续发展

  感觉这次无比顺利之后便开始研究其他解决方案,突然想到,页面的源码应该就是index.php的,这不就是一个可以确定内容的吗

于是乎,开始熟练地构造payload:ac=%3C%3F%70%68%70%0D%0A%65%78%74%72%61%63%74%28%24%5F%47%45%54%29%3B%0D%0A%69%66+%28%21%65%6D%70%74%79%28%24%61%63%29%29%0D%0A%7B%0D%0A%24%66+%3D+%74%72%69%6D%28%66%69%6C%65%5F%67%65%74%5F%63%6F%6E%74%65%6E%74%73%28%24%66%6E%29%29%3B%0D%0A%69%66+%28%24%61%63+%3D%3D%3D+%24%66%29%0D%0A%7B%0D%0A%65%63%68%6F+%22%3C%70%3E%54%68%69%73+%69%73+%66%6C%61%67%3A%22+%2E%22+%24%66%6C%61%67%3C%2F%70%3E%22%3B%0D%0A%7D%0D%0A%65%6C%73%65%0D%0A%7B%0D%0A%65%63%68%6F+%22%3C%70%3E%73%6F%72%72%79%21%3C%2F%70%3E%22%3B%0D%0A%7D%0D%0A%7D%0D%0A%3F%3E&fn=index.php

但是这次无论怎么搞也失败,没办法看看其他大佬的思路

惊世骇俗

不得不说我学过的都顺着呼吸离开了我的身体,瞻仰一下大佬的解决方案

利用data协议直接构造任何数据,666

data协议详细参考:传送门

懂了吧,所以payload可以写成:ac=xxx&fn=data:,xxx

又快又方便,满分

惊不惊喜,刺不刺激?

后记

记得第一次看见data协议是在HTML中表示img,虽然很简单但是。。关键时候你就想不到

  • 本文作者: Snow-NSAH
  • 本文链接: https://blog.nsah.top/2020/09/07/CTF/WEB/Bugku(旧版)/web8/
  • 反馈建议: 限于作者水平, 博文肯定有不足甚至错误之处, 欢迎发送邮件提供您的宝贵建议
  • 版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!