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 !
欢迎关注个人微信公众号~~