SQL注入與XSS跨站腳本的基本原理
前言:
各位大牛好,我是Alone,這篇文章主要講XSS/SQL注入的一個基本原理,適合新手入門學習,大佬勿噴,小弟不才,這些原理都是通過自己的實戰和摸索得來的經驗,可能有認識錯誤的地方,還望大佬指點一二,小弟感激不盡~
一、XSS注入
0)什麼是 XSS?
答:XSS攻擊全稱跨站腳本攻擊,是為不和層疊樣式表(Cascading Style Sheets, CSS)的縮寫混淆,故將跨站腳本攻擊縮寫為XSS,XSS是一種在web應用中的計算機安全漏洞,它允許惡意web用戶將代碼植入到提供給其它用戶使用的頁面中。 (引用百度百科)
1)什麼是XSS攻擊?
答:XSS是一種經常出現在web應用中的計算機安全漏洞,它允許惡意web用戶將代碼植入到提供給其它用戶使用的頁面中。比如這些代碼包括HTML代碼和客戶端腳本。攻擊者利用XSS漏洞旁路掉訪問控制——例如同源策略(same origin policy)。這種類型的漏洞由於被黑客用來編寫危害性更大的網路釣魚(Phishing)攻擊而變得廣為人知。對於跨站腳本攻擊,黑客界共識是:跨站腳本攻擊是新型的「緩衝區溢出攻擊「,而JavaScript是新型的「ShellCode」。 (引用百度百科)
2)XSS分類?
答:存儲型、反射型。
3)傳統防禦
答:過濾敏感標籤
4)XSS注入原理
答:(個人總結)通過前端表單數據傳遞到後台,後台沒有經過任何的防禦或過濾措施,後台再將數據返回給前端導致出現XSS漏洞,具體看實戰操作!
二、SQL注入
0)什麼是SQL注入?
答:所謂SQL注入,就是通過把SQL命令插入到Web表單提交或輸入域名或頁面請求的查詢字元串,最終達到欺騙伺服器執行惡意的SQL命令。具體來說,它是利用現有應用程序,將(惡意的)SQL命令注入到後台資料庫引擎執行的能力,它可以通過在Web表單中輸入(惡意)SQL語句得到一個存在安全漏洞的網站上的資料庫,而不是按照設計者意圖去執行SQL語句。[1]比如先前的很多影視網站泄露VIP會員密碼大多就是通過WEB表單遞交查詢字元暴出的,這類表單特別容易受到SQL注入式攻擊。 (引用百度百科)
1)SQL注入原理?
答:SQL注入攻擊指的是通過構建特殊的輸入作為參數傳入Web應用程序,而這些輸入大都是SQL語法里的一些組合,通過執行SQL語句進而執行攻擊者所要的操作,其主要原因是程序沒有細緻地過濾用戶輸入的數據,致使非法數據侵入系統。
(引用百度百科)
2)防護
歸納一下,主要有以下幾點:
0)永遠不要信任用戶的輸入。對用戶的輸入進行校驗,可以通過正則表達式,或限制長度;對單引號和
雙"-"進行轉換等。
1)永遠不要使用動態拼裝sql,可以使用參數化的sql或者直接使用存儲過程進行數據查詢存取。
2)永遠不要使用管理員許可權的資料庫連接,為每個應用使用單獨的許可權有限的資料庫連接。
3)不要把機密信息直接存放,加密或者hash掉密碼和敏感的信息。
4)應用的異常信息應該給出儘可能少的提示,最好使用自定義的錯誤信息對原始錯誤信息進行包裝。
5)sql注入的檢測方法一般採取輔助軟體或網站平台來檢測,軟體一般採用sql注入檢測工具jsky,網站平台就有億思網站安全平台檢測工具。MDCSOFT SCAN等。採用MDCSOFT-IPS可以有效的防禦SQL注入,XSS攻擊等。
實驗如下:
(一)
0)測試環境:Tomcat 8.5
1)代碼審計:Java
2)具有 XSS 注入漏洞的代碼;
3)具有 SQL 注入漏洞的代碼;
(二)XSS 原理解析
0)XSS 注入代碼審計:
前端代碼:
1)注入過程:
打開評論區
評論:哇,文章好精彩啊,提交表單之後,數據插入資料庫,然後前端展示評論
接下來我們嘗試在評論區提交以下html標籤試試?
嘗試提交一個
結果發現,插入了一個按鈕,察看下源代碼試試?
發現我們提交的評論被原樣展示了出來
因此判定此處存在XSS漏洞;
插入資料庫的數據會持久化保存,因此,此類型的XSS漏洞為存儲性XSS漏洞。
那麼什麼又是反射型XSS?
代碼我就懶得再寫了,我是這樣理解的(經過數據持久化的就叫存儲型,反之則反射型)
還有一種說法,反射性是需要某個條件觸發才會執行你注入的代碼,比如滑鼠的哦javascript 中的 onclick 事件等等。
(三)SQL注入原理解析
DAO 層代碼審計:
發現是代碼拼接字元串拼成一個完整的sql語句;
控制層源碼:
登錄頁面源碼:
順便給大家看看我的user表裡的數據,為了方便演示我就不用md5加密的方式登錄了。
接下來嘗試從前端登錄(瞎Jb輸入的,資料庫中正確的用戶名和密碼是testSQL: testSQL)
結果顯示
如果檢測出了sql注入漏洞,那麼我們該如何使用錯誤的用戶名和密碼登錄成功呢?
請看下面分析:
前面說了,後台程序是用的拼接字元串的方式來完成一條sql語句,那麼構思。
查詢語句一般都是select username,password from user where username=』username』 and password = 『password』
後台的sql語句,由此可得,增加一個判斷。
select username,password from user where username=』username』 and password = 『password』 or 『1』 = 『1』
接下來我在前端演示一遍。
登錄成功了!
我們看下傳到後台之後的sql語句是怎麼樣的:
這是後台列印的log
原理很簡單,他拼裝sql字元串的時候,我們可以通過條件語句來控制這個sql。
比如剛剛
select name,password from book_user where name="username" and password="username" or "1" = "1"
username" or "1" = "這個是我們傳進去的參數
正常情況下是這樣:
select name,password from book_user where name="username" and password="username"
這時候我們在腦海里想像一下,一個變數被賦值然後拼接字元串,如何讓它執行我的條件語句。
紅色部分就是我們提交的參數如:
0)密碼參數Alone
Sql: select name,password from book_user where name="username" and password="Alone"
1)密碼參數Alone』
Sql: select name,password from book_user where name="username" and password="Alone""
當然這樣後台會直接報錯,通常會使用這種方式檢測是否存在sql注入漏洞。
2)密碼參數Aloneor "1"="1
Sql: select name,password from book_user where name="username" and password="Alone"or "1"="1"
這樣是不是剛好拼接成一個完整的sql語句?
Ok,今天你收穫了嗎?
本文僅用於技術研究與探討,任何個人,團體,組織不得將其用於非法目的,違法犯罪必將受到法律制裁。
本文已獲作者授權,轉載務必註明作者及出處。
TAG:安徽鋒刃科技 |