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

 

Hello 各位小伙伴你们晚上好~~html

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

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

--------------------------------------------------------------------------------------------------------------------------------------正则表达式

什么是XSS?sql

跨站脚本(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 !

 

欢迎关注个人微信公众号~~