PHP安全编程:从URL的语义进行攻击

发布时间:2022-04-30 发布网站:脚本宝典
脚本宝典收集整理的这篇文章主要介绍了PHP安全编程:从URL的语义进行攻击脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。

PHP安全编程:从URL的语义进行攻击》要点:
本文介绍了PHP安全编程:从URL的语义进行攻击,希望对您有用。如果有疑问,可以联系我们。

原文:http://www.Nowamagic.net/librarys/veda/detail/1992

在讲PHP安全,那么语义URL攻击就是一个很好的例子。此类攻击主要包括对URL进行编辑以期发现一些有趣的事情。例如,如果用户chris点击了你的软件中的一个链接并到达了页面http://example.org/PRivate.PHP?user=chris,很自然地他可能会试图改变user的值,看看会发生什么。例如,他可能访问http://example.org/private.PHP?user=rasmus来看一下他是否能看到其他人的信息。虽然对GET数据的操纵只是比对POST数据稍为方便,但它的暴露性决定了它更为频繁的受攻击,特别是对于攻击的新手而言。

大多数的漏洞是由于疏漏而产生的,而不是特别复杂的原因引起的。虽然很多有经验的程序员能轻易地意识到上面所述的对URL的信任所带来的危险,但是常常要到别人指出才恍然大悟。

为了更好地演示语义URL攻击及漏洞是如何被疏忽的,以一个Webmail系统为例,该系统主要功能用户登录察看他们自己的邮件。任何基于用户登录的系统都需要一个密码找回机制。通常的方法询问一个攻击者不可能知道的问题(如你的计算机的品牌等,但如果能让用户自己指定问题和答案更佳),如果问题回答正确,则把新的密码发送到注册时指定的邮件地址。

对于一个Webmail系统,可能不会在注册时指定邮件地址,因此正确回答问题的用户会被提示提供一个邮件地址(在向该邮件地址发送新密码的同时,也可以收集备用邮件地址信息)。下面的表单即用于询问一个新的邮件地址,同时他的帐户名称存在表单的一个隐藏字段中:

<form&nbsp;action="reset.PHP;method="GET">
  <input tyPE="hidden" name="user" value="chris" />
  <p>Please specify the email address where you want your new password sent:</p>
  <input type="text" name="email" /><br />
  <input type="submIT" value="Send Password" />
</form>

可以看出,接收脚本reset.PHP会得到所有信息,包括重置哪个帐号的密码、并给出将新密码发送到哪一个邮件地址。

如果一个用户能看到上面的表单(在回答正确问题后),你有理由认为他是chris帐号的合法拥有者。如果他提供了chris@example.org作为备用邮件地址,在提交后他将进入下面的URL:

http://example.org/reset.PHP?user=chris&email=chris%40example.org

该URL出现在浏览器栏中,所以任何一位进行到这一步的用户都能够方便地看出其中的user和mail变量的作用。当意思到这一点后,这位用户就想到PHP@example.org是一个非常酷的地址,于是他就会访问下面链接进行尝试:

http://example.org/reset.PHP?user=PHP&email=chris%40example.org

如果reset.PHP信任了用户提供的这些信息,这就是一个语义URL攻击漏洞。在此情况下,系统将会为PHP帐号产生一个新密码并发送至chris@example.org,这样chris成功地窃取了PHP帐号。

如果使用session跟踪,可以很方便地避免上述情况的发生:

<?PHP
 
  session_start();
 
  $clean = array();
  $email_pattern = &#39;/^[^@\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'])。正是这种不信任的做法是止你的应用产生漏洞的关键。

这个实例并不是完全虚构的。它是从2003年5月发现的Microsoft Passport的漏洞中得到的灵感。

脚本宝典总结

以上是脚本宝典为你收集整理的PHP安全编程:从URL的语义进行攻击全部内容,希望文章能够帮你解决PHP安全编程:从URL的语义进行攻击所遇到的问题。

如果觉得脚本宝典网站内容还不错,欢迎将脚本宝典推荐好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。