xss漏洞(讲课)
0x00 xss漏洞的原理
0x00 http协议
HTTP协议(超文本传输协议HyperText Transfer Protocol),它是基于TCP协议的应用层传输协议,简单来说就是客户端和服务端进行数据传输的一种规则。
0x00 http请求方式
0x01 http请求格式
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漏洞的类型
- 反射型XSS
- 存储型XSS
- 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)

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

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

第二种就是改前端的限制

0x01 pikachu xss反射型(post)



0x01 持久型xss

存储在数据库中了,每当去访问就会触发这个payload,然后获取当前页面的cookie
0x02 dom型xss
0x00 piakchu dom xss
' onclick="alert('MeetA')">
'>
既然题目已经说了是dom,所以我们可以直接去对页面源码进行代码审计
这里的js代码会把用户提交的内容输出到标签中,这样的话,就需要闭合标签和引号

0x01 pikachu dom xss-x
'>
' onclick="alert('MeetA')">
onmouseover需要鼠标划过

还是一样我们去代码审计
0x02 xss漏洞的危害与防范
0x00 危害
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盲打


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


在这里可以看见我们输入的payload,
在评论输入框填写payload:
<script>prompt(document.cookie)</script>
prompt() 弹出个输入框 让你输入东西
在输入名字的地方填写payload:
<script>console.log(document.cookie)</script>
如果函数被传递给函数console.log(),那么该方法将显示传递的function()的值。
0x01 xss过滤

既然题目说了,这个题是xss过滤,所以我们不着急,先输入"<>'on/() script img href src,看看有哪些特殊字符被过滤<br /><br />从源码看,我们的猜测是正确的<br /><br />我们发现<>'on/() script被过滤掉了,用标签试试,输入payload:
<img src="#" onmouseover="alert(document.cookie)">
0x02 xsshtmlspecialchars
htmlspecialchars是一种将HTML特殊字符转换为与之对应的HTML实体的PHP函数。通常用于在Web开发中,以避免潜在的安全问题和防止XSS攻击。例如,字符串"&"被转换为"&","<"被转换为"<",">"被转换为">",而双引号和单引号分别被转换为"""和"'"。
例如,使用特殊字符"<"时,网页会将其解释为html标签的开始部分,而如果您希望在文本中直接显示"<"字符(不被解释为html标签),就需要使用HTML实体字符"<"替代它。同样的,特殊字符">"也应该被替换为">",特殊字符"&"应该被替换为"&",以此类推。
这里我们发现我们输入的被转义了,发现不管是标签内还是href属性内,左右尖括号被编码了,因此这关想闭合标签是不行了。又发现单引号居然没有被html编码,可以,利用一下标签吧。
MeetA' onmouseover='alert(document.cookie)'
0x03 xss herf输出

这里输入url会返回让我们点击,我们可以利用的特性
<a> 标签的 href 属性用于指定超链接目标的 URL。
href 属性的值可以是任何有效文档的相对或绝对 URL,包括片段标识符和 JavaScript 代码段。如果用户选择了 <a> 标签中的内容,那么浏览器会尝试检索并显示 href 属性指定的 URL 所表示的文档,或者执行 JavaScript 表达式、方法和函数的列表。
所以我们可以输入payload:
javascript:alert(document.cookie)

0x04 xss js输出
我们输入
发现这个payload是直接写在script语句中的,我们只需要想办法让语句闭合就行了
';alert(document.cookie);//
0x01 xss-labs
0x00 xss-labs 2

我们输入一个文本去测试,看看这个输入会被传到哪,
我们发现这个文本被传入到value中,我们可以利用>让value标签闭合,然后让输入的文本变成一个单独的script语言
"><script>alert(document.cookie)</script>
0x01 xss-labs 3
同样,我们先输入测试代码,来进行测试
发现输入的标签被转义了,我们就尝试去利用已有标签构造payload,我们发现输入的值被传入在value中,
我们可以尝试进行构造payload
'onmouseover=javascript:alert('xss')
'onfocus=javascript:alert('xss')
0x02 xss-labs 5
先对他进行测试
我们发现不仅有转义,而且标签里面的script也被过滤了
那我们可以尝试对value进行闭合
结果发现,含有on的标签也被过滤了,那么我们可以尝试新的标签,将input标签闭合,使用href标签将我们的js代码转换成网站,网站被点击,就会执行我的js代码

"> <a href=javascript:alert('xss') >MeetA
同样我们还要另外一种绕过方法,因为html和js代码是对大小写不敏感的,所以我们可以使用大小写进行绕过
'ONMOUSEOVER=javascript:alert('xss')






浙公网安备 33010602011771号