欢乐捕鱼人下载|欢乐捕鱼人的话费怎么用

SQL注入,WEB滲透入門教程

時間:2017-11-27 10:48   編輯:海瑤seo培訓

SQL注入,WEB滲透入門教程

SQL注入

SQL注入原理

對于WEB應用來說,用戶數據等都是存儲在數據庫中的。SQL注入就是攻擊者通過構造一些惡意的SQL查詢語句,讓后臺的數據庫去解析,從而達到入侵目標網絡,獲取敏感信息的攻擊手段。

SQL的危害

一旦數據庫被入侵的話,黑客們可以搞得事情就多了,例如脫你褲子(拖庫),就是把你整個數據庫拿下來,這就意味著你所有的用戶信息泄露。這些被獲取到用戶信息可以可能會被倒賣,二次利用(例如,有些人喜歡一套用戶名密碼用到底的,可以直接做成字典去暴力刷取一些郵箱等)。

數據庫MYSQL基礎

補充一點數據庫的查詢方式,一個MYSQL里面可以有很多個數據庫,一個數據庫里面會有很多張數據表,數據表可以理解為Excel的表格樣式。比如我需要查詢ID=1的用戶,這個命令到達數據庫之后,數據庫會在數據表的ID列,查詢值為1的那格,輸出ID值為1的那行的用戶名。當數據庫查找到在ID這一列一個個往下找的時候,會返回布爾值(TRUE 或者FALSE)ID=1的時候,會返回TRUE。

一個簡單的數據庫查詢語句是這樣的

SELECT first_name, last_name FROM users WHERE user_id = '$id'

【users】這個表中查詢【user_id 】等于【1】(我們在網頁上輸入的值)的【first_name】和【 last_name】。

SQL注入的分類

SQL注入的分類有很多種方式吧,有按注入位置分的,有按參數類型分,有按注入技術分類的,下面我們具體介紹錯誤回顯和布爾注入。明天會接著介紹時間盲注和UNION注入。(使用OWASP的DVWA靶機演示部分注入)

錯誤回顯

錯誤回顯是通數據庫的報錯信息來獲取一些數據庫的基本信息。錯誤回顯最基礎的注入就是單引號【'】

SQL注入

錯誤回顯

我們可以從錯誤回顯中可以看到,靶機使用的數據庫是MYSQL,提示我們第一行中的【'】不是一個正確的符號。

這里我們看一下對應的MYSQL語句發生了什么變化。

SELECT first_name, last_name FROM users WHERE user_id = '''

可能不太明顯,最后【user_id = '''】這里搜索的值是【'】,這里是提前閉合了這個SQL語句,導致多了一個【'】出來。只要語句有一點錯誤,數據庫都不會接受這個語句,所以數據庫報錯,并返回錯誤信息。

布爾

布爾注入的思路主要是以下三點。1、提前閉合語句。2、利用OR和AND構造特殊情況,例如恒為正確。3、注釋后面多余的SQL語句

' or 1=1 -- '

#單引號【'】提前閉合了對于id的查詢,然后構造【1=1】恒為正確的情況,【-- 】注釋了后面的SQL語句

SQL注入

構造恒為正確語句

網頁把所有的用戶都回顯出來了

我們也同樣來看MYSQL語句的變化

SELECT first_name, last_name FROM users WHERE user_id = '' or 1=1 -- ' '

分析MYSQL語句,查詢ID=空(其實是什么都無所謂)【'】閉合前面的SQL了,【or】(或者)1=1,后面注釋掉,不匹配。那么數據庫在ID列一個個往下對比數據的時候,無論是否匹配成功,都會被后面【1=1】的TRUE強行匹配成功,所以就把所有可以返回的用戶及密碼都顯示在頁面上了。

二,WEB滲透入門教程——SQL注入(2)

小白的web學習之路 2017-11-09 22:19:34

承接上一篇WEB滲透入門——SQL注入,接下來介紹一下時間盲注和UNION注入。

時間盲注

其實一般來說,現實環境中的網站會有一些安全設置,會導致一些簡單的錯誤回顯或者布爾注入無法實現。這時候我們可以通用調用MYSQL內部的函數來實現注入。時間盲注正是利用【AND】邏輯,調用MYSQL內置的【sleep】函數,實現確定SQL注入點的手段。

插一個數據庫知識點。sleep這個函數通常會用在運維調試的時候,比如我想確定一下我的頁面是不是真的向服務器發起了執行SQL語句的請求的時候,可以通過【sleep(n)】來使頁面反饋停留n秒。

為了直觀可見,我直接使用數據庫來實現。

SQL注入

搜索時間為0.00sec

搜索時間為5.00sec

雖然數據庫不會返回任何數據,但是搜索時間的明顯增長,在我們瀏覽的頁面上,體現為加載時間明顯變長了。

UNION注入

要講明白union注入是什么,就要先知道union是什么。

這里再次插入數據庫知識點:UNION聯合查詢語句。數據庫的查詢指令【select】的具體語法可以從我上面的截圖看到,而UNION是用來連接兩個【select】查詢語句的。我先創建兩個表格test1和test2,如圖

SQL注入

兩個表格,嗯,我手殘打成了lasttname,不要在意

select firstname from test1 where id=1 union select lasttname from test2 where id=1;

SQL注入

查詢結果

我們分別從test1中獲取【xiao】和test2中獲取【bai】這兩個數據,通過UNION查詢將兩個查詢語句的結果聯合輸出。

關于UNION的用法,還有一個很重要的特點是,他前后兩個【select】語句查詢的項的數目必須是一致的。我第一個【select】語句只查詢了一項【firstname】,那么我第二個【select】語句也只能查詢一項,不然數據庫會報錯。

所以可以通過這個特點,我們可以通過不斷改變我們注入語句的查詢項的數目,來確定目標后臺查詢的具體數目。

UNION可以從另外一個表獲取數據的特性就可以幫助我們搞事情了。

我們來看下一張圖。我通過不斷改變【select】查詢項的數目

1' union select null -- '

1' union select null,null -- '

1' union select null,null,null -- '

得到了靶機的后臺查詢是兩個查詢項,故構造了如下的語句來獲得數據庫的版本信息。

SQL注入

@@version也是MYSQL的內置函數

得到數據庫的版本

我們這里利用了【@@version】這個函數,通過UNION注入獲取到數據庫版本【5.1.41-3】系統信息【ubuntu12.6】。還可以獲取整個MYSQL的數據庫名字,用戶信息等。

這里又要插入一個數據庫知識點。MYSQL數據庫(>=5.0)中有一個自帶數據庫【information_schema】,從名字我們就可以知道這是一個放著我們數據庫信息的數據庫。我們可以從這里獲取到諸如整個MYSQL中創建了多少數據庫,權限列表等十分敏感的信息。

這里我再放一個利用UNION注入拿到MYSQL所有數據庫名字的回顯。

SQL注入

url

回顯

從這里我們可以看出,靶機中只有【information_schema】和【dvwa】兩個數據庫。至于像用戶信息,用戶權限等信息的獲取,大家可以回去自己嘗試,這里就不累述了 

三,SQL注入的攻擊思路和防御思路。

今天一整篇文章都是文字啊,感覺閱讀起來很困難。我在中間分別插入一些有SQL注入漏洞原始PHP代碼截圖。代碼來源全部是來自DVWA靶機的。

SQL注入的攻擊思路

小編曾經在安全服務公司里面當過實習生,所以對現實環境中的滲透測試有一點了解。通常現實環境中,如果測試的對象是在生產環境中的門戶網站之類的,我們的滲透測試是不能用SQLMAP這些自動化注入工具的。為了維持客戶的生產環境中的網站正常運行,我們一般使用手工注入。

SQL注入攻擊的思路一般是按照下面的順序來的。

1、判斷是否有SQL注入的漏洞

判斷注入漏洞是否存在一般利用【布爾注入】、【時間盲注】。【時間盲注】在上一篇文章里已經介紹得比較完整了,下面我補充了【布爾注入】判斷注入點的用法。

【布爾注入】之前介紹是通過構造一個【必為真】的情況,來獲取整個數據表的數據,但是真實環境中,一般是即使我們成功讓我們構造的語句運行也不一定會有像靶機那樣的反饋。在網頁沒有一個明確回顯的時候,我們怎么知道這里是否存在一個注入漏洞呢?(一時沒有找到好的配圖,直接文字說明吧。)

.php?id=1' or 1=1 --'

.php?id=1' or 1=2 --'

上面這兩個語句分別構造了【永為真】和【永為假】兩種特殊情況。假如我們在用【永為真】的語句注入后,并沒有返回有用的信息的話,我們可以通過比較【永為真】【永為假】兩個語句分別出來的回顯,如果不一樣,那我們可以基本確定我們構造的【1=1】【1=2】已經被執行了,所以可以基本確定有SQL注入漏洞。

這里放一個低安全級別的代碼吧。

SQL注入

這里支持單純的獲取ID值,就丟進去數據庫查詢,是最不安全的代碼

這段代碼對獲取的【$id】沒有做任何的過濾操作,就是說我們想怎么傳遞SQL語句都可以,是十分不安全的代碼。

2、獲取數據庫的類型和操作系統信息

獲取數據庫和操作系統信息一般是通過UINON查詢來查詢一些敏感的內置函數來實現的。下面列舉一些有用的內置函數。

@@datadir #返回數據庫的路徑

@@basedir #返回數據庫的安裝路徑

@@version_compile_os #返回操作系統信息

@@version #返回數據庫版本信息

通過這些收集數據庫和系統信息,如果發現目標的版本過低,或者并沒有更新到最新的版本,可能會有一些系統固有漏洞,可能可以通過工具簡化后面的滲透步驟。(不過網上的工具一般是不可以在為客戶提供服務的時候使用的,因為并沒法保證網上的工具有沒有后門,會不會為客戶產生一個新的威脅。)

3、獲取數據庫內容

4、加密信息破解

5、提升權限

6、內網滲透

在一個常規的滲透測試的項目中,一般是點到為止,我們是不會執行3-6點的操作的。在交互的報告上,只會注明網站那些地方出現了SQL注入漏洞,通過怎樣的playload可以重現,建議怎樣修復。

這里放一個中等安全的代碼,代碼有點長,只放核心查詢位置的代碼吧

SQL注入

這里調用了一個php函數:mysql_real_escape_string

【mysql_real_escape_string】這個函數會將獲取的數據(這里是【$id】)所有特殊字符進行轉義,當然包含單引號【'】雙引號【"】這兩個,是用于防御SQL注入攻擊的函數。

SQL注入的防御思路

防御永遠比攻擊要難得多,為什么這么說呢?

如果作為一個黑客,你只要在網站上面找到一個攻擊點,我就可以攻擊進去了,我不需要管其他地方有沒有漏洞,會不會被其他人利用。

但是作為安全工程師的話,你需要知道你網站所有有可能被攻擊的地方,并針對每一個點來進行加固。WEB上可以攻擊的點不只只有SQL注入一種漏洞,還有XSS、CSRF等等,這兩個后面肯定也會介紹到。

回到正題,我們要怎樣去防御SQL注入攻擊呢?

1、首先,永遠不要相信用戶的輸入。SQL注入攻擊的第一步就是確定是否存在SQL注入漏洞。我們是無法保證用戶是不是按照我們希望的那樣去輸入查詢信息的。所以我們要對用戶的輸入進行限制,避免被輕易的找到SQL注入漏洞。例如:

(1)通過正則表達式來限制用戶的輸入長度;

(2)對單引號【'】,注釋符號【--】進行過濾;

(3)在開發網頁的過程中,重視安全性,調用類似【mysql_real_escape_string】這樣的函數進行防御。

2、攻擊者在確定有SQL注入漏洞后,會嘗試獲得我們的數據庫和SERVER OS版本信息,我們應該用自定義錯誤信息包裝原始錯誤信息,避免數據庫和SERVER OS版本信息輕易流出。

3、做好數據庫的權限分離。我們永遠無法保證網站是100%安全的,永遠都有被拖庫的可能。那么好的權限分離可以幫助我們在被拖庫后,不被獲取到大量有意義的數據。

比如說,我們必然不能通過ROOT用戶來管理應用,應該為每個應用創建對應的數據庫賬號,并配置好相應的權限。那么即使被拖庫了,攻擊者也無法獲得其他數據庫的資料。這里有一個權限分配原則:賦予賬號可以完成日常管理的最小權限。

4、所有敏感信息,例如密碼,一律要加密,并且要哈希加鹽處理。

又來插入知識點:加鹽加密。

我們永遠無法保證網站是100%安全的,永遠都有被拖庫的可能。那么,怎么保證在拖庫之后,也不會讓人輕易的獲得我們用戶的密碼呢?大家都知道HASH是一種不可逆的加密方式,但是這種加密方式由于計算機的性能的快速提升,已經可以通過撞庫破解了。

加鹽加密應運而生:即使用戶的密碼很短,只要我們在他的短密碼后面加上一段很長的字符,再計算MD5值,那反推出原始密碼就變得非常困難了。加上的這段字符,我們稱為鹽(Salt),通過這種方式加密的結果,我們稱為加鹽HASH。

文末就放高安全級別代碼吧,這里放出對獲取的【$id】的處理方式

SQL注入

這里調用了兩個函數【stripslashes】【mysql_real_escape_string】

高安全級別的代碼,想要繞過防御就十分困難了,大家可以一起研究交流一下。

來源:海瑤seo培訓,歡迎分享,(微信/QQ:154899659)

分享至:
欢乐捕鱼人下载 福彩选号器下载 曾道玄机彩图 吉林快三开奖往期 吉林时时几点开始 5元刮刮乐直播视频 陕西快乐十分0628040期开奖 重庆时时开奖历史记录 黑龙江11选5走势 安徽11选5结果 白小姐水主论坛440443