怎么使用htmlspecialchars过滤()避免XSS

怎么使用htmlspecialchars()避免XSS_百度作业帮
怎么使用htmlspecialchars()避免XSS
在PHP服务器端,对POST过来的值,进行实体化.用函数htmlspecialchars()进行过滤一下就可以了.例如:$name = htmlspecialchars($_POST['name']);
其他类似问题
扫描下载二维码对 WEB 应用进行 XSS 漏洞测试,不能仅仅局限于在 WEB 页面输入 XSS 攻击字段,然后提交。绕过 JavaScript 的检测,输入 XSS 脚本,通常被测试人员忽略。下图为 XSS 恶意输入绕过 JavaScript 检测的攻击路径。常见的 XSS 输入XSS 输入通常包含 JavaScript 脚本,如弹出恶意警告框:&script&alert(&XSS&);&/script&XSS 输入也可能是 HTML 代码段,譬如:网页不停地刷新 &meta http-equiv=&refresh& content=&0;&&嵌入其它网站的链接 &iframe src=http://xxxx width=250 height=250&&/iframe&XSS (Cross Site Scripting) Cheat Sheet 维护了一份常见的 XSS 攻击脚本列表,可用来作为检测 WEB 应用是否存在 XSS 漏洞的测试用例输入。初次接触 XSS 攻击的开发人员可能会对列表提供的一些 XSS 输入不是很理解,本文第二部分将会针对不同代码上下文的 XSS 输入作进一步的解释。测试工具很多工具可以在浏览器发送 Get/Post 请求前将其截取,攻击者可以修改请求中的数据,从而绕过 JavaScript 的检验将恶意数据注入服务器。以下是一些常用的截取 HTTP 请求的工具列表。Paros proxy (http://www.parosproxy.org)Fiddler (/fiddler)Burp proxy (http://www.portswigger.net/proxy/)TamperIE (/dl/TamperIESetup.exe)笔者曾经使用 TamperIE 对 WEB 应用进行安全性测试。TamperIE 小巧易用,能够截取 IE 浏览器发送的 Get/Post 请求,甚至能绕过 SSL 加密。不过 TamperIE + IE7 工作不稳定。IE7 提供了对 IPV6 的支持,如果你并不计划测试你的 Web 应用对 IPV6 的支持,建议还是使用 TamperIE + IE6 的组合。如图2所示: TamperIE 绕过客户端浏览器 JavaScript 的校验,在 POST 请求提交时将其截取,用户可以任意修改表单输入项 name 和 message 的值,譬如将 message 的值修改为 &&script&alert(“XSS hole!!”);&/script&&,然后点击 ”Send altered data” 按钮,将修改后的恶意数据发送给 Web 服务器。图 2. 使用 TamperIE 截取 Post 请求在输出端对动态内容进行编码对一个 Web 应用而言,其动态内容可能来源于用户输入、后台数据库、硬件状态改变或是网络信息等。动态内容特别是来自用户输入的动态内容很有可能包含恶意数据,从而影响网页的正常显示或是执行恶意脚本。将动态内容安全地显示在浏览器端与动态内容所处的上下文背景有关,譬如动态内容处在 HTML 正文、表单元素的属性、或是 JavaScript 代码段中。对于一个基于 PHP 语言的 Web 应用,当执行&echo&、&print&、&printf&、&&?=& 等语句时表示正在处理动态内容。本节将首先介绍 PHP 提供的库函数 htmlspecialchars()的用法,此函数能将 5 个 HTML 特殊字符转化为可在网页显示的 HTML 实体编码;然后将介绍一些常见背景下的 XSS 攻击输入,以及如何在输出端对动态内容进行转义、编码从而避免 XSS 攻击。使用 PHP 的 htmlspecialchars() 显示 HTML 特殊字符从上文列举的 XSS 恶意输入可以看到,这些输入中包含了一些特殊的 HTML 字符如 &&&、&&&。当传送到客户端浏览器显示时,浏览器会解释执行这些 HTML 或JavaScript 代码而不是直接显示这些字符串。& & & “ 等字符在HTML语言中有特殊含义,对于用户输入的特殊字符,如何直接显示在网页中而不是被浏览器当作特殊字符进行解析?HTML字符实体由 & 符号、实体名字或者 # 加上实体编号、分号三部分组成。以下为 HTML 中一些特殊字符的编码。有的字符实体只有实体编号,没有对应的实体名字,譬如单引号。PHP 提供了htmlspecialchars()函数可以将 HTML 特殊字符转化成在网页上显示的字符实体编码。这样即使用户输入了各种 HTML 标记,在读回到浏览器时,会直接显示这些 HTML 标记,而不是解释执行。htmlspecialchars()函数可以将以下五种 HTML 特殊字符转成字符实体编码:& 转成 &“ 转成 && 转成 && 转成 &‘ 转成 '当直接调用 htmlspecialchars($str)时, & & & & 被转义。当设置 ENT_QUOTES 标记时, 即调用htmlspecialchars($str, ENT_QUOTES)时,单引号也被转义。当设置 ENT_NOQUOTES 标记时,单引号和双引号都不会被转义。即调用 htmlspecialchars($str, ENT_NOQUOTES)时,只有& & & 被转义。不同背景下的动态内容的 XSS 攻击及解决方案XSS 攻击输入与动态内容所处的代码背景相关,譬如动态内容为表单元素属性的值、位于 HTML 正文、或是 Javascript 代码段中等等。HTML标记的属性为动态内容Web 应用中,&input&、&style&、&color& 等 HTML 标记的属性都可能为动态内容,其中&input& 标记的 &value& 属性通常为动态内容。例子1&form…&&INPUT type=text name=&msg& id=&msg& size=10 maxlength=8 value=&&?= $msg?&&&&/form&攻击XSS输入Hello&&&script&evil_script()&/script&将动态内容替换将 $msg 替换为恶意 XSS 输入:&form…&&INPUT type=text name=&msg& id=&msg& size=10 maxlength=8
value=&Hello&&&script&evil_script()&/script&&&&/form&例子2&form…&&INPUT type=text name=&msg& id=&msg& size=10 maxlength=8 value=&?= $msg?&&&/form&攻击 XSS 输入<tr bgcolXSS 攻击时怎么绕过 htmlspecialchars 函数呢?
按投票排序
xss攻击很多场景下htmlspecialchars过滤未必能奏效。场景1:源码如下:&?php
$name = $_GET["name"];
$name = htmlspecialchars($name);
&input type='text' value='&?php echo $name?&'&
htmlspecialchars默认配置是不过滤单引号的。只有设置了:quotestyle 选项为ENT_QUOTES才会过滤单引号,如果此时你的输出为那么仍然会绕过htmlspecialchars()函数的检查,从而造成一个反射型的xss。那么仍然会绕过htmlspecialchars()函数的检查,从而造成一个反射型的xss。场景2:仅仅用htmlspecialchars函数的地方错用了该函数导致的xss,源码如下:&meta http-equiv=Content-Type content="text/charset=gbk"&
&script src="http://wooyun.org/js/jquery-1.4.2.min.js"&&/script&
$name = $_GET["name"];
echo "&script type='text/javascript'&
$(document).ready(function(){
$('#text').html(".htmlspecialchars($name).");
&/script&";
此处调用了html()做输出,仅考虑单引号双引号以及尖括号显然已经不够了,还必须得考虑别的因素在里面,此时应该再使用json_encode()函数进行处理。即:$('#text').html(".htmlspecialchars($name).");
$('#text').html(".json_encode(htmlspecialchars($name)).");
处理之后,里边的代码就不会被当成js执行。场景3:客户端造成的htmlspecialchars失效:此类漏洞已经不是单凭htmlspecialchars函数就能防御的了。上面3个场景仅仅只是较为常见的,还有一些别的场景可能会导致htmlspecialchars失效。尤其是各种编码转换、富文本、进入数据库再取出数据库这些地方等等。最后,建议题主结合实际场景,去进行不同的环境测试,最后得出是否能绕过的结论。:)
绕不过。所谓绕过就是挑程序员忘记正确转码的地方下手。注意并非htmlspecialchars就万事大吉,不同的地方需要不同的转码。所以所谓绕过htmlspecialchars也可能指那个漏洞点用htmlspecialchars转码压根不正确。详见:
具体绕过与否要看场景。官网是这么说的,对于单引号的转义必须加上第二个参数ENT_QUOTES。举个栗子:上面的htmlspecialchars没有指定第二个参数。当指定第二个参数时,可以看到,不指定第二个参数会漏掉单引号,如果恰好在html标签内输出,完全可以闭合或者自己构造一个属性,如直接构造一个on事件执行js。漏洞的例子:HotCRP中的代码:实验一下,这里不用JavaScript伪协议也行。实验一下,这里不用JavaScript伪协议也行。
如果是类似jinjia2里safe标签那种的话,那则无法绕过。毕竟人家就是用来sanitize用户输入的,而这正是防范xss的最常见手段。
安全开发技术课程-XSS跨站脚本攻击漏洞及解决办法
看来我要小心使用htmlspecialchars了
已有帐号?
社交帐号登录
无法登录?
社交帐号登录您的位置: >
htmlspecialchars函数并不能百分百的防止XSS攻击
来源:电脑培训
摘要:htmlspecialchars()函数只对、、、、符号进行转译成html特殊符号 我们可以通过url编码对带有连接的标记进行攻击: a href= ?php echo htmlspecialchars(javascript:alert(1),ENT_QUOTES); ? a/a a href= ?php echo htmlspecialchars(javascript:location%3D'
&htmlspecialchars()函数只对&、&、&、&、&符号进行转译成html特殊符号
我们可以通过url编码对带有连接的标记进行:
&?php echo htmlspecialchars(&javascript:alert(1)&,ENT_QUOTES); ?&
&?php echo htmlspecialchars(&javascript:location%3D'http%3A%'&,ENT_QUOTES); ?&
(责任编辑:网络)
本文章原创来自: QQ: (转载请保留黑客网站版权。侵权必究)
订阅更新: 您可以通过
Powered by
黑客流安全网
Inc.Copyright & 2007-.

我要回帖

更多关于 htmlspecialchars 的文章

 

随机推荐