网站安全(20) —— 语义URL攻击

好奇心是不少攻击者的主要动机,语义URL 攻击就是一个很好的例子。此类攻击主要包括对URL 进行编辑以期发现一些有趣的事情。
-
什么是语义URL 攻击?
 
好奇心是不少攻击者的主要动机,语义URL 攻击就是一个很好的例子。此类攻击主要包括对URL 进行编辑以期发现一些有趣的事情。
 
例如,若是用户chris 点击了你的软件中的一个连接并到达了页面http://www.2cto.com /private.php?user=chris, 很天然地他可能会试图改变user的值,看看会发生什么。例如,他可能访问http://www.2cto.com /private.php?user=rasmus 来看一下他是否能看到其余人的信息。虽然对GET 数据的操纵只是比对POST 数据稍为方便,但它的暴露性决定了它更为频繁的受攻击,特别是对于攻击的新手而言。
 
大多数的漏洞是因为疏漏而产生的,而不是特别复杂的缘由引发的。虽然不少有经验的程序员能轻易地意识到上面所述的对URL 的信任所带来的危险,可是经常要到别人指出才恍然大悟。
 
为了更好地演示语义URL 攻击及漏洞是如何被疏忽的,以一个Webmail 系统为例,该系统主要功能是用户登陆察看他们本身的邮件。
 
任何基于用户登陆的系统都须要一个密码找回机制。一般的方法是询问一个攻击者不可能知道的问题(如你的计算机的品牌等,但若是能让用户本身指定问题和答案更佳),若是问题回答正确,则把新的密码发送到注册时指定的邮件地址。
 
对于一个Webmail 系统,可能不会在注册时指定邮件地址,所以正确回答问题的用户会被提示提供一个邮件地址(在向该邮件地址发送新密码的同时,也能够收集备用邮件地址信息)。下面的表单即用于询问一个新的邮件地址,同时他的账户名称存在表单的一个隐藏字段中:
复制代码 代码以下:
<input type="hidden" name="user" value="chris" />
<p>Please specify the email address where you want your new password sent:
 
<input type="text" name="email" />
 
<input type="submit" value="Send Password" />
</form>
 
能够看出,接收脚本reset.php 会获得全部信息,包括重置哪一个账号的密码、并给出将新密码发送到哪个邮件地址。
 
若是一个用户能看到上面的表单(在回答正确问题后),你有理由认为他是chris 账号的合法拥有者。若是他提供了 做为备用邮件地址,在提交后他将进入下面的URL:
 
http://www.2cto.com /reset.php?user=chris&email=chris%40www.2cto.com
 
该URL 出如今浏览器栏中,因此任何一位进行到这一步的用户都可以方便地看出其中的user和mail 变量的做用。当意思到这一点后,这位用户就想到 是一个很是酷的地址,因而他就会访问下面连接进行尝试:
 
http://www.2cto.com /reset.php?user=php&email=chris%40www.2cto.com
 
若是reset.php 信任了用户提供的这些信息,这就是一个语义URL 攻击漏洞。在此状况下,系统将会为php 账号产生一个新密码并发送至,这样chris 成功地窃取了php 账号。
 
若是使用session 跟踪,能够很方便地避免上述状况的发生:
复制代码 代码以下:
<?php
session_start();
$clean = array();
$email_pattern = '/^[^@\s<&>]+@([-a-z0-9]+\.)+[a-z]{2,}$/i';
if (preg_match($email_pattern, $_POST['email']))
{
$clean['email'] = $_POST['email'];
$user = $_SESSION['user'];
$new_password = md5(uniqid(rand(), TRUE));
if ($_SESSION['verified'])
{
/* Update Password */
mail($clean['email'], 'Your New Password', $new_password);
}
}
?>
 
尽管上例省略了一些细节(如更详细的email 信息或一个合理的密码),但它示范了对用户提供的账户不加以信任,同时更重要的是使用session 变量为保存用户是否正确回答了问题($_SESSION['verified']),以及正确回答问题的用户($_SESSION['user'])。正是这种不信任的作法是防止你的应用产生漏洞的关键。
 
其实,只要记住如下的原则就好了 -- 不要相信任何用户的输入php

相关文章
相关标签/搜索