怎样SSTI怎么搭建

极客

本文目录导读:

怎样SSTI怎么搭建

  1. 环境准备:别慌,就仨家伙事儿
  2. 写个“漏”网之鱼:代码得这么写
  3. 动手“踩”一脚:验证漏洞存在
  4. 深入“淘金”:试探不同的魔法
  5. 避坑指南:过来人的碎碎念
  6. 结尾的碎碎念

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的攻击逻辑是分步骤的:先探测模板引擎类型,再找可利用的类对象,最后想办法执行系统命令或读文件,这就像你追一个姑娘,得先聊天,再要微信,最后才能约出来吃饭,一步一个脚印,心急吃不了热豆腐。

避坑指南:过来人的碎碎念

好了,靶场搭起来,你也能跑通了,但我还是得唠叨几句,这些坑我可是都踩过,那叫一个泪流满面啊:

  1. 别用debug=True跑生产环境! 我是为了方便调试才这么写的,你要是拿到服务器上这么干,那不是SSTI了,那是裸奔!别人不小心一个报错就让你的源码全暴露了,那滋味,酸爽!
  2. Python版本有讲究,有些Payload在Python2里能跑,到了Python3就废了,我建议你就用Python3.8以上,一来安全,二来语法也稳定。
  3. 别光练不总结,每测出一个Payload,就想想它为啥生效,后台到底发生了什么,我当初就是记了一堆笔记,边画图边理解,才慢慢悟透的。

结尾的碎碎念

所以说啊,怎样SSTI搭建,说难也不难,一个Flask应用,两个参数,几个括号,就把门给打开了,关键是你要动手去试,去感受那个“输入被当成代码执行”的瞬间,那感觉,比喝了冰可乐还爽!

搭好靶场,咱们才能安心地研究怎么防御,对吧?知己知彼,百战不殆嘛!好了,今天这篇口水话就到这儿,我得去喝口水润润嗓子,你赶紧试试,有结果了回来告诉我,看看你“打通关”了没?嘻嘻!

文章版权声明:除非注明,否则均为极客网安-咸鱼原创文章,转载或复制请以超链接形式并注明出处。

目录[+]