跨站脚本 (XSS) 是Web应用中最常见的漏洞之一,这篇文章,我们来讨论识别Web应用跨站脚本漏洞的关键点有哪些。
实践
登陆到靶机的DVWA应用,然后跳转到** XSS reflected **:
如上图,应用使用我们输入的名字“DaoDao”构造一个页面短语。如果我们输入的名字是个由特殊字符组成的字符串会怎么样,例如: <'this is the 1st test'>
如图,我们输入的任何东西,都会反映在响应里,变成返回的HTML页面的一部分。现在,我们查看一下,响应页面的源码,查看下这些信息是如何展现的。
根据HTML源码,我们发现,输出的响应中没有针对特殊符号的编码处理,我们发送的字符串未经任何处理原样返回到了页面。“<”和“>”两个特殊符号往往被用来定义HTML标签。这里我们也可以尝试着把输入内容替换为Javascript脚本。
现在,我们试试输入下面这个附带简单脚本的字符串:
DaoDao<script>alert('XSS')</script>
页面执行了我们的脚本,并触发了告警弹窗,这就是一个存在跨站脚本漏洞的页面。
再次检查一下页面的源码:
我们输入的内容已经自然的嵌入了整个HTML页面,浏览器直接翻译执行了<script>标签中的脚本,弹出了我们刚刚看到的alert弹窗。
总结
跨站脚本漏洞常出现于没有在客户端和服务端对输入数据进行校验或校验不充分,没有合理编码输出的应用中。这类应用允许用户提交HTML代码中可以使用的代码。这些非法符号发给服务端后,服务端没有合理编码输入,例如这里应该用“<”和“>”替换“<”和“>”号,从而防止浏览器解析这段代码。
这些漏洞常常被攻击者用来修改页面在客户端的行为,在受害人不知情的情况下,窃取用户的私人信息。
为了发现 XSS 漏洞,我们常常参考以下特点:
- 我们在输入框填写的字符串原样发送到服务器
- 特殊字符不会被编码或替换的情况
- 通过查看HTML页面源码,我们输入的数据,随页面响应返回后,能够嵌入HTML并成为整个页面的一部分,并能够被浏览器解析
前文我们发现了一个反射型XSS漏洞,这意味着我们的脚本在每次我们发送恶意脚本到服务器,服务器返回的时候就会执行。还有另外一类叫做存储型跨站脚本攻击,这类XSS可能不会在脚本提交后立刻执行,但是会被存储在服务器端(很可能会被存在数据库中),并在每次被终端用户访问存储的数据是被触发。