前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【XSS漏洞】一步步教你通关DVWA

【XSS漏洞】一步步教你通关DVWA

作者头像
一名白帽的成长史
发布2019-10-08 15:04:19
2K0
发布2019-10-08 15:04:19
举报
文章被收录于专栏:一名白帽的成长史

由于最近实在是太忙了,于是已经好几天没有更新我的公众号了(反正也没几个人关注)

今天小编初步学习了一下XSS漏洞,顺带打通了DVWA平台上的几道XSS漏洞题,本着学习的精神,在此跟大家分享一下这几题的解法,感兴趣的同学就跟着我一起往下看吧。

什么是XSS?

跨站脚本(Cross-SIte Scripting )攻击,首先是由于Web应用程序对用户的输入过滤不足而产生的。

攻击者利用这种不足,把恶意的脚本代码(HTML代码/JavaScript脚本)注入到网页中去。

最后当用户正常访问这些网站时,就会自动执行网页中携带的恶意代码。造成Cookie资料窃取、会话劫持、钓鱼欺骗等各种攻击。

XSS攻击主要分为反射型XSS、存储型XSS,以及DOM型XSS三种。

Part.1

Reflected XSS

LOW 等级

注入页面如下,填入用户名处:

低安全等级源码如下:

其中,array_key_exists()函数的作用如下:

可以看出,以上代码仅仅判断是否有传过来正确的键名,显然存在XSS漏洞。

解法:输入<script>alert("xss")</script>

顺利出现弹窗:

Meduim等级

中安全等级源码如下:

相较于低安全等级,对输入结果增加了str_replace判断,将<script>标签替换为空。

我们输入<script>alert("xss")</script>,就会被替换为alert("xss"),如下图所示:

解法一:我们可以使用大写的<SCRIPT>标签规避这个问题,输入<SCRIPT>alert("xss")</SCRIPT>

解法二:不让我们用<script>标签,我们还可以用其他标签,如img,输入<img src=1 onerror=alert(1)>

解法三:当然双写<script>标签,也可以轻松规避,输入<sc<script>ript>alert("xss")</script>,中间的<script>被替换为空。

HIGH等级

高安全等级源码如下:

该安全等级新增preg_replace()函数,配合正则表达式我们无法再使用<script>标签了,如下:

解法:使用img标签:<img src=1 onerror=alert(1)>

Impossible等级

Impossible等级源码如下:

该代码对接收结果使用了htmlspecialchars()函数,说明如下:

htmlspecialchars函数把预定义的字符&、”、 ’、<、>转换为 HTML 实体,防止浏览器将其作为HTML元素。

转换后浏览器无法识别js代码,此题无解。

Part.2

Stored XSS

LOW等级

注入页面如下,有name和message两处注入点。

我们发现name处支持输入的字符串长度有限,无法随意输入,是由于前端代码作了限制,如下:

但我们可以直接修改前端代码,在火狐浏览器直接双击代码进行修改,就可以输入任意长度了:

接下来我们看一下源代码:

我们来对其中一些函数进行解释:

trim():函数移除字符串两侧的空白字符或其他预定义字符,预定义字符包括、\t、\n、\x0B、\r以及空格,可选参数charlist支持添加额外需要删除的字符。

stripslashes():祛除反斜杠

mysql_real_escape_string(string,connection):函数会对字符串中的特殊符号(\x00,\n,\r,\,‘,“,\x1a)进行转义。

由代码可知,并未对输入做过多限制。

解法一:message栏输入<script>alert('xss')</script>

解法二:将name栏maxlength改大,输入<script>alert('xss')</script>

Medium等级

Medium等级源码如下:

其中strip_tags() 函数会剥去字符串中的 HTML、XML 以及 PHP 的标签。并且对message使用了htmlspecialchars函数,无解。但name标签只使用了一个str_replace函数,来替换<script>,因此我们可以对name下手。

解法:将name栏maxlength改大

输入<SCRIPT>alert('xss')</SCRIPT> 或者 <sc<script>ript>alert("xss")</script>

High等级

源码如下:

依然对massage变量使用了htmlspecialchars函数,无解。对name变量使用了preg_replace()函数,配合正则表达式我们无法再使用<script>标签了。

解法:将name栏maxlength改大,输入<img src=1 onerror=alert(1)>

Impossible等级

查看源码:

喜闻乐见的,对name和message变量都使用了htmlspecialchars函数,此题无解。

Part.3

DOM XSS

Low等级

注入页面如下,需要我们选择语言:

后端源代码如下:

可以发现并无任何保护措施,直接尝试注入。

输入:default=<script>alert(1)</script>

出现弹窗,注入成功:

此时的前端代码变为:

Medium等级

查看源码如下:

发现后台过滤了<script>标签,尝试使用img标签:

依旧无法弹窗,查看前端代码,发现脚本被插入到了value值中。

尝试直接闭合<option>标签,输入:default=</option><img src=1 onerror=alert(1)>,依旧无法弹窗,查看前端代码:

尝试下一层,直接闭合</select>标签:

成功注入,出现弹窗:

High等级

查看源代码如下:

可以看到,防御已经非常完善了,传入的参数如果不是French、English、German、Spanlish这四种字符串的话,就会直接跳到?default=English。但是,绕过方法还是有的。

使用#定位符,#号后面的字符不会提交给PHP服务器。输入:default=English #<script>alert(1)</script>

成功出现弹窗,如下:

Impossible等级

查看源码如下:

发现并未做限制,直接在网页进行注入,发现语言框内的值是我们输入的参数的经过URL编码后的数据,并未进行解码,因此不存在XSS漏洞,如下:

好啦,以上就是反射型XSS和存储型XSS的题解,大家都学会了吗??

Peace !

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-05-22,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 一名白帽的成长史 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档