专栏首页一名白帽的成长史【XSS漏洞】一步步教你通关DVWA

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

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

今天小编初步学习了一下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 !

本文分享自微信公众号 - 一名白帽的成长史(monster-liuzhi),作者:Monster刘智

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-05-22

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 【XSS漏洞】XSS漏洞相关总结v1.0

    通常指攻击者通过“HTML注入”篡改网页,插入恶意脚本,从而在用户浏览网页时,控制用户浏览器的一种攻击手段 。

    一名白帽的成长史
  • 【XSS漏洞】浅析XSS脚本注入点

    今天跟大家分享的课题是,当我们进行XSS脚本注入时,在不同的注入点进行注入,会产生不同的结果,那么这到底是为什么呢?不同节点,我们又该用什么针对性的插入方法呢?...

    一名白帽的成长史
  • 【XSS漏洞】利用XSS进行网页钓鱼

    这里是你们微胖的小编Monster。 Whatever,让我们一起来看看今天的内容吧

    一名白帽的成长史
  • wwwxml400com请拨18608765024bee-box之XSS攻击

    一个月前刷了XSSchalleng以为自己已经算是入门了XSS了,但是在我挖洞碰到有可能存在XSS漏洞网页的时候,发现我只能记起来<script>alert('...

    用户7106032
  • 哆啦靶场XSS挑战赛1-10关攻略

    哆啦集成了网络上常见的靶场与GitHub上比较好的靶场系统,配合一键启动模式,省去你去收集再进行搭建的时间,方便你更加快速的学习信息安全。

    周俊辉
  • 网站搭建-django-学习成绩管理-09-查询成绩之前端实现

    系统:Windows 7 语言版本:Anaconda3-4.3.0.1-Windows-x86_64 编辑器:pycharm-community-2016.3....

    zishendianxia
  • 构建shell脚本一文就够

    非常多的朋友在看我们公众号过往转录组,WES,等流程分享的时候发现很难理解我们的代码,其实就是缺乏shell脚本知识,那么这篇教程你就不容错过。 内容 使用多个...

    生信技能树
  • web安全之XSS实例解析

    跨站脚本攻击(Cross Site Script),本来缩写是 CSS, 但是为了和层叠样式表(Cascading Style Sheet, CSS)有所区分,...

    前端迷
  • XSS跨站脚本攻击

    跨站脚本(cross site script)为了避免与样式css混淆,所以简称为XSS。

    那一叶随风
  • FPGA block RAM和distributed RAM区别

    区别之1 bram 的输出需要时钟,dram在给出地址后既可输出数据。 区别之2 dram使用根灵活方便些 区别之3 bram有较大的存储空间,dram浪费LU...

    瓜大三哥

扫码关注云+社区

领取腾讯云代金券