BUUCTF | easy_tornado


第一次遇到模板注入的題,趕緊記筆記,此篇相當於對大佬的做法的復現Orz,師傅太強了https://blog.csdn.net/weixin_44255856/article/details/97687299,這道題出自

2018的護網杯


 

 

 在hints里看到條件,猜測  ” filename=/fllllllllllllag&filehash=?“,只要構造出這個就行了,但是現在還缺一個cookie_secret

一開始還以為是自己的cookie,構造好提交出現了一個新的界面 

菜雞無奈開始尋求wp,才知道這個error界面就是注入點!!!當然也怪自己,沒有留一個心眼,查一下 "render" ,“tornado”這兩個關鍵字(;´д`)ゞ

?msg={{handler.settings}}

 

?filename=/fllllllllllllag&filehash=78862cd633ce3a864d49ee092d06262d

 

 


資料:

SSTI模板注入:這一篇作者詳細的介紹了什么是模板,為什么要用模板,相當的掃盲,強推

Twig 模板引擎注入原理:

 <?php

    require_once dirname(__FILE__).'/../lib/Twig/Autoloader.php';
    Twig_Autoloader::register(true);
    $twig = new Twig_Environment(new Twig_Loader_String());
    $output = $twig->render("Hello {{name}}", array("name" => $_GET["name"]));  // 將用戶輸入作為模版變量的值
    echo $output;
?>

  使用 Twig 模版引擎渲染頁面,其中模版含有 {{name}} 變量,其模版變量值來自於 GET 請求參數 $_GET["name"]。顯然這段代碼並沒有什么問題,即使你想通過 name 參數傳遞一段 JavaScript 代碼給服務端進行渲染,也許你會認為這里可以進行 XSS,但是由於模版引擎一般都默認對渲染的變量值進行編碼和轉義,所以並不會造成跨站腳本攻擊:

但是,如果渲染的模版內容受到用戶的控制,情況就不一樣了。修改代碼為:

    <?php
require_once dirname(__FILE__).'/../lib/Twig/Autoloader.php' Twig_Autoloader::register(true); $twig = new Twig_Environment(new Twig_Loader_String()); $output = $twig->render("Hello {$_GET['name']}"); // 將用戶輸入作為模版內容的一部分 echo $output;
?>
 

上面這段代碼在構建模版時,拼接了用戶輸入作為模板的內容,現在如果再向服務端直接傳遞 JavaScript 代碼,用戶輸入會原樣輸出,測試結果顯而易見。在 Twig 模板引擎里, {{var}}  除了可以輸出傳遞的變量以外,還能執行一些基本的表達式然后將其結果作為該模板變量的值,例如這里用戶輸入 name={{2*10}} ,則在服務端拼接的模版內容為:

這里簡單分析一下,由於 {# comment #}  作為 Twig 模板引擎的默認注釋形式,所以在前端輸出的時候並不會顯示,而 {{2*8}}  作為模板變量最終會返回 16  作為其值進行顯示,因此前端最終會返回內容 Hello IsVuln16OK ,如下圖:


作者:帥豬佩奇鏈接:https://www.jianshu.com/p/aef2ae0498df 來源:簡書  著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。

 

 

Python神級框架框架Tornado入門體驗:詳細的介紹了tornado框架

一個普通的tornado web服務器通常由四大組件組成。

  1. ioloop實例,它是全局的tornado事件循環,是服務器的引擎核心,示例中tornado.ioloop.IOLoop.current()就是默認的tornado ioloop實例。
  2. app實例,它代表着一個完成的后端app,它會掛接一個服務端套接字端口對外提供服務。一個ioloop實例里面可以有多個app實例,示例中只有1個,實際上可以允許多個,不過一般幾乎不會使用多個。
  3. handler類,它代表着業務邏輯,我們進行服務端開發時就是編寫一堆一堆的handler用來服務客戶端請求
  4. 路由表,它將指定的url規則和handler掛接起來,形成一個路由映射表。當請求到來時,根據請求的訪問url查詢路由映射表來找到相應的業務handler。

這四大組件的關系是,一個ioloop包含多個app(管理多個服務端口),一個app包含一個路由表,一個路由表包含多個handler。ioloop是服務的引擎核心,它是發動機,負責接收和響應客戶端請求,負責驅動業務handler的運行,負責服務器內部定時任務的執行。

當一個請求到來時,ioloop讀取這個請求解包成一個http請求對象,找到該套接字上對應app的路由表,通過請求對象的url查詢路由表中掛接的handler,然后執行handler。handler方法執行后一般會返回一個對象,ioloop負責將對象包裝成http響應對象序列化發送給客戶端。


 

作者:Python小老弟 鏈接:https://www.jianshu.com/p/d1085dbf321f 來源:簡書 著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。

 

Python中從服務端模板注入到沙盒逃逸的源碼探索 (一):介紹了python的兩個模板引擎——Tornado,Flask

因此,通過handler.application即可訪問整個Tornado。簡單而言通過{{handler.application.settings}}或者{{handler.settings}}就可獲得settings中的cookie_secret

class ErrorHandler(tornado.web.RequestHandler):
    def get(self):
        msg = self.get_argument('msg', 'Error')
        bans = ["\"", "'", "[", "]", "_", "|", "import", "os", "(", ")", "+", "-", "*", "/", "\\", "%", "="]
        for ban in bans:
            if ban in msg:
                self.finish("ORZ")
        with open("error.html", 'w') as f:
            f.write("""<html>
                <head>
                <style>body{font-size: 30px;}</style>
                </head>
                <body>%s</body>
                </html>\n""" % msg)
            f.flush()
        self.render("error.html")

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM