XSS 与PHP

因为最近科室PHP项目需求,所以就在做PHP相关的Web工作。正好想起研一学得一门网络攻防的课,有一章节讲解的是Web方面常受到的攻击。XSS跨站脚本攻击是Web最典型的一种攻击方式。PHP也有对付这种攻击的策略。切入正题吧
什么是XSS
XSS是跨站脚本攻击(Cross Site Script) 。它指的是恶意攻击者往Web页面里插入恶意html代码,当用户浏览该网页时,嵌入其中Web里面的html代码会被执行,从而达到恶意用户的特殊目的。
XSS的危害
XSS攻击可以搜集用户信息,攻击者通常会在有漏洞的程序中插入JavaScript、VBScript、ActiveX或Flash以欺骗用户。
一旦得手,他们可以盗取用户帐户,修改用户设置,盗取/污染cookie,做虚假广告,查看主机信息等。
例如,恶意代码将被欺骗用户的cookie收集起来进行cookie欺骗,或者是在访问者的电脑执行程序,比如后门木马或者是在系统上添加管理员帐户。
ep:http://www.kasperskyusa.com/promotions/wp_index.php?Threats=“>
最常见的就是在url后面添加一段script。所以,为了防止这种危害,我们常采用的就是过滤或者转换这种脚本。后面会给出例子。

XSS的发起条件
跨站脚本漏洞主要是由于Web服务器没有对用户的输入进行有效性验证或验证强度不够,而又轻易地将它们返回给客户端造成的。
Web服务器允许用户在表格或编辑框中输入不相关的字符。
Web服务器存储并允许把用户的输入显示在返回给终端用户的页面上,而这个回显并没有去除非法字符或者重新进行编码。
实现跨站脚本的攻击至少需要两个条件:
需要存在跨站脚本漏洞的web应用程序;
需要用户点击连接或者是访问某一页面;
跨站脚本攻击过程
寻找XSS漏洞

<A href="http://www.baidu.com">baidu</A>

XSS攻击正是通过向HTML代码中注入恶意的脚本实现的,HTML指定了脚本标记为:<script></script>
在没有过滤字符的情况下,只需要保持完整无错的脚本标记即可触发XSS。。假如我们在某个资料表单提交内容,表单提交内容就是某个标记属性所赋的值,我们可以构造如下值来闭和标记来构造完整无错的脚本标记:

"><script>alert('XSS');</script><

把这个内容赋值给前面标记的href属性,则结果形成了

<A href=""><script>alert('XSS');</script> <"">baidu</A>

在寻找XSS漏洞时,如果能看到源代码,我们主要看代码里对用户输入的地方和变量有没有做长度限制和对”<”、”>”、”;”和”’”等字符是否做过滤。
还需要注意的是对于标签的闭合。
如在标题处,你输入<script>alert(‘test’)</script>,代码是不会被执行的,因为在源代码里,有其它的标签未闭合,例如少了一个</script>
这个时候,在标题处只要闭合一个</script>,代码就会执行,如你输入:</script><script>alert(‘test’)</script>,这样就可以弹出一个test的框。
注入恶意代码
注入恶意代码的目的是:当被欺骗者访问了含有这段恶意代码的网页时,能实现你的攻击目的。
例如,通过这些恶意代码,将访问者的Cookie信息发到远端攻击者手中,或者是提升用户的论坛权限、上传任意文件等。
当然,接收输入的网页可能会对<,>,’,”等字符进行过滤,这时,就需要进行编码了。
欺骗用户访问
当你把恶意的代码插入到网页中之后,接下来要做的事情就是让目标用户来访问你的网页,“间接”通过这个目标用户来完成你的目的。
防御跨站脚本攻击
XSS攻击最主要目标不是Web服务器本身,而是登录网站的用户。这也是做Web开发的人员要在用户提交的表单进行谨慎的过滤与排查的原因。
对于开发者,首先应该把精力放到对所有用户提交内容进行可靠的输入验证上。这些提交内容包括URL、查询关键字、post数据等。只接受在你所规定长度范围内、采用适当格式的字符,阻塞、过滤或者忽略其它的任何东西。
保护所有敏感的功能,以防被机器人自动执行或者被第三方网站所执行。可采用的技术有:session标记(session tokens)、验证码。
如果你的web应用必须支持用户提交HTML,那么应用的安全性将受到灾难性的下滑。但是你还是可以做一些事来保护web站点:确认你接收的HTML内容被妥善地格式化,仅包含最小化的、安全的tag(绝对没有JavaScript),去掉任何对远程内容的引用(尤其是CSS样式表和JavaScript)。
PHP一个XSS防御的小例子

<form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>">

一个HTML的表单。
$_SERVER["PHP_SELF"]是一种超全局变量,它返回当前执行脚本的文件名。
因此,$_SERVER["PHP_SELF"]将表单数据发送到页面本身,而不是跳转到另一张页面。这样,用户就能够在表单页面获得错误提示信息。
htmlspecialchars() 函数把特殊字符转换为 HTML 实体。这意味着 < 和 > 之类的 HTML 字符会被替换为 &lt;&gt; 。这样可防止攻击者通过在表单中注入 HTML 或 JavaScript 代码(跨站点脚本攻击)对代码进行利用。
$_SERVER[“PHP_SELF”] 变量能够被黑客利用!
如果页面使用了 PHP_SELF,用户能够输入下划线然后执行跨站点脚本(XSS)。
提示:跨站点脚本(Cross-site scripting,XSS)是一种计算机安全漏洞类型,常见于 Web 应用程序。XSS 能够使攻击者向其他用户浏览的网页中输入客户端脚本。

试想如果没有htmlspecialchars这个方法对当前执行脚本文件名进行处理,极大增加了危险;

<form method="post" action="<?php echo $_SERVER["PHP_SELF"];?>">

如果用户进入的是地址栏中正常的 URL:”http://www.example.com/test_form.php“,上面的代码会转换为

<form method="post" action="test_form.php">

不过,如果用户在地址栏中键入了如下 URL:

http://www.example.com/test_form.php/%22%3E%3Cscript%3Ealert('hacked')%3C/script%3E
<form method="post" action="test_form.php"/>`<script>alert('hacked')</script>`

是不是很容易就被XSS了。但是如果我们这样:

<form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>">

最后会把<script>alert('hacked')</script>转化为HTML的格式毫无危害。

以上只是一个很简单的例子。还有更高级的XSS攻击。所以做Web开发一定要小心。
不知道大家写博客的时候有没有发现,如果直接写<><>这种的时候页面会自动过滤到这些敏感字符,我想也是因为怕XSS攻击吧。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值