帶你理解什么是sql注入攻擊、xss攻擊和cors攻擊
SQL注入
SQL注入就是通過把SQL命令插入到Web表單提交或輸入域名或頁面請求的查詢字符串,最終達到欺騙服務器執(zhí)行惡意的SQL命令。
SQL注入攻擊的總體思路:
- 尋找到SQL注入的位置
- 判斷服務器類型和后臺數(shù)據(jù)庫類型
- 針對不同的服務器和數(shù)據(jù)庫特點進行SQL注入攻擊
SQL注入攻擊實例:
比如,在一個登錄界面,要求輸入用戶名和密碼,可以這樣輸入實現(xiàn)免帳號登錄:
用戶名: ‘or 1 = 1 -- 密 碼:
用戶一旦點擊登錄,如若沒有做特殊處理,那么這個非法用戶就很得意的登陸進去了。這是為什么呢?
下面我們分析一下:從理論上說,后臺認證程序中會有如下的SQL語句:
String sql = “select * from user_table where username=' “+userName+” ' and password=' “+password+” ‘”;
因此,當輸入了上面的用戶名和密碼,上面的SQL語句變成:
SELECT * FROM user_table WHERE username=''or 1 = 1 –- and password=''
分析上述SQL語句我們知道,username=‘ or 1=1 這個語句一定會成功;然后后面加兩個 -,這意味著注釋,它將后面的語句注釋,讓他們不起作用。這樣,上述語句永遠都能正確執(zhí)行,用戶輕易騙過系統(tǒng),獲取合法身份。
如何應對:
- 參數(shù)綁定
使用預編譯手段,綁定參數(shù)是最好的防SQL注入的方法。目前許多的ORM框架及JDBC等都實現(xiàn)了SQL預編譯和參數(shù)綁定功能,攻擊者的惡意SQL會被當做SQL的參數(shù)而不是SQL命令被執(zhí)行。在mybatis的mapper文件中,對于傳遞的參數(shù)我們一般是使用 # 和$來獲取參數(shù)值。 當使用#時,變量是占位符 ,就是一般我們使用javajdbc的PrepareStatement時的占位符,所有可以防止sql注入;當使用 $ 時,變量就是直接追加在sql中,一般會有sql注入問題。 - 使用正則表達式過濾傳入的參數(shù)
XSS攻擊
它指的是惡意攻擊者往Web頁面里插入惡意html代碼,當用戶瀏覽該頁之時,嵌入其中Web里面的html代碼會被執(zhí)行,從而達到惡意攻擊用戶的特殊目的。
XSS的攻擊方式就是想辦法“教唆”用戶的瀏覽器去執(zhí)行一些這個網(wǎng)頁中原本不存在的前端代碼。
我們常用的留言板就可以產(chǎn)生XSS攻擊(持久性),我們知道留言板通常的任務就是把用戶留言的內(nèi)容展示出來。
正常情況下,用戶的留言都是正常的語言文字,留言板顯示的內(nèi)容也就沒毛病。
然而這個時候如果有人不按套路出牌,在留言內(nèi)容中丟進去一行:
<script>alert(“這是一個攻擊”)</script>
那么留言板界面的網(wǎng)頁代碼就會變成形如以下:
那么這個時候問題就來了,當瀏覽器解析到用戶輸入的代碼那一行時會發(fā)生什么呢?
答案很顯然,瀏覽器并不知道這些代碼改變了原本程序的意圖,會照做彈出一個信息框。就像這樣:
<html> <head> <title>留言板</title> </head> <body> <div id=”board” <script>alert(“這是一個攻擊”)</script> </div> </body> </html>
非持久 XSS攻擊:
攻擊者注入的數(shù)據(jù)反映在響應中,一個典型的非持久性XSS攻擊包含一個帶XSS攻擊向量的鏈接(每次攻擊需要用戶點擊)
比如: 正常發(fā)送消息:
//www.test.com/message.php?send=Hello,World!
非正常發(fā)送消息: 接收者接收消息顯示的時候?qū)棾鼍娲翱?/p>
http://www.test.com/message.php?send=<script>alert(‘foolish!')</script>!
XSS攻擊的主要原因就是過于信任客戶端提交的數(shù)據(jù)。
解決方法是不信任任何客戶端提交的數(shù)據(jù),只要是客戶端提交的數(shù)據(jù)就應該先進行相應的過濾處理然后方可進行下一步的操作。
解決的具體方案:
- 將重要的cookie標記為http only, 這樣的話Javascript 中的document.cookie語句就不能獲取到cookie了(如果在cookie中設置了HttpOnly屬性,那么通過js腳本將無法讀取到cookie信息,這樣能有效的防止XSS攻擊);
- 表單數(shù)據(jù)規(guī)定值的類型,例如:年齡應為只能為int、name只能為字母數(shù)字組合
- 對數(shù)據(jù)進行Html Encode 處理(對HTML轉義)
- 過濾或移除特殊的Html標簽,例如: < script >, < iframe > , < for <, > for>, ” for
- 過濾JavaScript 事件的標簽,例如 “οnclick=”, “onfocus” 等等
**需要注意的是:
**在有些應用中是允許html標簽出現(xiàn)的,甚至是javascript代碼出現(xiàn)。因此,我們在過濾數(shù)據(jù)的時候需要仔細分析哪些數(shù)據(jù)是有特殊要求(例如輸出需要html代碼、javascript代碼拼接、或者此表單直接允許使用等等),然后區(qū)別處理!
CORS攻擊
CORS是一個W3C標準,全稱是”跨域資源共享”(Cross-origin resource sharing)。它允許瀏覽器向跨源服務器,發(fā)出XMLHttpRequest請求,從而克服了AJAX只能同源使用的限制。
Cors漏洞就是攻擊者利用Cors技術來獲取用戶的敏感數(shù)據(jù),從而導致用戶敏感信息泄露。
CORS請求可分為兩類:
簡單請求:
請求方式為GET,POST,HEAD這三種之一,并且HTTP頭不超出(Accept,Accept-Language,Content-Language,Lat-Event-ID,Content-Type)這幾種字段。Origin字段用來說明,本次請求來自哪個源(協(xié)議 + 域名 + 端口)
GET /cors HTTP/1.1 Origin: http://api.bob.com Host: api.alice.com Accept-Language: en-US Connection: keep-alive User-Agent: Mozilla/5.0…
當瀏覽器發(fā)現(xiàn)服務器的請求為簡單請求時,會在頭信息里加入Origin字段。Origin字段代表此次請求來自哪個域,服務器就可以檢驗是否來自該域。
如果匹配,服務器就會在響應里增添三個字段:
1.Access-Control-Allow-Origin
2.Access-Control-Allow-Credentials
3.Access-Control-Expose-Headers
其中 Access-Control-Allow-Origin是必須有的,而剩下兩個可有可無。Access-Control-Allow-Origin字段代表允許哪個域訪問。
當字段值為‘*’時,就代表任意域都可以訪問,這樣,就導致了Cors漏洞的產(chǎn)生(可被截取到用戶信息)。
非簡單請求:
非簡單請求是那種對服務器有特殊要求的請求,比如請求方法是PUT或DELETE,或者Content-Type字段的類型是application/json。
非簡單請求的CORS請求,會在正式通信之前,增加一次HTTP查詢請求,稱為"預檢"請求(preflight) 瀏覽器先詢問服務器,當前網(wǎng)頁所在的域名是否在服務器的許可名單之中,以及可以使用哪些HTTP動詞和頭信息字段。
只有得到肯定答復,瀏覽器才會發(fā)出正式的XMLHttpRequest請求,否則就報錯。
解決:
1.不要將Access-Control-Allow-Origin字段設置為*
2.嚴格校驗Origin字段的值
3.HTTPS 網(wǎng)站不要信任HTTP 域
4.不要信任全部自身子域,減少攻擊面
到此這篇關于帶你理解什么是sql注入攻擊、xss攻擊和cors攻擊的文章就介紹到這了,更多相關sql注入攻擊、xss攻擊和cors攻擊內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Iptables防火墻connlimit與time模塊擴展匹配規(guī)則
這篇文章主要為大家介紹了Iptables防火墻connlimit與time模塊擴展匹配規(guī)則詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-08-08Discuz! 4.x SQL injection / admin credentials disclosure exp
Discuz! 4.x SQL injection / admin credentials disclosure exploit...2006-11-11