好奇心是很多攻击者的主要动机,语义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‘])。正是这种不信任的做法是防止你的应用产生漏洞的关键。
其实,只要记住以下的原则就行了
-- 不要相信任何用户的输入
相关文章
- 09-04*逾百家网站遭黑客攻击 资讯安全工作受挑战
- 09-04网站安全配置(Nginx)防止网站被攻击(包括使用了CDN加速之后的配置方法)
- 09-04分享如何使用PHP将URL地址参数进行加密传输提高网站安全性
- 09-04SharePoint安全 - SharePoint网站常用页面URL索引
- 09-04来了解并防范一下CSRF攻击提高网站安全
- 09-04DDOS工具合集---CC 2.0(僵尸网络proxy,单一url,可设置cookie,refer),传奇克星(代理+单一url,可设置cookie),NetBot_Attacker网络僵尸1.0(僵尸网络,HTTP NO-Cache Get攻击模式,CC攻击,HTTP空GET请求攻击),傀儡僵尸VIP1.4版(僵尸网络,动态单一url)、上兴网络僵尸2.3、中国制造网络僵尸、安全基地网络僵尸==
- 09-04C#不用union,而是有更好的方式实现 .net自定义错误页面实现 .net自定义错误页面实现升级篇 .net捕捉全局未处理异常的3种方式 一款很不错的FLASH时种插件 关于c#中委托使用小结 WEB网站常见受攻击方式及解决办法 判断URL是否存在 提升高并发量服务器性能解决思路
- 09-04网站安全配置(Nginx)防止网站被攻击(包括使用了CDN加速之后的配置方法
- 09-04网站安全(20) —— 语义URL攻击
- 09-04网站安全系列:跨站脚本攻击XSS