DVWA 總結(jié)系列之 CSP 篇

前前言

本人的個人博客網(wǎng)址:www.QmSharing.space澎怒,所有的文章都可以在里面找到爆土,歡迎各位大佬前來參觀并留下寶貴的建議哮幢,大家一起學(xué)習(xí)一起成長 :-)

本題目標(biāo)

本題好像是 v1.10 版本新加入的, 因此網(wǎng)上的分析文章并不是很多.

CSP(Content Security Policy) 是一種用來防止 XSS 攻擊的手段, 通過在頭部添加 Content-Security-Policy 的相關(guān)參數(shù), 來限制未知(不信任)來源的 javascript 的執(zhí)行從而防止 XSS 攻擊. 本題并不是要介紹這種技術(shù)有什么漏洞, 而且本題所導(dǎo)致的 XSS 攻擊都是因?yàn)殚_發(fā)者的不正當(dāng)配置所致. 所以本題僅僅讓你能成功執(zhí)行一個彈框的 XSS 注入即可.

Low

因?yàn)?CSP 主要是客戶端進(jìn)行防御, 所以服務(wù)端的核心代碼應(yīng)該是沒有變的(除了 CSP 頭):

# 主要就是設(shè)置 HTTP 頭部信息, 后面就不粘代碼了, 直接分析頭部即可
$headerCSP = "Content-Security-Policy: script-src 'self' https://pastebin.com  example.com code.jquery.com https://ssl.google-analytics.com ;"; // allows js from self, pastebin.com, jquery and google analytics.

header($headerCSP);

這個頭部信息的具體含義可以參考這個 參考文檔, 這里直接理解就是能從 https://pastebin.com 等網(wǎng)站加載 javascript, 你可以試試從自己的搭建的服務(wù)器中加載 javascript, 結(jié)果如下:

加載結(jié)果

可以明顯的看到, 這個 javascript 的加載被 blocked 了(估計 Firefox 的插件 No-script 也是基于這個的). 既然不能從未指定的源加載 javascript, 那我可以從它信任的源, 比如 https://pastebin.com 中來加載. 可能有人不知道這個網(wǎng)站是什么, 我開始也不知道的, 但你打開就會發(fā)現(xiàn)這就是個共享粘貼板, 允許你粘貼任何文本內(nèi)容.

那我們就可以在這個粘貼板網(wǎng)站中寫入一段惡意 javascript, 比如 alert("hacked"), 然后, 通過該網(wǎng)站的 raw 形式(原生)來顯示, 我當(dāng)時生成的網(wǎng)址是這個 惡意 javascript, 然后你就可以在 URL 欄中輸入這個網(wǎng)址, 讓瀏覽器將這個遠(yuǎn)程加載文本當(dāng)作 javascript 來執(zhí)行. Boom! 成功注入, 結(jié)果你們自己去試哈.

Medium

通過瀏覽器抓包可以看到:

script-src 'self' 'unsafe-inline' 'nonce-TmV2ZXIgZ29pbmcgdG8gZ2l2ZSB5b3UgdXA=';

這次使用了兩個新的參數(shù)(self 不算哈). 其中 'unsafe-inline' 代表可以執(zhí)行諸如 onclick 等事件或 script 標(biāo)簽內(nèi)的內(nèi)容這類 javascript, 而后者就是指如果你要使用 script 標(biāo)簽加載 javascript, 你需要指明其 nonce 值, 比如 <script nonce="TmV2ZXIgZ29pbmcgdG8gZ2l2ZSB5b3UgdXA=">alert('hacked')</script>這個就能正常加載, 從而造成 XSS 注入.

但需要注意的是, 如果你測試 <img src=hacked onerror=alert('hacked')> 這類在標(biāo)簽內(nèi)執(zhí)行的 javascript, 會得到如下結(jié)果:

加載標(biāo)簽 js

錯誤提示告訴我們, 因?yàn)轭^部指定了 nonce 值, 所以自動忽略了 'unsafe-inline' 這個參數(shù). 因此可以判斷這兩個參數(shù)是不能共存的, 而且如果共存, 后者是會覆蓋前者的.

這里還有個有意思的地方, 你看那個 nonce 的值很明顯是個 base64 編碼, 我就無聊去解碼了一下, 嗯... 原文"TmV2ZXIgZ29pbmcgdG8gZ2l2ZSB5b3UgdXA="轉(zhuǎn)換后是 "Never going to give you up", 還是給出題者 666. 不過呢, 正確的防御方式下的 nonce 值不應(yīng)該是個固定值, 而是應(yīng)該是個隨機(jī)生成的值, 這樣才能真正達(dá)到防止 XSS 的目的.

High

這個級別已經(jīng)沒有輸入框了, 不過題目已經(jīng)給了足夠多的提示. 首先先看一下 CSP 頭, 發(fā)現(xiàn)只有 script-src 'self';, 看來只允許本界面加載的 javascript 執(zhí)行. 然后研究了一下這個點(diǎn)擊顯示答案的邏輯(邏輯在 source/high.js里), 大致如下: 點(diǎn)擊按鈕 -> js 生成一個 script 標(biāo)簽(src 指向 source/jsonp.php?callback=solveNum), 并把它加入到 DOM 中 -> js 中定義了一個 solveNum 的函數(shù) -> 因此 script 標(biāo)簽會把遠(yuǎn)程加載的 solveSum({"answer":"15"}) 當(dāng)作 js 代碼執(zhí)行, 而這個形式正好就是調(diào)用了 solveSum 函數(shù), 然后這個函數(shù)就會在界面適當(dāng)?shù)奈恢脤懭氪鸢?

本來嘛, 應(yīng)該是沒辦法修改在服務(wù)器的 jsonp.php 文件的(除非結(jié)合別的漏洞, 拿 shell 后修改). 然而, 我后來在查看服務(wù)端源碼的時候發(fā)現(xiàn)了這個:

if (isset ($_POST['include'])) {
$page[ 'body' ] .= "
    " . $_POST['include'] . "
";
}
# 剩余的顯示代碼

666, 竟然還偷偷接收 include 參數(shù)(不清楚是不是作者復(fù)用了之前 Medium 的代碼). 總之, 這肯定能作為一個注入點(diǎn), 我開始打算用簡單粗暴的 <script>alert('hacked')</script> 來搞定的, 誰知道, 這種是屬于 'unsafe-inline' 形式的, 所以被限制執(zhí)行了. 嗯... 既然如此的話, 那我就利用 src 吧.

if (array_key_exists ("callback", $_GET)) {
    $callback = $_GET['callback'];
} else {
    return "";
}

$outp = array ("answer" => "15");
# 這個 callback 可以被控制的
echo $callback . "(".json_encode($outp).")";

這個即使你不看源碼, 你做幾個測試也會發(fā)現(xiàn), 那個 callback 參數(shù)可以被操控以生成任何你想要得到的結(jié)果, 比如 alert, 因此可以構(gòu)造 Payload: <script src="source/jsonp.php?callback=alert('hacked');"></script>, 并把這個當(dāng)做 include 參數(shù)傳給界面就 Boom! 注入成功!

Impossible

該級別主要還是修復(fù)了 callback 參數(shù)可被控制問題(畢竟這是問題根源):

$outp = array ("answer" => "15");
# 寫死的話, 就沒辦法被控制了
echo "solveSum (".json_encode($outp).")";

參考鏈接

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末仿吞,一起剝皮案震驚了整個濱河市装蓬,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌借尿,老刑警劉巖刨晴,帶你破解...
    沈念sama閱讀 216,651評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異路翻,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)茄靠,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,468評論 3 392
  • 文/潘曉璐 我一進(jìn)店門茂契,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人慨绳,你說我怎么就攤上這事掉冶。” “怎么了脐雪?”我有些...
    開封第一講書人閱讀 162,931評論 0 353
  • 文/不壞的土叔 我叫張陵厌小,是天一觀的道長。 經(jīng)常有香客問我战秋,道長璧亚,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,218評論 1 292
  • 正文 為了忘掉前任脂信,我火速辦了婚禮癣蟋,結(jié)果婚禮上透硝,老公的妹妹穿的比我還像新娘。我一直安慰自己疯搅,他們只是感情好濒生,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,234評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著幔欧,像睡著了一般罪治。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上礁蔗,一...
    開封第一講書人閱讀 51,198評論 1 299
  • 那天觉义,我揣著相機(jī)與錄音,去河邊找鬼瘦麸。 笑死谁撼,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的滋饲。 我是一名探鬼主播厉碟,決...
    沈念sama閱讀 40,084評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼屠缭!你這毒婦竟也來了箍鼓?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,926評論 0 274
  • 序言:老撾萬榮一對情侶失蹤呵曹,失蹤者是張志新(化名)和其女友劉穎款咖,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體奄喂,經(jīng)...
    沈念sama閱讀 45,341評論 1 311
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡铐殃,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,563評論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了跨新。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片富腊。...
    茶點(diǎn)故事閱讀 39,731評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖域帐,靈堂內(nèi)的尸體忽然破棺而出赘被,到底是詐尸還是另有隱情,我是刑警寧澤肖揣,帶...
    沈念sama閱讀 35,430評論 5 343
  • 正文 年R本政府宣布民假,位于F島的核電站,受9級特大地震影響龙优,放射性物質(zhì)發(fā)生泄漏羊异。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,036評論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望球化。 院中可真熱鬧秽晚,春花似錦、人聲如沸筒愚。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,676評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽巢掺。三九已至句伶,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間陆淀,已是汗流浹背考余。 一陣腳步聲響...
    開封第一講書人閱讀 32,829評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留轧苫,地道東北人楚堤。 一個月前我還...
    沈念sama閱讀 47,743評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像含懊,于是被迫代替她去往敵國和親身冬。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,629評論 2 354