xss漏洞(讲课)

0x00 xss漏洞的原理

0x00 http协议

HTTP协议(超文本传输协议HyperText Transfer Protocol),它是基于TCP协议的应用层传输协议,简单来说就是客户端和服务端进行数据传输的一种规则。

0x00 http请求方式

image.png

0x01 http请求格式

image.png

0x02 http特点

请求应答模式
可扩展
可靠传输
无状态

无状态导致http每个请求都是独立的,让我们需要做的就是保存会话

0x01 cookie与session

0x00 cookie的原理

当你在浏览网站的时候,WEB 服务器会先送一小小资料放在你的计算机上,Cookie 会帮你在网站上所打的文字或是一些选择,都纪录下来。当下次你再光临同一个网站,WEB 服务器会先看看有没有它上次留下的 Cookie 资料,有的话,就会依据 Cookie里的内容来判断使用者,送出特定的网页内容给你。

0x01 session的原理

cookie保存session的id:保存这个session id的方式可以采用cookie,一般这个cookie的名字都是类似于SEEESIONID。
session机制是一种服务器端的机制,服务器使用一种类似于散列表的结构(也可能就是使用散列表)来保存信息。

0x03 xss漏洞的原理

攻击者在Web页面中注入恶意的Script代码,当用户浏览该网页时,嵌入的Script代码会被执行,从而达到攻击的目的。

0x01 xss漏洞的类型

  1. 反射型XSS
  2. 存储型XSS
  3. DOM型XSS

①反射型XSS
攻击者向服务器一个带有恶意JS代码的请求,服务器会向攻击者返回一个带有JS脚本的页面,攻击者将带有恶意JS脚本的页面发送给目标用户,用户点击后就会触发XSS漏洞,从而被盗取cookie值或者被重定向到第三方网站。
②存储型XSS
攻击者向服务器一个带有恶意JS代码的请求,服务器会先在服务器上存储一份,然后会向攻击者返回一个带有JS脚本的页面。此时,当其他用户登录这个网站时,都会被盗取cookie值或者被重定向到第三方网站。
③DOM型XSS
DOM - XSS是通过url传入参数修改页面的DOM节点去控制触发的。

攻击者向服务器一个带有恶意JS代码的请求,服务器的响应不会以任何形式包含攻击者的脚本。当用户的浏览器处理这个响应时,DOM对象就会处理XSS代码,导致存在XSS漏洞。

0x00 反射型xss

0x00 pikachu xss反射型(get)

image.png

<script>alert("MeetA")</script>

image.png

这时候发现payload有字数限制,这时候有两种方式去绕过
第一种就是在url上进行构造payload,要记得对payload中的空格进行url编码

image.png

第二种就是改前端的限制
image.png

image.png

0x01 pikachu xss反射型(post)

image.png

image.png

image.png

这关没什么过滤,登录了然后直接写payload就行了

0x01 持久型xss

image.png
存储在数据库中了,每当去访问就会触发这个payload,然后获取当前页面的cookie

image.png

0x02 dom型xss

0x00 piakchu dom xss

' onclick="alert('MeetA')">

'>
既然题目已经说了是dom,所以我们可以直接去对页面源码进行代码审计

这里的js代码会把用户提交的内容输出到标签中,这样的话,就需要闭合标签和引号
image.png

image.png

0x01 pikachu dom xss-x

'>
' onclick="alert('MeetA')">

onmouseover需要鼠标划过

image.png
还是一样我们去代码审计

image.png

0x02 xss漏洞的危害与防范

0x00 危害

  • 窃取cookie
  • 抓取屏幕截图
  • 获取键盘记录
  • 重定向
  • 网页钓鱼
  • 网页挂马
  • 结合网页挂马或者其他工具(Metasploit)获取服务器或者操作系统权限

0x01 防御方法

  • 对用户的输入进行过滤
比如说添加黑名单或者白名单规则,比如说对&   "  '  /   expression   javascript    import等敏感字符进行转义
  • 使用 HttpOnly Cookie
如果cookie中设置了HttpOnly属性,那么通过js脚本将无法读取到cookie信息,这样能有效的防止XSS攻击,窃取cookie内容,这样可以有效的防止XSS攻击窃取cookie。

response.addHeader("Set-Cookie", "uid=112; Path=/; HttpOnly");
  • 设置X-XSS-Protection属性
该属性被所有的主流浏览器默认开启。X-XSS-Protection,即XSS保护属性,是设置在响应头中目的是用来防范XSS攻击的。在检查到XSS攻击时,停止渲染页面。

header("X-XSS-Protection: 1");
  • 开启CSP网页安全策略
CSP是网页安全策略(Content Security Policy)的缩写。开启策略后        可以起到以下作用

禁止加载外域代码,防止复杂的攻击逻辑。

禁止外域提交,网站被攻击后,用户的数据不会泄露到外域。

禁止内联脚本执行(规则较严格,目前发现 GitHub 使用)。

禁止未授权的脚本执行(新特性,Google Map 移动版在使用)。

合理使用上报可以及时发现 XSS,利于尽快修复问题。
  • 避免内联事件
尽量不要使用 onLoad=“onload(’{{data}}’)”、onClick=“go(’{{action}}’)” 这种拼接内联事件的写法。在 JavaScript 中通过 .addEventlistener() 事件绑定会更安全。
  • 使用模板引擎
开启模板引擎自带的 HTML 转义功能。例如: 在 ejs 中,尽量使用 而不是 ; 在 doT.js 中,尽量使用 {{! data } 而不是 {{= data }; 在 FreeMarker 中,确保引擎版本高于 2.3.24。

0x03 xss漏洞的实战演练

0x00 pikachu xss 6-10

0x00 xss盲打

image.png
image.png
这个题他比较有意思,他需要你先去登录后台可以看见回显,但是他没有给你他的后台登录界面,需要你自己去找,
登录后台,看会发生啥?后台登录地址是/xssblind/admin_login.php

image.png

image.png
在这里可以看见我们输入的payload,
在评论输入框填写payload:

<script>prompt(document.cookie)</script>
prompt() 弹出个输入框 让你输入东西

在输入名字的地方填写payload:

<script>console.log(document.cookie)</script>
如果函数被传递给函数console.log(),那么该方法将显示传递的function()的值。

0x01 xss过滤

image.png
既然题目说了,这个题是xss过滤,所以我们不着急,先输入"<>'on/() script img href src,看看有哪些特殊字符被过滤<br />![image.png](https://cdn.nlark.com/yuque/0/2023/png/22948880/1681949278459-2512cc52-8683-4a3c-a7b8-e34f89a9a743.png#averageHue=%23f8f7f6&clientId=u784771c5-de18-4&from=paste&height=106&id=uca8ad13f&name=image.png&originHeight=133&originWidth=376&originalType=binary&ratio=1.25&rotation=0&showTitle=false&size=8117&status=done&style=none&taskId=u33cd18d9-3ce3-428a-b63f-5b9cb18ec2e&title=&width=300.8)<br />从源码看,我们的猜测是正确的<br />![image.png](https://cdn.nlark.com/yuque/0/2023/png/22948880/1681949834263-83b80bae-1637-4284-b1b7-f02046f473af.png#averageHue=%23211f1f&clientId=u784771c5-de18-4&from=paste&height=104&id=u100e3de5&name=image.png&originHeight=130&originWidth=893&originalType=binary&ratio=1.25&rotation=0&showTitle=false&size=22593&status=done&style=none&taskId=u89cc8188-de1c-4048-a470-20884c8f99f&title=&width=714.4)<br />我们发现<>'on/() script被过滤掉了,用标签试试,输入payload:

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

0x02 xsshtmlspecialchars

htmlspecialchars是一种将HTML特殊字符转换为与之对应的HTML实体的PHP函数。通常用于在Web开发中,以避免潜在的安全问题和防止XSS攻击。例如,字符串"&"被转换为"&","<"被转换为"<",">"被转换为">",而双引号和单引号分别被转换为"""和"'"。

例如,使用特殊字符"<"时,网页会将其解释为html标签的开始部分,而如果您希望在文本中直接显示"<"字符(不被解释为html标签),就需要使用HTML实体字符"<"替代它。同样的,特殊字符">"也应该被替换为">",特殊字符"&"应该被替换为"&",以此类推。
image.png

这里我们发现我们输入的被转义了,发现不管是标签内还是href属性内,左右尖括号被编码了,因此这关想闭合标签是不行了。又发现单引号居然没有被html编码,可以,利用一下标签吧。

MeetA' onmouseover='alert(document.cookie)'

0x03 xss herf输出

image.png
这里输入url会返回让我们点击,我们可以利用的特性

<a> 标签的 href 属性用于指定超链接目标的 URL。

href 属性的值可以是任何有效文档的相对或绝对 URL,包括片段标识符和 JavaScript 代码段。如果用户选择了 <a> 标签中的内容,那么浏览器会尝试检索并显示 href 属性指定的 URL 所表示的文档,或者执行 JavaScript 表达式、方法和函数的列表。

所以我们可以输入payload:

javascript:alert(document.cookie)

image.png

0x04 xss js输出

我们输入
image.png
发现这个payload是直接写在script语句中的,我们只需要想办法让语句闭合就行了

';alert(document.cookie);//

0x01 xss-labs

0x00 xss-labs 2

image.png
我们输入一个文本去测试,看看这个输入会被传到哪,
image.png
我们发现这个文本被传入到value中,我们可以利用>让value标签闭合,然后让输入的文本变成一个单独的script语言

"><script>alert(document.cookie)</script>

0x01 xss-labs 3

同样,我们先输入测试代码,来进行测试
image.png
发现输入的标签被转义了,我们就尝试去利用已有标签构造payload,我们发现输入的值被传入在value中,
我们可以尝试进行构造payload
image.png

'onmouseover=javascript:alert('xss')
'onfocus=javascript:alert('xss')

0x02 xss-labs 5

先对他进行测试
image.png
我们发现不仅有转义,而且标签里面的script也被过滤了
那我们可以尝试对value进行闭合
image.png
结果发现,含有on的标签也被过滤了,那么我们可以尝试新的标签,将input标签闭合,使用href标签将我们的js代码转换成网站,网站被点击,就会执行我的js代码
image.png
image.png

"> <a href=javascript:alert('xss') >MeetA

同样我们还要另外一种绕过方法,因为html和js代码是对大小写不敏感的,所以我们可以使用大小写进行绕过

'ONMOUSEOVER=javascript:alert('xss')

image.png

posted @ 2023-04-20 09:58  MeetA  阅读(167)  评论(0)    收藏  举报