2018 RCTF-WEB題 AMP記錄
這是一道RCTF2018的web題,22solved
題目地址:
http://amp.2018.teamrois.cn
github地址:
https://github.com/zsxsoft/my-rctf-2018/tree/master/amp
0x01 嘗試
打開頁面,提示輸入name作為請求參數:
測試name參數yunsle,頁面提示如下:
點擊STOP TRACKING ME後,提示將會記錄請求request並發送給admin:
查看cookie內容,發現提示,flag在admin的cookie中:
提示中提到記錄請求以及將會發送給admin,很自然地想到XSS,於是嘗試name參數:
但是頁面並沒有彈窗,並且在控制台輸出:
查看http響應頭,發現了做了CSP內容安全策略,並且設置了script-src
了解CSP可以看這裡:https://developer.mozilla.org/zh-CN/docs/Web/Security/CSP
script-src屬性開啟將對當前頁面上可執行的JS源進行了限制
查看源代碼可以看到,所有引用的JS都申明了一個nonce屬性,nonce屬性中的value是服務端隨機生成的字元串
只有申明了nonce屬性,並且nonce值和服務端隨機數一致時才能執行JS來源:
於是,自然地,嘗試繞過這裡的CSP規則
之前有看到過針對nonce的繞過操作,是利用頁面上XSS點之後較近的JS引用中的nonce屬性,簡單來說可以看下面實例:
當插入點可控時,可以建立如下的payload:
此時,payload插入之後的頁面上,將變成:
這樣就講nonce包含到了構建的JS引用中,導致繞過
在這裡,用上述繞過姿勢引入放在伺服器上的JS代碼,在代碼中創建img標籤,在img的src中加入cookie值
最後src中將打到ngrox上
構建payload如下:
伺服器上JS內容:
name參數設置為payload提交後,查看本地瀏覽器已經執行了從伺服器上載入的JS代碼,並且將本地的cookie打到了ngrox:
接下來點擊STOP TRACKING ME按鈕後,等待伺服器端admin查看頁面,將cookie打過來
但是等了一會後,接收到的打過來的cookie依然不是真正的flag!
到這裡就懵逼了,打回來的cookie裡面仍然是提示:
用ceye再嘗試接收了一次,仍然是失敗的結果:
0x02 復現
等比賽結束,看WP後發現,考點是在AMP上(題目和代碼注釋里都提示了,然而沒有去想。。)
AMP的官網:
https://www.ampproject.org/zh_cn/
簡單介紹就是:
這題的頁面中,使用了AMP,因此就引入了AMP的標籤,這就引入了AMP標籤的一些特性
官方文檔中,有如下的介紹:
在官方文檔上,對amp-pixel標籤有這樣一個代碼實例:
其中cid-scope-cookie-fallback-name意思是:文檔未由AMP代理服務時,備用cookie的名稱,如果未提供,則cid作用域將用作cookie名稱。
於是當構建如下payload時:
將會把cookie的FLAG的值賦值為變數值
對以上payload進行復現嘗試,拿到flag:
0x03 總結
做題還是有一個快速學習能力的要求,很多東西都是在題目剛剛接觸時才會接觸到一個新的事物。這時候就需要快速對新事物進行了解,並且找到利用點,這點是最重要的。
另外,這題中AMP的功能和標籤要能生效,必須要能走https協議並且不能掛Burpsuit代理
如果掛了代理,https協議失效,v0.js並沒有真正生效,AMP標籤也會失效:
在一開始做題的時候,開了瀏覽器的Burpsuit代理,所以使用CSP繞過payload可以提交上去(沒有被AMP載入的v0.js禁止),但是打不到flag
當不走Burpsuit的時候,payload是提交不了的,會被AMP載入的JS限制,如圖:


※在午餐前獲取內部網路域管理員的五大方法
※1.5億 MyFitnessPal 賬戶信息遭泄露
TAG:安全客資訊平台 |