Web安全学习笔记5

 跨站脚本攻击漏洞概述

跨站脚本(Cross-site Scripting)攻击(XSS),攻击者通过网站注入点注入客户端可执行解析的payload,当用户访问网页的时候,恶意payload自动加载并执行,以达到攻击者的目的(窃取cookie,恶意传播,钓鱼欺骗等)。

漏洞类型和应用场景

反射型XSS(可用于钓鱼,引流,配合其他漏洞如CSRF)

只会执行一次,非持久型。

主要存在于攻击者将恶意脚本附加到url的参数中,发送给受害者,服务端未经严格过滤处理而输出在用户浏览器中,导致浏览器执行代码数据。

利用场景:

存储型XSS(攻击范围广,流量传播大。可配合其他漏洞)

特点:持久性

主要存在于攻击者将恶意脚本储存到服务器数据库中,当用户访问包含恶意相关数据的页面时,服务端未经严格过滤处理而输出在用户的浏览器中,导致浏览器执行代码数据。

DOM型XSS(配合其他漏洞,长度大小不受限制)

特点:通过JavaScript操作document,实现dom树的重构。

主要存在于用户能修改页面的dom。造成客户端payload在浏览器中执行(在客户端执行)

跨站脚本攻击实操

1.测试:(xss探针)`";"<poiuyt>=&{()}   可以测试网站过滤了哪些字符,进行怎样的防护。

2.查看网页源代码(如何闭合属性,标签等)

3.构建xss payload (如何绕过等)

 payload大全:https://github.com/pgaijin66/XSS-Payloads/blob/master/payload/payload.txt

跨站脚本攻击漏洞接收平台

xss.pt(接收平台网址)

跨站脚本攻击漏洞绕过及防御

绕过

1.<>被过滤的情况下:

加入在特殊标签下的时候,可以构造一些事件触发

"autofocus οnfοcus=alert(1) "

" οnclick=alert(1) "

2.alert被过滤的情况下

编码;另外prompt和confirm也可以弹窗

<a href=data:text/html;base64,PHNjcmlwdD5hbGVydCgzKTwvc2NyaXB0Pgo=>(Firefox可以但chrome不可以)

<svg/οnlοad=prompt(1)/>

<a href=j&#x61;v&#97script&#x3A;#97lert(13)>M JavaScript伪协议(对JavaScript:alert(13)进行字符实体编码)

3.on事件被过滤的情况下

<form><button formaction=javascript&colon;alert(1)>M

<a herf="javascript:alert(document.location);">XSS</a>

4.其他

标签和属性之间并不是只能出现空格:<img/src=x/οnerrοr=alert(1)>

有时候并不需要一个合法的标签:<M/οnclick="alert(1)">M

防御

1.阻止恶意代码注入

2.组织恶意操作执行

不管是反射型还是存储型xss,都能够通过服务端过滤进行防御:

1.黑名单:

过滤特殊符号及字符

如<,>,%,#,/,",',;,(,),script,svg,object,on事件等

2.白名单:

只允许特定类型或符号:

根据输入的数据特征限制使用的类型,如年龄限制为数字类型

3.编码及转义:

输出在标签或属性中进行HTML编码

输出在script标签或事件中进行JavaScript编码

输出在url中进行url编码

4.cookie中设置httponly

setcookie将httponly选项设置为true,防范cookie劫持

5.确保执行脚本来源可信

开发者明确告诉客户端,哪些外部资源可以加载和执行(CSP策略)

6.不使用有缺陷的第三方库
各语言过滤xss的函数:

PHP:htmlentities(),htmlspecialchars()

Python:cgi.escape()

ASP:Server.HTMLEncode()

ASP.NET:Server.HtmlEncode(),Microsoft Anti-Cross Site Scripting Library

Java:xssprotect(Open Source Library)

Node.js:node-validator

htmlspecialchars默认配置是不过滤单引号的。只有设置了:quotestyle选项为ENT_QUOTES才会过滤单引号

xss题目靶场及解析:

关于XSS的靶场详解_xss靶场-CSDN博客

 

 编码:

HTML编码(字符实体):

字符实体是一个预先定义好的转义序列,定义了一些无法在文本内容中输入的单个字符或符号。

格式:

以&开头+预先定义的实体名称+分号结束;

以&开头+#符号+实体编号+分号结束

会进行HTML解码的情况:

数据状态中的字符引用;

RCDATA状态中的字符引用;

属性值状态的字符引用。

在DOM树结构构建完成后,对节点内容进行解析时进行HTML编码

URL编码:

URL编码格式:

%加字符的ASCII编码对应的2位16进制数字,如“/”对应的url编码位%2f

注意:不能对协议类型做任何编码操作,否则url解析器会认为他是无类型

JavaScript编码:

会触发JavaScript解析器的地方:

1.直接嵌入<script>代码块中

2.通过<script src=...>加载外部文件中

3.各种HTML css参数支持JavaScript:URL触发调用

4.CSS expression(...)语法和某些浏览器的XBL绑定

5.事件处理器,比如onload,onerror,onclick等

6.定时器,Timer(setTimeout,setInterval)

7.eval(...)调用

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值