记一次跨站脚本攻击(XSS)实例

环境搭建

  1. 环境搭建,在linux环境下,需要安装apache2(服务器)、mysql(数据库)、php(服务器端语言)。
  2. 将自己的服务器端php文件放在www文件夹中,首页为index.php文件。
  3. 所给的myzoo文件夹就是运行在服务器端的文件。
  4. 需要创建一个数据库。其中apache2与mysql的配置,要和php文件里面的内容配套。

XSS原理

XSS攻击,是指黑客通过“HTML注入”篡改了网页,插入了恶意的脚本,从而在用户浏览网页时,控制用户浏览器的一种攻击。在一开始,这种攻击的演示案例是跨域的,所以叫做“跨站脚本”。但是发展到今天,由于JavaScript的强大功能以及网站前端应用的复杂化,是否跨域已经不再重要。但是由于历史原因,XSS这个名字一直保留下来。

具体演示

任务1:偷cookie

1.原理

同一个网站,有很多个注册用户,每个注册用户可以有自己的简介,并且可以看到别人的简介。如果用户A在自己的简介里面输入的是一段可在浏览器端执行的JavaScript脚本语言,该脚本语言输入之后,将被保存在后台的服务器的数据库中,如果有另一用户B在自己登陆的时候看A的简介,会向服务器提出一个请求,服务器会从数据库中找到A的资料显示在B的浏览器端。然而由于这一段资料有点特殊,它是可以在浏览器端执行的脚本语言,因此此时B的浏览器端获取到该资料之后,浏览器会对其进行解析执行,然后显示,那么问题来了,在执行的过程中就执行了A所希望执行的恶意代码。
用户A想偷用户B的cookie,它可以在自己的简介里面写显示一张图片的脚本,而该图片的请求地址来自于A自己所搭建的恶意网站。那么,如果此时B看A的资料,在浏览器执行脚本的过程中会发现,需要请求一张图片以显示出来,而该图片的源来自于另一个地址,那么B的浏览器只好再发一个请求到该地址,而该请求中则包含了B的cookie,由于该请求是A搭建的,因此A就获得了B的cookie。
还有几点需要注意的是:

  1. 我们要看后台程序,也就是说从index.php文件,我们输入自己的简介之后,点save按钮,表明客户端的输入形成一个表单,以post的形式发送到服务器端,服务器端接收之后存到数据库中。然而在user.php页面,显示A的简介的时候,会对数据库中提取出来的字符进行检查和过滤。
    1
    图一.用户输入简介保存到数据库(服务器端index.php代码)
    2
    图二.用户观看别人简介显示在自己浏览器时,服务器端对字符串的过滤代码(users.php)
    这就涉及到几个问题:
    1)我从简介里面的输入与服务端真正存进数据库中的是否一致?
    2)从数据库中提出的字符串显示在浏览器端时与我输入时的是否一致?
    这一切都取决于,服务器端对我输入的字符串进行的后台操作,而这些操作我是不知道的,只能猜测。因此作为一名真正的黑客,是要能够靠蛛丝马迹猜测服务器端代码的。从而有针对性的构建我的攻击代码。
  2. 我们要用火狐浏览器的工具箱firebug观察并调试我们所接收和提交的数据的源代码。
    2.操作

在A的简介里面输入如下代码:
3
保存到数据库之后显示为如下代码:
4
此时开一个服务器echoserver,设定端口号为5555。
B看A的简介显示为:
5
A所搭建的服务器收到B的请求,得到cookie
6

任务2:转移zoobar

1.原理

当B看A的简介时,自己的zoobar被莫名其妙转移走了。此时是在B的登陆页面,B看A的简介时执行了一段脚本,该脚本发送给服务器,是以自己的cookie发送的,因此该脚本的作用是伪造一个请求,以B的名义,向服务器发送转移zoobar的表单。
2.操作

在d的页面以ajax写出如下代码,ajax是异步的html,代码如下:
13
可见,创建了一个button,当点击该button时,执行的是一个function,该function伪造了一个表单请求提交给服务器,最主要的为:
1.ajax.open中的url,这里是指提交给服务器端的哪一个文件,这里的地址是需要我们伪造的。
2.ajax.send中的参数postStr,这里也需要我们伪造,写的是默认转移一个zoobar给用户d。
当用户c看用户d的简介时,出现如下页面:
7
此时c有7个zoobar,d有12个zoobar。
当c点击button后,出现如下页面:
8
表示转移成功。
再看:
9
此时d变成了13个zoobar,c只有6个zoobar了。

任务3:更新简介

1.原理

当用户f看e的简介时,自己的简介会被改动,说明e伪造了一个请求,提交给服务器,修改了f的简介。我们要看当f保存自己的简介,点击save按钮时,向服务器传送的请求时什么,然后根据该请求伪造。
2.操作

在f中写简介之后,保存。看到向服务器发送的信息如下:
10

可知它的请求页面是index.php,请求参数是Hello和Save。
由此与任务2中的代码一样,只需修改请求页面和请求参数即可。为:
11
然后,当用f看e的简介时,f原来的Hello简介变为了:
12
攻击成功!

防止此类攻击

XSS攻击的本质是用户向网站注入了恶意代码,并使该恶意代码在浏览器端执行了,即浏览器执行了不信任站点的脚本。有如下方法防止此类攻击:

  1. 把标记语言进行转换。例如把”<>”,这样的标记语言,存于后台服务器时用另一个转义字符实现,这样,使它再次被客户端请求进入浏览器时,不被当做标记语言,代码执行,而是作为普通的内容显示。
  2. 在后台进行属性过滤。例如建立白名单与黑名单,使之对于高危的脚本语言,能够直接在保存时就过滤掉。
  3. 采用HTTPONLY,让其cookie不可读,不可改写。这是符合同源策略的。但HTTPONLY的作用也仅止于此,只是让XSS偷不到cookie罢了。

【版权声明】
本文首发于戚名钰的博客http://qimingyu.github.io/ ),欢迎转载,但是必须保留本文的署名戚名钰(包含链接)。如您有任何商业合作或者授权方面的协商,请给我留言:mingyuqi.java@qq.com
欢迎关注我的微信公众号:科技锐新

本文永久链接:http://qimingyu.github.io/2016/04/09/记一次跨站脚本攻击(XSS)实例/

坚持原创技术分享,您的支持将鼓励我继续创作!

热评文章