Featured image of post pointer overflow ctf

pointer overflow ctf

没事打打的长期ctf

逛ctftime发现一个比赛连着开两个月,没事就打打,做不出来算了。另外,这个比赛的靶场竟然不是需要自己开启的容器,好神奇啊

1. All Paths Lead Home

这个签到题挺搞心态的。

进来看到一个读取文件的页面,默认的note.txt内容如下:

Welcome traveler.

Only text files are available here.

题目描述提示flag在/secret/下面,直接路径穿越,发现 ../被ban了。

随便输入点东西给出hint

This path doesn’t exist. If you’re experimenting with encodings, consult the docs.

Hint: legacy compatibility is documented at /docs/legacy.html.

跟进去看看

其实知道这个编码这个题就写出来了,就是get传参启动传统模式,然后换编码绕过黑名单,路径穿越读flag。

具体的绕过就是:

1
2
'.' -> +AC4- -> URL Encoded: %2BAC4-
'/' -> +AC8- -> URL Encoded: %2BAC8-

但是我做路径穿越的时候一直都习惯往上爬4,5层,感觉到顶了就都一样,结果一直读不到 /secret/flag.txt ,想了很多方向,试了一堆payload,结果最后 %2BAC4-%2BAC4-%2BAC8-secret%2BAC8-flag%2BAC4-txt成功了,就 ../secret/flag.txt 往上爬了一层。

后来ai告诉我说:

当输入(例如 ../../../../flag)被发送到服务器时,应用程序会先进行“规范化”处理,计算出最终的绝对路径。 许多安全的应用程序会检查这个最终路径是否在允许的Web根目录之内。

应用程序的安全检查发现路径已经超出了预期的Web目录(例如 /var/www/),会直接拒绝请求。

HaHa, What can I say

2. This Must Be the Place

这个题干说filters are not enough,我想你要是挡完了我还做什么,然后fuzz了一下发现对很多字符都有反应,想了半天绕过方法结果 <script> alert(1); </script>直接成功了,仔细看代码把输入框给转了,我只能说这个出题人挺有活的。

然后直接fetch会404,结合hint,在payload中附带上tocken,因为这个tocken是在利用点之后生成的,所以需要setTimeout等一下。

小北计算器还在追我tmd 😡

完整payload:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
<script>
  setTimeout(function() {
    fetch('/flag', {
      headers: {
        'X-FLAG-TOKEN': window.FLAG_TOKEN
      }
    })
    .then(response => response.text())
    .then(data => alert(data));
  }, 100);
</script>
你好,这是一个随便写写,随便看看的无聊而与我很重要的网站。
使用 Hugo 构建
主题 StackJimmy 设计