Flask框架远程命令执行-学习笔记

网友投稿 824 2022-11-02

Flask框架远程命令执行-学习笔记

Flask框架远程命令执行-学习笔记

本文为学习笔记:

实验介绍

#coding=UTF-8from flask import Flask, request, render_template_string, render_templateimport osimport stringapp = Flask(__name__)@app.route('/news/')def news(): user = {'id':"admin", 'password':"admin888"} if request.args.get('id'): user['id'] = request.args.get('id') #获取id参数 with open('index.html', 'r', encoding='utf-8') as f: #读取模板文件 template = f.read() % user['id'] #通过客户端参数渲染模板 return render_template_string(template, user=user) #渲染页面def run_cmd(cmd): #命令执行函数 result = os.popen(cmd) return result.readlines()app.jinja_env.globals['run_cmd'] = run_cmdif __name__ == "__main__": app.run(debug=False)

通过以上代码,我们可以看到

= f.read() % user['id']

读取了客户端的参数然后传递到模板中渲染。 这样的方法最后会导致我们传入{{user.password}}或者是{{run_cmd()}}等函数执行各种命令。 并且此编程方法也会导致xss的形成,如果我们传入跨站脚本攻击代码即可形成xss。

漏洞修复

Hello %s

中的​​%s​​​替换成​​{{id}}​​ 将

return render_template_string(template, user=user)

修改成

return render_template(template, user=user)

分析和步骤

首先我们打开页面.发现访问的页面是正确的,登录名为admin 我们将鼠标移到admin上,会发现一个参数id为admin 这时候我们将链接中的id参数值admin改成test,并访问,显示为欢迎test。 然后我们把参数值改成如下​​​poc?id={{run_cmd("cat /etc/passwd")}}​​即可执行远程命令

/etc/passwd")}}

在解析Flask模板时,会把​​{{run_cmd("cat /etc/passwd")}}​​​当成​​run_cmd("cat /etc/passwd")​​来执行。

在本案例中开发者并未使用官方推荐编程习惯来渲染模板,导致客户端可控花括号,即能正确使用模板语法来构造自己的恶意操作。

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:测量不同设备中几个Android依赖注入框架的性能
下一篇:Tone.js一个Web浏览器中音频框架创建交互式音乐
相关文章

 发表评论

暂时没有评论,来抢沙发吧~