由于最近实在是太忙了,于是已经好几天没有更新我的公众号了(反正也没几个人关注)
今天小编初步学习了一下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 !