背景:
團(tuán)隊(duì)內(nèi)一位資深同事在去年給大家share了最新的OWASP Top 10 的變化以及內(nèi)容褒颈,并結(jié)合了OWASP的Juice Shop進(jìn)行講解醉箕,內(nèi)容非常簡潔易懂犬性,讓我以最簡單的方式了解到了安全測試是什么隶债,希望通過整理,讓更多的人有所了解
環(huán)境準(zhǔn)備:
- 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)后
網(wǎng)頁中打開localhost:3000父晶,即可看到Juice Shop的首頁
- Charles哮缺,下載安裝,免費(fèi)試用一個(gè)月
實(shí)踐 - OWASP Top 10
首先 OWASP 是 Open Web Application Security Project 的縮寫甲喝,一個(gè)非盈利性組織尝苇, 詳情請(qǐng)自行Google
下圖為2013年和2017年的對(duì)比版本:
A1:2017 - 注入
練習(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條
視頻:練習(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)
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
步驟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ù)
練習(xí)11 更改訂單讓自己錢包鼓起來
步驟1:在購物車中點(diǎn)增加商品數(shù)量卿闹,截獲請(qǐng)求http://localhost.charlesproxy.com:3000/rest/basket/3
步驟2:修改返回的response,就可以看到總價(jià)變成了負(fù)數(shù)
練習(xí)12 重定向到指定網(wǎng)址
步驟1:將鼠標(biāo)滑動(dòng)到右上角的Fork me on Github, 在DevTools的頁面中可以看到萝快,a標(biāo)簽的href屬性有個(gè)重定向地址
步驟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改成了杯子和櫻桃的圖片,左上角
練習(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)過任何處理的輸入
練習(xí)16 持久化的XSS攻擊
步驟1: 打開charles
步驟2:在注冊(cè)界面,注冊(cè)一個(gè)賬號(hào)膝宁,charles中會(huì)看到一個(gè)API
步驟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)求了
步驟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攻擊成功
步驟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>
練習(xí)18 根本不用前端的持久化XSS攻擊
步驟1:在search頁面里嘴高,點(diǎn)擊某一個(gè)商品的logo竿音,注意查看DevTools里有會(huì)有這樣一個(gè)請(qǐng)求
步驟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 文檔潜沦,
步驟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
步驟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