本文目录导读:

SSTI模板注入从零到一:手把手教你搭一个漏洞靶场(含避坑指南)
哎呦喂,各位看官老爷们,今儿咱们不聊那些虚头巴脑的,就来点实打实的干货——怎样SSTI!我知道,一提起这个,很多小伙伴脑子里就俩字“头大”,别急别急,我先问你个问题:你光会看SSTI的Payload有啥用?纸上谈兵谁不会啊!关键得自己动手搭个环境,亲手“打”进去,那才叫真本事!
我这人吧,记性不太好,光看文档根本记不住,非得自己折腾一遍才能理解,今儿我就带你手把手把SSTI的“练功房”搭起来,保准你学完就能上手,成就感爆棚!
环境准备:别慌,就仨家伙事儿
你得先有个Python环境,这个估计大家都装了吧?没装的赶紧去官网下一个,装的时候记得勾上“Add Python to PATH”,不然待会儿命令行里敲python都找不到,那可就尴尬了,我当初就栽过这跟头,气得我直拍大腿,哈哈哈!
咱得用到一个老熟人——Flask,一个轻巧灵便的Python Web框架,用来搭SSTI靶场那叫一个顺手,你就在命令行敲一句:pip install flask,搞定!
还得有个趁手的工具,Burp Suite或者Postman都行,我个人还是喜欢Burp,拦截请求改参数,看着那个回显,嗯~~~带劲!
写个“漏”网之鱼:代码得这么写
重点来了啊!咱们得写个带“洞”的小应用,你可别笑,这个“洞”得挖得巧妙,不能太生硬,不然练起来没感觉。
我给你看个例子,你品品:
from flask import Flask, request, render_template_string
app = Flask(__name__)
@app.route('/')
def home():
return '<h3>嘿,朋友!输入你的名字,我打印给你看。</h3><form><input name="name"><button>提交</button></form>'
@app.route('/hello')
def hello():
name = request.args.get('name', 'Guest')
template = f'<p>你好呀,{name}!</p>'
return render_template_string(template)
if __name__ == '__main__':
app.run(debug=True)
看到没?毛病就出在render_template_string(template)这一行,咱把用户输入的name直接就拼进模板字符串里了,这就好比你把家里的钥匙插在锁孔里忘了拔,然后还开着门大喊“家里没人”,这不是明摆着招贼嘛!
这个漏洞,专业点讲,就是未过滤用户输入直接渲染模板,你想想,如果用户输入的不是一个名字,而是一段模板语法呢?那服务器不就得乖乖执行了?
动手“踩”一脚:验证漏洞存在
代码写好了,别光看,得跑起来!在命令行里切到代码目录,输入python app.py,看到那个熟悉的Running on http://127.0.0.1:5000,心里就踏实了。
这时候,你在浏览器地址栏敲:
http://127.0.0.1:5000/hello?name=admin
页面回显“你好呀,admin!”,没毛病,那咱试试输入这个:
http://127.0.0.1:5000/hello?name={{7*7}}
哇哦!看到页面上的“49”了吗?*如果回显是49而不是{{77}},那就说明模板引擎把你的输入当“自己人”给执行了!** 那一刻,就像你拿钥匙试着捅开了一把锁,居然真的开了,又紧张又刺激。
深入“淘金”:试探不同的魔法
既然能算数,那肯定能干更多事儿,咱得一步一步试着来,就像开盲盒一样,每敲一个Payload都心里痒痒的。
先试试能不能调用对象的方法,比如{{''.__class__.__mro__}},看看能不能探出类的继承链,再试试读文件喽,用{{config.__class__.__init__.__globals__['os'].popen('ls').read()}}——这句话有点长,而且得一步步确认环境是不是支持。
但记住啊,SSTI的攻击逻辑是分步骤的:先探测模板引擎类型,再找可利用的类对象,最后想办法执行系统命令或读文件,这就像你追一个姑娘,得先聊天,再要微信,最后才能约出来吃饭,一步一个脚印,心急吃不了热豆腐。
避坑指南:过来人的碎碎念
好了,靶场搭起来,你也能跑通了,但我还是得唠叨几句,这些坑我可是都踩过,那叫一个泪流满面啊:
- 别用
debug=True跑生产环境! 我是为了方便调试才这么写的,你要是拿到服务器上这么干,那不是SSTI了,那是裸奔!别人不小心一个报错就让你的源码全暴露了,那滋味,酸爽! - Python版本有讲究,有些Payload在Python2里能跑,到了Python3就废了,我建议你就用Python3.8以上,一来安全,二来语法也稳定。
- 别光练不总结,每测出一个Payload,就想想它为啥生效,后台到底发生了什么,我当初就是记了一堆笔记,边画图边理解,才慢慢悟透的。
结尾的碎碎念
所以说啊,怎样SSTI搭建,说难也不难,一个Flask应用,两个参数,几个括号,就把门给打开了,关键是你要动手去试,去感受那个“输入被当成代码执行”的瞬间,那感觉,比喝了冰可乐还爽!
搭好靶场,咱们才能安心地研究怎么防御,对吧?知己知彼,百战不殆嘛!好了,今天这篇口水话就到这儿,我得去喝口水润润嗓子,你赶紧试试,有结果了回来告诉我,看看你“打通关”了没?嘻嘻!