二階SQL注入理解與體會
二階SQL注入理解與體會
一:SQL注入分類
SQL注入一般分為兩類:一階SQL注入(普通SQL注入),二階SQL注入
二:二者進行比較
0x01:一階SQL注入:
1;一階SQL注入發生在一個HTTP請求和響應中,對系統的攻擊是立即執行的;
2;攻擊者在http請求中提交非法輸入;
3;應用程式處理非法輸入,使用非法輸入構造SQL語句;
4;在攻擊過程中向攻擊者返回結果。
0x02:二階SQL注入:
1;攻擊者在http請求中提交惡意輸入;
2;惡意輸入儲存在資料庫中;
3;攻擊者提交第二次http請求;
4;為處理第二次http請求,程式在檢索儲存在資料庫中的惡意輸入,構造SQL語句;
5;如果攻擊成功,在第二次請求響應中返回結果。
三:危害比較
一階SQL注入和二階SQL注入危害一致,攻擊者獲得資料庫的訪問許可權,竊取相關資料,但是一階SQL注入可以通過相關工具掃描出來,而二階SQL注入更微妙,通常二階SQL注入漏洞的測試主要依據測試人員對系統功能的理解和對常出錯位置經驗的判斷,但是應用功能的增加,經驗的測試結果並不能保證測試結果。
四:二階SQL注入原理講解
假設一個網站資料庫中存在一個使用者名稱為:“admin”,密碼為:“123456”。攻擊者註冊使用者名稱為:“admin’-- ”,密碼為:“123”;程式中的程式碼為:
String name=StringEscapeUtiles.escapeSql(request.getParameter(“Name”));
String pwd=StringEscapeUtiles.escapeSql(request.getParameter(“pwd”));
String sql1=“insert into user(username,password) values (“name”,“pwd”)”;
程式在把輸入資料存入資料庫之前,對輸入的資料中的單引號進行了轉義來防止惡意輸入對對資料庫中資料帶來的影響,避免了一階注入帶來的問題,但是在資料庫中存入的使用者名稱任然為:“admin’-- ”。現在攻擊者要更新密碼,程式會首先判斷使用者是否存在,程式碼為:
String name=StringEscapeUtiles.escapeSql(request.getParameter(“Name”));
String oldpwd=StringEscapeUtiles.escapeSql(request.getParameter(“oldpwd”));
String newpwd=StringEscapeUtiles.escapeSql(request.getParameter(“newpwd”));
String sql2 = “select * from user where username=“name” and password=“oldpwd””;
確認使用者存在且密碼正確時,應用程式執行更新密碼語句:
sql3=“update user set password=“newpwd” where username=“username””;
在資料庫中執行語句為:
update user set password =“111111” where username=‘admin’-- ’
在資料庫語句這種“-- ”表示註釋,因此“-- ”後面的語句不會執行;最終攻擊者改變的不是“admin’-- ”的密碼,而是admin的密碼,從而實現攻擊。
以上為本人閱讀相關材料並結合個人體會所寫,有不當之處敬請指教。