• 【网络安全的神秘世界】XSS基本概念和原理介绍


    在这里插入图片描述

    🌝博客主页:泥菩萨

    💖专栏:Linux探索之旅 | 网络安全的神秘世界 | 专接本 | 每天学会一个渗透测试工具

    一、基本概念

    恶意攻击者往web页面插入恶意代码脚本(JS代码),当用户浏览该页面时,嵌入web里面的JS代码会被执行,从而达到恶意攻击用户的目的。XSS攻击针对的是用户层面的攻击

    跨站脚本攻击(Cross Site Scripting),为了不和层叠样式表(CSS)的缩写混淆,故将跨站脚本攻击缩写为XSS

    XSS漏洞利用条件:能插入,能执行

    二、XSS分类

    2.1 反射型

    也叫非持久型,常见的就是在url中构造,将恶意链接发送给目标用户。当用户访问链接的时候,会向服务器GET请求来访问带有恶意代码的链接。造成反射型XSS主要是GET类型

    在这里插入图片描述

    先输入恶意代码,造成弹窗说明攻击成功了

    在这里插入图片描述

    但是去了其他页面后再回来,攻击就没有了

    在这里插入图片描述

    像刚才的攻击流程,攻击一次立马失效,这就叫非持久型

    2.2 存储型

    也叫持久型,常见的就是在博客留言版、反馈投诉、论坛评论等位置,将恶意代码和正文都存入服务端,每次访问都会触发恶意代码
    在这里插入图片描述

    输入恶意代码,造成攻击

    在这里插入图片描述

    发现恶意代码被浏览器保存到页面了,访问其他网页再回来,仍会造成攻击,这就叫持久型

    在这里插入图片描述

    --------为什么写出来的恶意代码看不到?

    因为js代码被浏览的解析引擎解析掉了,所以看到的是个空值

    2.3 DOM型

    属于反射型XSS,在网页的标签中写入js代码

    三、手工测试

    漏洞练习靶场:dvwa

    3.1 反射性XSS

    LOW低级

    img标签支持onerror事件,在装载文档或图像的过程中如果发生了错误,就会触发onerror事件

    
    

    在这里插入图片描述

    a标签支持onmouseover事件,需要鼠标移动到a标签的位置才能触发

    请点击
    

    在这里插入图片描述

    a标签可以用来钓鱼或者暗链

    Medium中级

    输入,发现不能出现弹窗

    在这里插入图片描述

    查看dvwa源代码,发现对进行了过滤,替换为空格

    在这里插入图片描述

    有很多绕过方式,可以尝试一下大小写混淆或双写绕过,或者也可以使用其他标签

    大小写混淆:
    双写绕过:ript>alert(1)
    其他标签:
    
    High高级

    通过正则表达式进行过滤

    发送cookie到远程服务器

    
    

    +:连字符,表示拼接

    escape:在Java中表示一个编码,会对括号里的内容进行编码

    无论访问成功与否都不重要,重要的是在http://xxx/a中会留下访问日志,攻击者就能获得cookie值

    3.2 存储型XSS

    LOW低级

    直接输入测试代码点击提交

    在这里插入图片描述

    Medium中级

    输入测试代码,没有造成弹窗

    在这里插入图片描述

    尝试换成标签,发现还是不行

    在这里插入图片描述

    没什么思路了,去看看源代码吧

    在这里插入图片描述

    发现name输入框更好绕过,我们在name输入测试代码

    但是发现name输入框有长度限制

    在这里插入图片描述

    可以在包里面进行修改

    在这里插入图片描述

    也可以按F12键,把长度改大或删除

    在这里插入图片描述

    High高级

    直接看代码吧

    在这里插入图片描述

    同理,还是选择简单的name输入框进行测试

    在这里插入图片描述

    在这里插入图片描述

    四、盲打

    输入的内容提交后并不知道去哪里了

    像下图就是盲打的场景

    在这里插入图片描述

    普通用户看不到,但是管理员账户可以看到

    我们可以构造恶意代码,观察远程服务器web日志,只要网站管理员访问,它的cookie值就被盗取

    在这里插入图片描述

    当管理员登录后台后,还没反应过来就被攻击了

    在这里插入图片描述

    在这里插入图片描述

    五、XSS键盘记录

    查看pikachu自带的XSS键盘记录:var/www/html/pkxss/rkeypress/rk.js

    在这里插入图片描述

    • rk.js:记录用户输入内容
    • rkserver.php:接收用户敲击键盘的输入并保存到数据库

    在实际中,rk.js应放在要攻击的网站中,rkserver.php放置自己搭建的服务器上面

    实验过程

    在做实验之前,我们先修改一下脚本的默认配置

    修改目标地址:就是想要攻击的网站ip,我修改成自己搭建的pikachu靶场ip

    在这里插入图片描述

    在存储型XSS模块输入payload

    
    

    这段payload在留言列表里看不到,因为浏览器有渲染引擎给渲染掉了但实际上存在

    在这里插入图片描述

    之后登录XSS后台进行查看,可以看到获取到了键盘记录

    在这里插入图片描述

    在这里插入图片描述

    六、XSS平台利用——获取cookie

    服务器Pikachu靶场环境:10.0.0.158:8091
    
    被攻击方DVWA靶场环境:10.0.0.158:8090
    

    6.1 初始化自带XSS平台

    点击 管理工具 -> XSS后台

    在这里插入图片描述

    初始化之后,通过页面上的用户名/密码进行登录

    在这里插入图片描述

    点击cookie搜集模块

    在这里插入图片描述

    可以看到这时还没有获取到cookie:

    在这里插入图片描述

    6.2 前台XSS盲打攻击获取cookie值

    查看cookie收集页面的源代码

    在这里插入图片描述

    发现其中的pkxss_cookie_result.php,该脚本文件用于收集和展示cookie

    pikachu后端环境中,是通过同一目录下的cookie.php文件来获取cookie

    在这里插入图片描述

    把cookie.php文件中的ip地址改为要攻击的靶场ip(即dvwa)

    在这里插入图片描述

    XSS盗取cookie payload

    // 使用document.write向页面中写入一个img标签,src访问cookie.php并提供cookie参数为document.cookie
    
    

    XSS(stored) --> 写入payload

    在这里插入图片描述

    提交成功

    在这里插入图片描述

    返回pikachu靶场的后台查看结果

    在这里插入图片描述

    怎么通过盗取的cookie进行登录?

    打开火狐浏览器,安装cookie-editor插件,认准这个作者

    在这里插入图片描述

    使用cookie-editor插件设置cookie值

    在这里插入图片描述

    直接访问dvwa靶场登陆后的界面即10.0.0.158:8090/index.php,不需要登录直接就进来了

    在这里插入图片描述

    -------怎么让攻击者拿到cookie也无法登录?

    • cookie设置有效期
    • 通过多点登录验证

    【多点登录】:同一个账号被多个用户登录

    6.3 BeEF-XSS

    BeEF是一款非常强大的web框架攻击平台,集成了许多payload

    打开kali系统,

    # 安装beef
    sudo apt install beef-xss
    
    # 修改配置文件
    vi /usr/share/beef-xss/config.yaml
    

    修改监听地址为本机ip

    在这里插入图片描述

    修改用户名/密码,否则无法正常启动beef

    在这里插入图片描述

    # 启动befe
    cd /usr/share/beef-xss
    ./beef
    

    在这里插入图片描述

    • Hook URL:劫持程序原有流程,添加额外处理逻辑。具备攻击性
    • UI URL:可以理解为beef工具的管理地址
    • API key:使用beef的钥匙

    启动后,访问http://10.0.0.158:3000/ui/panel页面

    在这里插入图片描述

    会自动跳转到http://10.0.0.158:3000/ui/authentication页面

    使用beef/123进行登录

    1️⃣使用beef克隆其他网站

    curl -H "Content-Type:application/json;charset=UTF-8" 
         -d '{"url":"需要克隆的网址","mount":"克隆的页面在服务器的哪个路径访问"}'
         -X POST http://BeEFURL/api/seng/clone_page?token=服务器启动时的beef API key
    
    # 克隆百度
    # 在 -H 和 -d 选项后面添加了反斜杠 \ 来继续命令到下一行,这有助于保持命令的可读性,并且防止了因为缺少空格而导致的错误
    curl -H "Content-Type:application/json;charset=UTF-8" \
         -d '{"url":"https://www.baidu.com","mount":"/baidu"}' \
         -X POST http://10.0.0.158:3000/api/seng/clone_page?token=2d4450c8a9592eeebba7091d84e26ea617e6be79
    

    克隆成功返回如下页面

    在这里插入图片描述

    访问我们克隆后的网站

    在这里插入图片描述

    进入beef后台,可以看到有机器上线

    在这里插入图片描述

    2️⃣使用beef克隆pikachu平台的“反射性SS(post)”的登陆页面获取账号密码

    curl -H "Content-Type:application/json;charset=UTF-8" \
         -d '{"url":"http://10.0.0.158:8091/vul/xss/xsspost/post_login.php","mount":"/pikachu"}' \
         -X POST http://10.0.0.158:3000/api/seng/clone_page?token=2d4450c8a9592eeebba7091d84e26ea617e6be79
    
    

    访问http://10.0.0.158:3000/pikachu,可以看到beef中有机器上线

    模拟用户在钓鱼页面中进行登录

    在这里插入图片描述

    进入beef后台查看日志,用户名和密码已经被记录了下来

    在这里插入图片描述

    3️⃣使用beef攻击pikachu平台的”XSS之盲打“页面获取cookie

    在【XSS之盲打】中上传hook脚本,让用户触发xss

    
    

    在这里插入图片描述

    访问http://10.0.0.158:8091/vul/xss/xssblind/admin_login.php,登录后台

    在这里插入图片描述

    登陆后发现了携带了hook的payload

    在这里插入图片描述

    去beef后台查看登陆后的cookie值

    选择Current Browser -> Commands -> Browser -> Get Cookie

    在这里插入图片描述

    点击Execute -> command 1 生成cookie

    在这里插入图片描述

    Commands下展示的是可以执行的命令模块,BeEF可以检测出哪些命令模块可以在当前受害的浏览器工作,并用颜色表示:

    • 绿色:命令模块可以在目标浏览器上运行,且用户不会感到任何异常
    • 橙色:命令模块可以在目标浏览器上运行,但是用户可能会感到异常(比如可能会有弹窗,提示,跳转等)
    • 灰色:命令模块尚未针对此目标进行验证,即不知道能否可运行
    • 红色:命令模块不适用于此目标

    七、XSS防御绕过

    在实际的网站中,或多或少

    7.1 过滤不严格

    可以用大小写绕过或者使用别的标签

    7.2 HTML实体编码默认配置

    HTML实体编码原理

    XSS漏洞最好的防御方法是做实体编码,HTML实体编码字符为:

    & ——> &
    “ ——> "
    ' ——> '
    < ——> &#lt;
    > ——> &#gt;
    

    通过htmlspecialchars()函数实现HTML实体编码

    htmlspecialcars()的语法:htmlspecialchars(string,flags,character-set,double_encode)
    

    该函数默认配置下仅过滤掉双引号,只有设置quotestyle的类型,规定如何编码才会同时过滤掉单引号和双引号

    可用的quotestyle类型:

    • ENT_COMPAT:默认,仅编码双引号
    • ENT_QUOTES:编码双引号和单引号
    • ENT_NOQUOTES:不编码任何引号
    绕过HTML实体编码

    输入特殊字符 ' “< >,查看前端源码,我们看到 ‘ ”< > 都进行了html实体编码

    在这里插入图片描述

    但是没有对 ' 进行实体编码,可以使用单引号构造payload

    #' onclick='alert(/xss)
    #' onmousemove='alert(/xss)
    

    可以看到我们的输入变成了下图所示

    在这里插入图片描述

    点击语句即可触发弹窗

    在这里插入图片描述

    八、XSS安全防御

    通过前面的介绍可以得知,XSS攻击有两大要素:

    1、攻击者提交恶意代码 --输入
    2、浏览器执行恶意代码 --输出
    

    根本的解决方法:从输入到输出都需要过滤、转义

    8.1 输入检查

    以下为需要过滤的常见字符:

    |  &  ;  $  %  @  '  "  \'  \"  <>  ()  +  CR  LF  ,  \
    

    过滤这个方法可以用,但不能仅用过滤;因为过滤的太严格,业务会受到影响;可过滤的不严格,攻击者又可以绕过。通常和html实体编码一起用

    8.2 输出检查

    8.2.1 HTML实体编码

    在PHP中,有htmlentities()和htmlspecialchas()两个函数可以满足安全要求

    即破坏一些特殊符号,从而让其无法生效

    & ——> &
    “ ——> "
    ' ——> '
    < ——> &#lt;
    > ——> &#gt;
    
    8.2.2 JavaScript编码

    JavaScriptEncode与HtmlEncode的编码方式不同,它需要使用反斜杠“\”对特殊字符进行转义

    除了上面的那些转移之外,还要附加上下面的转义:

    \ --> \\
    / --> \/
    ; --> ;(全角)
    

    8.3 HttpOnly

    避免xss攻击利用document.cookie获取cookie值

    许多XSS攻击的目的就是为了获取用户的cookie,将cookie标记为HttpOnly属性,这样的话浏览器向服务端发起请求时就会带上cookie自动,但是在脚本中不能在调用cookie

  • 相关阅读:
    FFmpeg进阶:生成视频的缩略图
    【Linux】 yum —— Linux 的软件包管理器
    2022,VSCode 前端插件推荐
    centos-7-安装minio-20220620
    【Web】标准文档流
    vue input防抖
    Java版工程行业管理系统源码-专业的工程管理软件- 工程项目各模块及其功能点清单
    初学后端,如何做好表结构设计?
    说实话,确实有点难
    ElasticSearch学习和使用 (使用head软件可视化es数据)
  • 原文地址:https://blog.csdn.net/weixin_54750312/article/details/140303061