XSS跨站之原理分类及攻击手法
XSS跨站漏洞
原理
一个可控的输出变量,代码对数据进行显示或者调试出现的安全问题。产生于前端代码和js代码中,XSS全称跨站脚本(Cross Site Scripting),为不和层叠样式表(Cascading Style Sheets, CSS)的缩写混淆,故缩写为XSS。跨站点脚本(XSS)攻击是一种注射型攻击,攻击者在可信的网页中嵌入恶意代码,用户访问可信网页时触发XSS而被攻击。
XSS是一种发生在前端浏览器端的漏洞,所以其危害的对象也是前端用户。
函数类
xss漏洞通常是通过php的输出函数将javascript代码输出到html页面中,通过用户本地浏览器执行的,所以xss漏洞关键就是寻找参数未过滤的输出函数。
常见的输出函数有:echo printf print print_r sprintf die var-dump var_export
危害影响
攻击者通过Web应用程序发送恶意代码,一般以浏览器脚本的形式发送给不同的终端用户。当一个Web程序的用户输入点没有进行校验和编码,将很容易的导致XSS。
• 网络钓鱼,包括获取各类用户账号;
• 窃取用户cookie资料,从而获取用户隐私信息,或利用用户身份进一步对网站执行操作;
• 劫持用户(浏览器)会话,从而执行任意操作,例如非法转账、强制发表日志、电子邮件等;
• 强制弹出广告页面、刷流量等;
• 网页挂马;
• 进行恶意操作,如任意篡改页面信息、删除文章等;
• 进行大量的客户端攻击,如ddos等;
• 获取客户端信息,如用户的浏览历史、真实ip、开放端口等;
• 控制受害者机器向其他网站发起攻击;
• 结合其他漏洞,如csrf,实施进一步危害;
• 提升用户权限,包括进一步渗透网站;
• 传播跨站脚本蠕虫等
特点
注入恶意的代码到用户浏览器的网页上,从而达到劫持用户会话的目的。
xss分类
反射性XSS
存储型XSS
DOM型XSS
反射性XSS
又称非持久型XSS,这种攻击方式往往具有一次性,只在用户单击时触发。
常见注入点
网站的搜索栏、用户登录入口、输入表单等地方,常用来窃取客户端cookies、钓鱼欺骗、
邮件等形式包含xss代码,用户点击时,服务器处理,触发XSS
攻击方式
攻击者通过电子邮件等方式将包含XSS代码的恶意链接发送给目标用户。当目标用户访问该链接时,服务器接受该目标用户的请求并进行处理,然后服务器把带有XSS的代码发送给目标用户的浏览器。
浏览器解析这段带有XSS代码的恶意脚本后,就会触发XSS漏洞。
在黑盒测试中,这种类型比较容易通过漏洞扫描器直接发现,我们只需要按照扫描结果进行相应的验证就可以了。
相对的在白盒审计中, 我们首先要寻找带参数的输出函数,接下来通过输出内容回溯到输入参数,观察是否过滤即可。
案例:
新建 php代码,代码如下:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>XSS</title>
</head>
<body>
<form action="" method="get">
<input type="text" name="input">
<input type="submit">
</form>
<br>
<?php
$XssReflex = $_GET['input'];
echo 'output:<br>'.$XssReflex;
?>
</body>
</html>
当我们输入 1 ,页面返回 1 :
以上都为正常的输出,但如果我们输出一些javascript代码呢?
比如我们输入
出现弹窗
在这里如果想要
<script>alert('xss')</script>
这个代码弹窗的话是要将配置里的魔术引号关闭才可以,不然会被自动转义
这个弹窗并没有什么实际的意义,但通过它我们知道输入javascript代码是可以被执行的,当我们输入一些其他函数,比如document.cookie就可以成功盗取用户的cookie信息,或者读取用户浏览器信息等,为我们进一步深入攻击做铺垫。
存储型XSS
又称持久型XSS,比反射型XSS更具有威胁性,并且可能影响到Web服务器自身的安全。和反射性XSS的即时响应相比,存储型XSS则需要先把利用代码保存在比如数据库或文件中,当web程序读取利用代码时再输出在页面上执行利用代码。但存储型XSS不用考虑绕过浏览器的过滤问题,屏蔽性也要好很多。
常见注入点
论坛、博客、留言板、网站的留言、评论、日志等交互处。
攻击方式
攻击者在发帖或留言的过程中,将恶意脚本连同正常信息一起注入到发布内容中。随着发 布内容被服务器存储下来,恶意脚本也将永久的存放到服务器的后端存储器中。当其他用户 浏览这个被注入了
恶意脚本的帖子时,恶意脚本就会在用户的浏览器中得到执行。
实例:
文件名test.php 代码如下:
<span style="font-size:18px;"><meta http-equiv="Content-Type" content="text/html;charset=utf-8"/>
<html>
<head>
<title>XssStorage</title>
</head>
<body>
<h2>Message Board<h2>
<br>
<form action="test.php" method="post">
Message:<textarea id='Mid' name="desc"></textarea>
<br>
<br>
Subuser:<input type="text" name="user"/><br>
<br>
<input type="submit" value="submit" onclick='loction="test.php"'/>
</form>
<?php
if(isset($_POST['user'])&&isset($_POST['desc'])){
$log=fopen("sql.txt","a");
fwrite($log,$_POST['user']."\r\n");
fwrite($log,$_POST['desc']."\r\n");
fclose($log);
}
if(file_exists("sql.txt"))
{
$read= fopen("sql.txt",'r');
while(!feof($read))
{
echo fgets($read)."</br>";
}
fclose($read);
}
?>
</body>
</html></span>
页面功能简述:
这个页面采用POST提交数据,生成、读取文本模拟数据库,提交数据之后页面会将数据写入sql.txt,再打开页面时会读取sql.txt中内容并显示在网页上,实现了存储型xss攻击模拟。
随意输入东西,然后提交
可以看到页面正常显示页面留言信息。
当我们在Message中输入时,页面成功弹窗 :
并且我们重启浏览器之后再加载该页面,页面依然会弹窗,这是因为恶意代码已经写入数据库中,每当有人访问该页面时,恶意代码就会被加载执行!这就是所谓的存储型XSS漏洞,一次提交之后,每当有用户访问这个页面都会受到XSS攻击,危害巨大。
DOM型XSS
DOM(Document object model),使用DOM能够使程序和脚本能够动态访问和更新文档的内容、结构和样式。
DOM型XSS其实是一种特殊类型的反射型XSS,它是基于DOM文档对象的一种漏洞。DOM型XSS是基于js上的。不需要与服务器进行交互。
三者区别
反射型
发包 x=1 => x.php => 回显示
储存型
发包 x=1 => x.php => 数据库或者文件 => x.php =>回显
DOM型
发包 x=1 => 本地浏览器静态前端代码 => x.php
无表单数据提交操作
js
Js是浏览器执行的前端语言,用户在存在xss漏洞的站点,在输入数据的部分中插入js语言,服务器接收到此数据,认为是js代码,从而返回的时候执行。因此,攻击者可利用这个漏洞对站点插入任意js代码进行窃取用户的信息。
PHP与js的区别
在前端和后端的基础上这两种语言是不同的。JavaScript脚本语言是一种前端语言(除Node.js之外),而PHP是一种服务器端语言。
案例:
靶场地址
进入留言面板http://你的域名/index.php
进入后台
后台地址:http://你的域名/index.php?c=adminlogin
管理员默认帐号admin 密码 admin888
xss平台使用
网站上的xss平台1
网站上的xss平台2
安全起见的个人xss平台构建
cookie session
用户凭据:通过凭据可以判断对方身份信息
cookie 存储本地 存活时间较长 小中型网站
获取管理员cookie登录后台
session 会话 存储服务器 存活时间较短 大型网站
xss防御
使用XSS Filter
输入过滤:
输入验证对用户提交的数据进行有效验证,仅接受指定长度范围内的,采用 适当格式的内容提交,阻止或者忽略除此以外的其他任何数据。
常见的检测或过滤:
输入是否仅包含合法的字符
输入字符串是否超过最大长度的限制
输入如果为数字,数字是否在指定的范围内
输入是否符合特定的格式要求,如邮箱、电话号码、ip地址等
数据消毒:
除了在客户端验证数据的合法性,输入过滤中最重要的还是过滤和净化有害的输入,例如如下常见的敏感字符:
|| < > ' " & # javascript expression
输出编码:
对输出的数据进行编码,如HTML编码,就是让可能造成危害的信息变成无害。
白名单和黑名单
定制过滤策略
web安全编码规范
防御DOM-Based XSS
两点注意点:
避免客户端文档重写、重定向或其他敏感操作,同时避免使用客户端数据,这些操作尽量在服务端使用动态页面来实现。
分析和强化客户端Javascript代码,尤其是一些受到影响的Dom对象
其他防御方式
Anti_XSS
微软开发的,.Net平台下的,用于方式XSS攻击的类库,它提供了大量的编码函数来对用户输入的数据进行编码,可以实现基于白名单的输入的过滤和输出编码。
HttpOnly Cookie
当Cookie在消息头中被设置为HttpOnly时,这样支持Cookie的浏览器将阻止客户端Javascript直接访问浏览器中的cookies,从而达到保护敏感数据的作用。
Noscript
Noscript是一款免费的开源插件,该插件默认禁止所有脚本,但可以自定义设置允许通过的脚本。
WAF
使用WAF,比如软WAF,硬WAF、云WAF等。