反射型XSS

反射型XSS
反射型XSS一般指攻击者通过特定的方式来诱惑受害者去访问一个包含恶意代码的URL。当受害者点击恶意链接url的时候,恶意代码会直接在受害者的主机上的浏览器执行。
反射性XSS又可以叫做非持久性XSS。为什么叫反射型XSS呢?那是因为这种攻击方式的注入代码是从目标服务器通过错误信息,搜索结果等方式反射回来的,而为什么又叫非持久性XSS呢?那是因为这种攻击方式只有一次性。比如:黑客通过电子邮件等方式将包含注入脚本的恶意链接发送给正常用户,当用户点击该链接的时候,注入脚本被传输到目标服务器上,然后服务器将注入脚本 "反射"到受害者的浏览器上,从而浏览器就执行了该脚本。
这一类型的XSS通常出现在网站的搜索栏和用户登录入口等地方,通常用来窃取客户端Cookies或进行钓鱼欺骗。我们可以通过一个小演示来让大家更好得认识反射型XSS:
先创建一个可以作为攻击对象的网页,如我们的文件re-xss.php。
反射型XSS

这段代码中首先包含一个表单,用于向页面自己发送GET请求,带一个名为XSS的参数。 然后PHP会读取该参数,如果不为空,则直接打印出来,这里不存在任何过滤。也就是说,如果XSS中存在HTML结构性的内容,打印之后会直接解释为HTML元素。
如图3.2,当我们提交反射型XSS通过修改URL来进行攻击的结果:
反射型XSS
图3.2 反射型XSS攻击成功
我们输入的HTML代码被执行了。查看审查元素,我们插入的内容被当做html元素显示在页面上了。
反射型XSS

图3.3 输入的HTML代码未被过滤
有时候我们直接修改它的URL也会出现这样的效果。
http://localhost:8081/cdl/re-xss.php?xss=
由于反射型 XSS 的数据流向是:浏览器 -> 后端 -> 浏览器,不像持久型还指向数据库,所以反射型XSS的危害比不上持久性XSS,但恶意代码暴露在URL参数中,并且一度要求用户单击才能触发,有点安全意识的用户可以轻易看穿该链接是不可靠的。如此一来,则它的成本就高于持久型了。但是我们也不能小看它的威力,有些黑客在攻击前会尽心布置一切,如恶意URL暴露问题,可以通过各种编码转换解决,图3.3攻击的URL可以转换成如下所示:
http://localhost:8081/cdl/re-xss.php?xss=%3Cscript%3Ealert%28%27re+xss%27%29%3C%2Fscript%3E
由此可见,恶意代码经过编码处理后增加了它的迷惑性,还有更厉害的是攻击者分别使用十进制、十六进制和ESCAPE等各种编码形式来迷惑用户,我们万万不能小瞧它。