結(jié)合OWASP Top 10 初識(shí)安全測試

背景:

團(tuán)隊(duì)內(nèi)一位資深同事在去年給大家share了最新的OWASP Top 10 的變化以及內(nèi)容褒颈,并結(jié)合了OWASP的Juice Shop進(jìn)行講解醉箕,內(nèi)容非常簡潔易懂犬性,讓我以最簡單的方式了解到了安全測試是什么隶债,希望通過整理,讓更多的人有所了解

環(huán)境準(zhǔn)備:

  1. Juice Shop Github 地址 請(qǐng)按照其中Docker Container 部分搭建環(huán)境力惯,我采用的是 v7.5.1這個(gè)版本碗誉,所以第2,3步相應(yīng)的變?yōu)?/li>
docker pull bkimminich/juice-shop:v7.5.1
docker run --rm -p 3000:3000 bkimminich/juice-shop:v7.5.1

安裝成功并啟動(dòng)后


Screen Shot 2019-04-02 at 2.50.44 PM.png

網(wǎng)頁中打開localhost:3000父晶,即可看到Juice Shop的首頁

  1. Charles哮缺,下載安裝,免費(fèi)試用一個(gè)月

實(shí)踐 - OWASP Top 10

首先 OWASP 是 Open Web Application Security Project 的縮寫甲喝,一個(gè)非盈利性組織尝苇, 詳情請(qǐng)自行Google

下圖為2013年和2017年的對(duì)比版本:


Screen Shot 2019-04-02 at 3.31.44 PM.png

A1:2017 - 注入

Screen Shot 2019-04-02 at 3.45.26 PM.png

練習(xí)1 預(yù)定圣誕節(jié)特供(已刪除的商品):
步驟1: 打開Juice Shop的首頁
步驟2:打開DevTools -> Network, 用delete按鈕清除請(qǐng)求
步驟3:在Search的地方什么都不用輸入,點(diǎn)擊search搜索埠胖,并在Network中找到發(fā)送的請(qǐng)求 http://localhost:3000/rest/product/search?q=糠溜,看Response中有返回?cái)?shù)據(jù),一共有28條數(shù)據(jù)
步驟4:在search的輸入框里輸入 '; 然后點(diǎn)search直撤,會(huì)在Network里看到發(fā)出去另一條請(qǐng)求并且報(bào)錯(cuò)非竿,檢查后找到報(bào)錯(cuò)內(nèi)容

sql: "SELECT * FROM Products WHERE ((name LIKE '%';%' OR description LIKE '%';%') AND
deletedAt IS NULL) ORDER BY name”

步驟5:找到輸入內(nèi)容拼接的地方,進(jìn)行修改谊惭,在search的輸入框里輸入 '))-- 然后再點(diǎn)擊Search按鈕汽馋,查看Response里的返回?cái)?shù)據(jù)有32條

視頻:
Search.gif

練習(xí)2 登錄管理員用戶
步驟1:進(jìn)入Login 頁面
步驟2:輸入任意賬戶和密碼得到一個(gè)錯(cuò)誤
步驟3:試試 '# 就會(huì)看到報(bào)錯(cuò)信息,找到其中的SQL語句

"sql":"SELECT * FROM Users WHERE email = ''#' AND password = 'e855b45052de9a85655f584589edd0f9'"

步驟4:根據(jù)出錯(cuò)點(diǎn)圈盔,重新輸入 ' or 1=1-- 成功登錄管理員賬戶了

練習(xí)3 找到管理員頁面
步驟1:在DevTools里點(diǎn)Source Tab豹芯,找到dist目錄,點(diǎn)juice-shop.min.js驱敲,搜索 ‘a(chǎn)dministr’ 這個(gè)字符串铁蹈,會(huì)找到一個(gè)頁面url '/administration'
步驟2:在上一個(gè)賬戶里,將URL中的search替換成administration众眨,

http://localhost:3000/#/search
http://localhost:3000/#/administration

步驟3:你就會(huì)見到用戶和Comments

A2:2017 - 失效的身份認(rèn)證

練習(xí)4 更改Bender的密碼
步驟1:在A1的練習(xí)2中的管理員頁面握牧,找到Bender的Email
步驟2:利用SQL注入的方式,即在login的賬戶中輸入 bender@juice-sh.op'-- 進(jìn)入到Bender的賬戶娩梨,可以點(diǎn)擊Contact Us驗(yàn)證沿腰,會(huì)看到Author的地方有Bender的顯示
步驟3:打開DevTools -> Network, 清空請(qǐng)求,點(diǎn)上邊的 Change Password, 分別在當(dāng)前密碼狈定,新密碼颂龙,重復(fù)新密碼三個(gè)輸入框輸入任意字符串习蓬,觀察請(qǐng)求
步驟4:打開新Tab,在新Tab中分別進(jìn)行以下3中嘗試

http://localhost:3000/rest/user/change-password?current=A # 401Password cannot be empty
http://localhost:3000/rest/user/change-password?current=A&new=B # New and repeated password do not match.
http://localhost:3000/rest/user/change-password?current=A&new=B&repeat=C # New and repeated password do not match.

步驟5:猜測是否可以不給默認(rèn)密碼措嵌,進(jìn)行第4次嘗試躲叼,成功。

http://localhost:3000/rest/user/change-password?new=B&repeat=B # 200 success

A3:2017 - 敏感數(shù)據(jù)泄露

例子5 上個(gè)例子中修改密碼時(shí)企巢,密碼是MD5加密的枫慷,非常容易反解密
例子6 非技術(shù)上,請(qǐng)不要把你的密碼曝光到網(wǎng)上

A4:2017 - XML 外部實(shí)體 (XXE)

參考引用:XML外部實(shí)體(XXE)注入詳解

A5:2017 - 失效的訪問控制

練習(xí)7 0星評(píng)價(jià)
步驟1: 進(jìn)入 Contact Us
步驟2:其他內(nèi)容都填好浪规,不給 星星 好評(píng)
步驟3:Submit 按鈕是不讓點(diǎn)的
步驟4:點(diǎn)上3星好評(píng)或听,但立馬點(diǎn)掉
步驟5:可以Submit了,成功

例子8 之前例子中提到的/administration頁面罗丰,理論上是只有管理員可以訪問這個(gè)頁面的神帅,但是可以通過掃描源文件或暴力破解的方式查到

例子9 掃描同時(shí)可以找到一個(gè)被程序員遺忘了的備份文件夾

網(wǎng)上有很多開源掃描工具可以用,作為練習(xí)萌抵,可以使用owasp zap

練習(xí)10 獲取其他人購物車數(shù)據(jù)
步驟1:用 'admin@ juice-sh.op/admin123' 登錄
步驟2:打開Charles, 為了使用Charles,需要把URL替換成以下的URL元镀,這樣就不需要配置代理了

http://localhost.charlesproxy.com:3000/#/search

步驟3:點(diǎn)購物車绍填,DevTools中會(huì)看到發(fā)出去的請(qǐng)求http://localhost.charlesproxy.com:3000/rest/basket/1

Screen Shot 2019-04-03 at 6.15.00 PM.png

步驟4:basketid就是userid,在Charles中修改這個(gè)URL栖疑,改為http://localhost.charlesproxy.com:3000/rest/basket/3讨永,意味著我期望在我的賬戶中請(qǐng)求Bender的購物車數(shù)據(jù),然后執(zhí)行遇革,就會(huì)看到自己的購物車?yán)镲@示的是Bender購物車?yán)锏臄?shù)據(jù)

getProductsOfOthers.gif

練習(xí)11 更改訂單讓自己錢包鼓起來
步驟1:在購物車中點(diǎn)增加商品數(shù)量卿闹,截獲請(qǐng)求http://localhost.charlesproxy.com:3000/rest/basket/3
步驟2:修改返回的response,就可以看到總價(jià)變成了負(fù)數(shù)

Richer.gif

練習(xí)12 重定向到指定網(wǎng)址
步驟1:將鼠標(biāo)滑動(dòng)到右上角的Fork me on Github, 在DevTools的頁面中可以看到萝快,a標(biāo)簽的href屬性有個(gè)重定向地址

image.png

步驟2:將href的鏈接改為 redirect?to=https://google.ie锻霎, 然后點(diǎn)擊頁面的Fork me
步驟3:你會(huì)得到一個(gè)錯(cuò)誤頁面,但是如果你將值改為redirect?to=https://google.ie/?https://github.com/bkimminich/juice-shop揪漩,就會(huì)成功將網(wǎng)頁帶到Google去旋恼,成功

A6:2017 - 安全配置 錯(cuò)誤

暫無

A7:2017 - 跨站腳本攻擊

反射性XSS:APP和API都有未經(jīng)過濾的用戶輸入作為網(wǎng)頁的一部分輸出
存儲(chǔ)型XSS:APP或API會(huì)存儲(chǔ)未經(jīng)過任何處理的用戶輸入,這些數(shù)據(jù)在未來會(huì)被查看
DOM型XSS:JS框架或SPA會(huì)動(dòng)態(tài)引入攻擊者可操縱的數(shù)據(jù)

練習(xí)13 反射型XSS攻擊
反射型攻擊意思就是惡意的query直接來自受害者發(fā)送出去的請(qǐng)求奄容。

步驟1:在啟動(dòng)了Juice Shop的網(wǎng)站冰更,直接訪問http://localhost:3000/#/search?q=%3Cscript%3Ealert(%22XSS1%22)%3C%2Fscript%3E,點(diǎn)擊回車后會(huì)發(fā)現(xiàn)后邊的部分已經(jīng)變成<script>alert("XSS1")<%2Fscript>, 可以看到有popup彈出昂勒,嘗試將尾部中%2F改成%2E蜀细,直接轉(zhuǎn)義成了- 并且沒有攻擊成功,也嘗試改為%2D戈盈,直接q=undefine了奠衔,也沒有攻擊成功,還不知道為什么?如果有知道的小伙伴歡迎補(bǔ)充
而且這是你可見的彈窗了涣觉,最擔(dān)心的是它趁你不注意痴荐,做了不應(yīng)該做的事

練習(xí)14 反射型XSS攻擊
步驟1:
嘗試訪問下面的鏈接

http://localhost:3000/#/search?q=%3Cscript%3Edocument%2EquerySelector%28%22%2Enavbar%2Dlogo%22%29%2EsetAttribute%28%22src%22%2C%22%2Fpublic%2Fimages%2Fproducts%2Fapple_juice%2Ejpg%22%29%3B%3C%2Fscript%3E

其實(shí)它其中真正想表達(dá)的意思是執(zhí)行這段code

document.querySelector(".navbar-logo").setAttribute("src", "/public/images/products/apple_juice.jpg");

它將你的主站logo改成了杯子和櫻桃的圖片,左上角


Screen Shot 2019-04-08 at 3.51.31 PM.png

練習(xí)15 反射型XSS攻擊
步驟1: 嘗試下面的鏈接

http://localhost:3000/#/search?q=%3Cspan%3Ea%3C%2Fspan%3E

會(huì)發(fā)現(xiàn) Search Results旁邊多了一個(gè)a官册,這意味著不僅惡意的payload會(huì)被執(zhí)行生兆,同時(shí)頁面中還有可能試圖顯示未經(jīng)過任何處理的輸入


Screen Shot 2019-04-08 at 3.58.43 PM.png

練習(xí)16 持久化的XSS攻擊
步驟1: 打開charles
步驟2:在注冊(cè)界面,注冊(cè)一個(gè)賬號(hào)膝宁,charles中會(huì)看到一個(gè)API

Screen Shot 2019-04-08 at 4.19.45 PM.png

步驟3:選中users下/鸦难,點(diǎn)擊上邊灰色的六邊形框,Enable Breakpoints
步驟4:在注冊(cè)頁面再填寫一個(gè)注冊(cè)用戶的信息员淫,然后點(diǎn)擊Register合蔽,Charles會(huì)捕捉到這個(gè)請(qǐng)求,然后斷點(diǎn)在那里介返,這時(shí)拴事,已經(jīng)繞過了前端對(duì)Email的校驗(yàn),準(zhǔn)備發(fā)請(qǐng)求了
Screen Shot 2019-04-08 at 4.23.27 PM.png

步驟5:在charles的斷點(diǎn)中選擇Edit Request Tab圣蝎,以及底部的JSON Text刃宵,注意是JSON Text,如果你選了JSON會(huì)發(fā)現(xiàn)徘公,在那里邊編輯Email牲证,會(huì)進(jìn)行字符截?cái)啵沁x擇JSON Text不會(huì)关面,將其中Email的值改為<script>alert("XSS2")</script>坦袍,然后點(diǎn)擊底部的Execute,這個(gè)請(qǐng)求就會(huì)發(fā)出去等太,然后Response回來還會(huì)進(jìn)到這里捂齐,繼續(xù)點(diǎn)擊Execute就行,這樣注入信息就會(huì)被記錄到數(shù)據(jù)庫中持久化下來
步驟6:不知道大家還記得之前的/administration頁面嗎澈驼,嘗試用任意一個(gè)賬戶登錄辛燥,然后訪問這個(gè)頁面,就會(huì)看到有XSS2的彈窗缝其,持久化XSS攻擊成功
Screen Shot 2019-04-08 at 4.29.08 PM.png

步驟7:因?yàn)樵诠芾韱T頁面挎塌,有顯示所有賬戶的Email,當(dāng)我們的注入被讀取時(shí)内边,就會(huì)產(chǎn)生影響

練習(xí)17 持久化的XSS攻擊
步驟1 - 步驟4 同上
步驟5:同樣的方法榴都,將Email 改為<script>document.body.style.background = 'pink';</script>,其他相同
步驟6:仍然是訪問/administration頁面漠其,就會(huì)看到頁面背景色變?yōu)榉凵?br>

Pink.gif

練習(xí)18 根本不用前端的持久化XSS攻擊
步驟1:在search頁面里嘴高,點(diǎn)擊某一個(gè)商品的logo竿音,注意查看DevTools里有會(huì)有這樣一個(gè)請(qǐng)求

Screen Shot 2019-04-09 at 6.37.15 PM.png

步驟2:截取其中一部分,直接打開另一個(gè)Tab拴驮,粘貼進(jìn)去

http://localhost.charlesproxy.com:3000/api/Products/1

步驟3:會(huì)看到如下的Response春瞬,而且這是一個(gè)Get請(qǐng)求

{
"status": "success",
"data": {
"id": 1,
"name": "Apple Juice (1000ml)",
"description": "test",
"price": 1.99,
"image": "apple_juice.jpg",
"createdAt": "2019-04-09T08:19:13.430Z",
"updatedAt": "2019-04-09T10:09:58.409Z",
"deletedAt": null
}
}

步驟4:猜測這個(gè)API也接受Post請(qǐng)求,那我們接下來用Curl命令在命令行里發(fā)一個(gè)Put請(qǐng)求

curl -X PUT "http://localhost:3000/api/Products/1" -H "Content-Type:application/json" --data-binary '{"description":"<script>alert(\"XSS3\")</script>"}'

步驟5:會(huì)看到Response 成功了套啤,在search頁面任何用戶訪問Products頁面都會(huì)看到XSS3彈窗宽气,攻擊成功

A8:2017 - 不安全的反序列化

練習(xí)19 執(zhí)行一個(gè)DoS攻擊
步驟1:用人工檢查或自動(dòng)化URL發(fā)現(xiàn)工具,會(huì)找到一個(gè)Swagger API 文檔潜沦,

http://localhost:3000/api-docs/#/Order/post_orders

步驟2:會(huì)看到一個(gè)Orders的Post請(qǐng)求萄涯,看到其中的Example中orderLinesData字段可以是任意的Json數(shù)據(jù)
步驟3:打開DevTools后點(diǎn)擊Swagger中Try it Out,以及Execute唆鸡,看到"No Authorization header was found"的Error
步驟4:回到剛才的search頁面涝影,打開DevTools,用任意賬號(hào)登錄争占,查看whoami這個(gè)API燃逻,找到Authorization

Screen Shot 2019-04-09 at 7.08.39 PM.png

步驟5:將剛才找到的Authorization內(nèi)容放到Swagger里右上角有一個(gè)Authorize的輸入框里
步驟6:再Execute一下,看到正確的Response
步驟7:接下來我們執(zhí)行一個(gè)DoS攻擊臂痕,DoS即拒絕服務(wù)
步驟8:在Value中將orderLinesData那一行改為并Execute

"orderLinesData": "(function dos() { while(true); })()"

步驟9:看Response就發(fā)現(xiàn)死循環(huán)的代碼已經(jīng)在server里執(zhí)行了唆樊,攻擊成功

A9:2017 - 使用含有已知漏洞的組件

練習(xí)20 找到軟件中使用的組件
步驟1:點(diǎn)菜單中About Us,在點(diǎn)擊文字中唯一的鏈接刻蟹,注意觀察這個(gè)URL的地址,其中含有 /ftp/legal.md?md_debug=true
步驟2:截?cái)鄁tp后邊的部分嘿辟,回車舆瘪,會(huì)看到被程序員遺忘了的備份文件,點(diǎn)擊其中的package.json.bak下載红伦,看到Error提示英古,只有以md和pdf結(jié)尾的文件可以下載
步驟3:將package.json.bak改為package.json.bak%2500.pdf試一下,下載成功昙读,檢查這個(gè)json文件中有

"sanitize-html": "1.4.2"
接下來就可以利用1.4.2版本的sanitize-html中已知的安全漏洞去攻擊網(wǎng)站了召调,查找成功

A10:2017 - 不足的日志記錄和監(jiān)控

練習(xí)21 記錄不安全的嘗試
步驟1:回想之前的下載嘗試,如果有充分的Log記錄蛮浑,這樣的行為是應(yīng)該被記錄的
步驟2:打開另一個(gè)命令行窗口唠叛,執(zhí)行

docker ps

步驟3:找到你正在運(yùn)行的Container, bkimminich/juice-shop:v7.5.1沮稚,執(zhí)行

docker exec -it container_id sh
ls

步驟4:看到一個(gè)類似access.log.2018-10-25的文件
步驟5:執(zhí)行

tail -f access.log.2018-10-25

步驟6:當(dāng)你進(jìn)入search頁面的時(shí)候艺沼,記了很多Log,但再嘗試下載上邊的文件時(shí)蕴掏,并沒有相應(yīng)的Log記錄障般,其實(shí)有很多信息都是可以記錄在Log里的调鲸,但結(jié)合之前的A3,又不應(yīng)該記錄太多敏感信息

總結(jié)

至此挽荡,大部分的情況都已經(jīng)通過例子或練習(xí)share給大家了藐石,這些只是我淺顯的理解,但就這些東西如果我們能舉一反三定拟,也是可以發(fā)現(xiàn)不少問題或者預(yù)防不少問題的

參考:
https://www.owasp.org/images/6/67/OWASP_AppSec_Research_2010_OWASP_Top_10_by_Wichers.pdf

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末于微,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子办素,更是在濱河造成了極大的恐慌角雷,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,252評(píng)論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件性穿,死亡現(xiàn)場離奇詭異勺三,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)需曾,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,886評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門吗坚,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人呆万,你說我怎么就攤上這事商源。” “怎么了谋减?”我有些...
    開封第一講書人閱讀 168,814評(píng)論 0 361
  • 文/不壞的土叔 我叫張陵牡彻,是天一觀的道長。 經(jīng)常有香客問我出爹,道長庄吼,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,869評(píng)論 1 299
  • 正文 為了忘掉前任严就,我火速辦了婚禮总寻,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘梢为。我一直安慰自己渐行,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,888評(píng)論 6 398
  • 文/花漫 我一把揭開白布铸董。 她就那樣靜靜地躺著祟印,像睡著了一般。 火紅的嫁衣襯著肌膚如雪袒炉。 梳的紋絲不亂的頭發(fā)上旁理,一...
    開封第一講書人閱讀 52,475評(píng)論 1 312
  • 那天,我揣著相機(jī)與錄音我磁,去河邊找鬼孽文。 笑死驻襟,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的芋哭。 我是一名探鬼主播沉衣,決...
    沈念sama閱讀 41,010評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼减牺!你這毒婦竟也來了豌习?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,924評(píng)論 0 277
  • 序言:老撾萬榮一對(duì)情侶失蹤拔疚,失蹤者是張志新(化名)和其女友劉穎肥隆,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體稚失,經(jīng)...
    沈念sama閱讀 46,469評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡栋艳,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,552評(píng)論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了句各。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片吸占。...
    茶點(diǎn)故事閱讀 40,680評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖凿宾,靈堂內(nèi)的尸體忽然破棺而出矾屯,到底是詐尸還是另有隱情,我是刑警寧澤初厚,帶...
    沈念sama閱讀 36,362評(píng)論 5 351
  • 正文 年R本政府宣布件蚕,位于F島的核電站,受9級(jí)特大地震影響产禾,放射性物質(zhì)發(fā)生泄漏骤坐。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,037評(píng)論 3 335
  • 文/蒙蒙 一下愈、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧蕾久,春花似錦势似、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,519評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至盹愚,卻和暖如春栅迄,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背皆怕。 一陣腳步聲響...
    開封第一講書人閱讀 33,621評(píng)論 1 274
  • 我被黑心中介騙來泰國打工毅舆, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留西篓,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,099評(píng)論 3 378
  • 正文 我出身青樓憋活,卻偏偏與公主長得像岂津,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子悦即,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,691評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容