前言:继《XSS漏洞》
前一篇中解释了什么是反射型XSS,然后有了一个问题,反射型XSS有什么用呢?只是用来自娱自乐,别人又看不到。
emmm,其实不尽然也。
举个例子:
这段html看的懂吗?没错,就是一个表单。如果你将它进行注入,如何?
注入:
页面就会被你篡改掉。(上图很丑,你可以设计的漂亮一些。)
这个时候,你只需要把现在的url(只是例子,并没有对其进行url编码):
http://domainname/DVWA-master/vulnerabilities/xss_r/?name=
脚本的功能会使输入会出现在之间,如果我们的输入中有,那select标签就会被提前闭合掉。而原本文档中有的那个就会被作废(我们前面有说,可以没有后标签,但是不能没有前标签)。select标签闭合后,我们输入的就脱离出了select标签,也就可以显示了。
至于脚本后面生成的几个option,因为select提前闭合的缘故,也就不会写进选择框里,而是直接当文本输出了:
安全等级换为high。
怎么让你连修改都修改不了呢?后台是这么干的:
用switch开关设置白名单限制你,如果你输入的参数不属于case,就执行default选择English,这时无论你怎样修改default参数(可选项之外的),都是English。
处理办法是什么呢?就是,不要把你不符合switch的输入传递给服务器。哈?这能做到吗?
可以,我们需要回谈一个符号“#”。
两篇不错的解释文章。
https://blog.csdn.net/u011600592/article/details/82730989
https://www.cnblogs.com/aaronhoo/p/5803357.html
如果你在html文章中写入这么一段话,当你点击页面这个超链接的时候,窗口就会返回到顶端。如果是,当你点击这个超链接,视角就会移动到此页面中一个name属性为“haha”的标签上(如果有的话)。
#是页面的定位符,至于名字的由来,解释就是上面那段话了。url中的#还有一个特性,就是#之后的字符会被忽略,不会发送到服务器。
例如url: http://jrek.com/index.html?default=english#haha。
服务器只会接收到english,当服务器将页面返回给浏览器,定位haha功能是浏览器要做的。
Now!构建XSS:/?default=English#
但是并没有反应。
重新加载页面:
出来了。
至于这里为什么需要重新加载一下才会显示,问题先留在这里。(清楚原理的,请在下方评论指出。)
(
后记:
)
还有一个impossible等级,后台给了这么一段话:
这也可以看出,预防DOM型XSS,主要是在前端搞定,毕竟它主要利用的是js。
我们查看源码:
有看出哪里有区别吗?document.write("");
标签之间的lang变量不在进行decodeURL了。
url只能通过ASCII码字符集进行发送,我们知道ASCII码字符集并不能涵盖所有的输入字符,比如<>,再比如汉字等等。那对于ASCII码以外字符集的传送,要怎么办呢?
就是在发送之前先对url进行编码,到了服务器在decode回来,就能接受到原来输入的参数了。
例子中option中的value属性的值,就是我们输入的参数被编码后的结果。
<>被编码成了%3C和%3E。
如果让你单用ASCII码字符集写脚本,那是不可理喻,也是不太现实的,好吧。