pony686
- 关注
0
1
2
3
4
5
6
7
8
9
0
1
2
3
4
5
6
7
8
9
0
1
2
3
4
5
6
7
8
9
0
1
2
3
4
5
6
7
8
9
0
1
2
3
4
5
6
7
8
9
0
1
2
3
4
5
6
7
8
9
0
1
2
3
4
5
6
7
8
9
0
1
2
3
4
5
6
7
8
9
0
1
2
3
4
5
6
7
8
9
0
1
2
3
4
5
6
7
8
9
0
1
2
3
4
5
6
7
8
9
0
1
2
3
4
5
6
7
8
9
1 基础简介
javascritp简介:
JavaScript是一种高级的、解释型的编程语言,广泛应用于Web开发中。它与HTML和CSS一起构成了现代Web应用的基本构建块。
cross site script:
将恶意脚本注入 Web 应用程序时出现的安全漏洞。XSS 可能会造成严重后果,包括未经授权访问用户数据或会话劫持。
CSS 层叠样式表
HTML: 超文本标记语言
XML:XML代表可扩展
标记语言,是一种标记语言,它定义了一组用于以人类可读和机器可读的格式对文档进行编码的规则。
2.伪协议
伪协议"通常指的是一种特殊的URL协议,用于访问浏览器内置的特定功能或执行特定操作。这些伪协议通常以某种协议形式的URL开头,例如"javascript:"、"about:"、"data:"等。
以下是一些常见的伪协议及其用途:
- javascript: 伪协议用于在浏览器中执行JavaScript代码,可以用于动态修改页面内容、执行特定的操作等。
- about: 伪协议用于访问浏览器的内部页面,例如"about:blank"用于打开一个空白页面,"about:config"用于访问浏览器配置页面等。
- data: 伪协议用于在URL中直接包含数据,例如可以将图片数据以base64编码的形式直接嵌入到URL中。
- mailto: 伪协议用于在浏览器中启动邮件客户端,并自动填写收件人地址、主题等信息。
2.1data伪协议
data伪协议是一种用于在URL中嵌入数据的协议。它允许开发者直接在URL中包含数据,而无需使用额外的HTTP请求。data伪协议的语法如下:
data:[<mediatype>][;base64],<data>
其中,<mediatype>表示数据的MIME类型,例如"text/plain"或"image/jpeg",而<base64>是可选的,表示数据是否使用Base64编码。最后的<data>部分包含实际的数据内容。
使用data伪协议可以将数据直接嵌入到HTML文档中,而无需额外的HTTP请求。这在一些特定的场景下非常有用,例如在内联图片或CSS中使用数据URL。然而,需要注意的是,使用data伪协议可能会导致URL变得非常长,影响页面加载性能,因此需要谨慎使用。
默认:
MIME text/plain
charset charset=US-ASCILL
IE
IE8 data url 23kb ,ie9没限制
data url 图片资源,不能导航,脚本,frame,inframe
案例1:
可以构造data 伪协议来实现弹框。
data:text/html;base64,PHNjcmlwdD5hbGVydCgxKTwvc2NyaXB0Pg==
JavaScript伪协议
JavaScript伪协议是一种用于在HTML中执行JavaScript代码的协议。它的语法非常简单,只需要在href属性中使用"javascript:"开头,后面跟着要执行的JavaScript代码即可。
将javascript代码添加到客户端的方法是把它放置在伪协议说明符javascript:后的URL中。这个特殊的协议类型声明了URL的主体是任意的javascript代码,它由javascript的解释器运行。如果javascript:URL中的javascript代码含有多个语句,必须使用分号将这些语句分隔开。这样的URL如下所示:
1 javascript:var now = new Date(); "<h1>The time is:</h1>" + now;
当浏览器装载了这样的URL时,它将执行这个URL中包含的javascript代码,并把最后一条javascript语句的字符串值作为新文档的内容显示出来。这个字符串值可以含有HTML标记,并被格式化,其显示与其他装载进浏览器的文档完全相同。
在浏览器打开javascript:URL的时候,它会先运行URL中的代码,当返回值不为undefined的时候,前页链接会替换为这段代码的返回值。
javascript URL还可以含有只执行动作,但不返回值的javascript语句。例如:
1 javascript:alert("hello world!")
装载了这种URL时,浏览器仅执行其中的javascript代码,但由于没有作为新文档来显示的值,因此它并不改变当前显示的文档。
通常我们想用javascript:URL执行某些不改变当前显示的文档的javascript代码。要做到这一点,必须确保URL中的最后一条语句没有返回值。一种方法是用void运算符显式地把返回值指定为underfined,只需要在javascript:URL的结尾使用语句void 0;即可。例如:下面的URL将打开一个新的空浏览器窗口,而不改变当前窗口的内容:
1 javascript:window.open("about:blank"); void 0;
如果这个URL没有void运算符,window.open()方法的返回值将被转换成字符串并被显示出来,当前窗口将被如下所示的文档覆盖。
利用版本:
chrome 43
firefox 39
safari 无反应
安卓 无反应
案例2:
javascript:alert(1)
3.postMessage
Window postMessage() 方法介绍
postMessage() 方法用于安全地实现跨源通信。(只有同源脚本才能相互通信,window.postMessage() 方法提供了一种受控机制来规避此限制,只要正确的使用,这种方法就很安全。)
1、语法:otherWindow.postMessage(message, targetOrigin, [transfer]);
(1)otherWindow:其他窗口的一个引用,比如iframe的contentWindow属性、执行window.open返回的窗口对象、或者是命名过或数值索引的window.frames。
(2)message:将要发送到其他 window的数据。它将会被结构化克隆算法序列化。这意味着你可以不受什么限制的将数据对象安全的传送给目标窗口而无需自己序列化。
(3)targetOrigin:通过窗口的origin属性来指定哪些窗口能接收到消息事件,其值可以是字符串"*"(表示无限制)或者一个URI。
在发送消息的时候,如果目标窗口的协议、主机地址或端口这三者的任意一项不匹配targetOrigin提供的值,那么消息就不会被发送;
只有三者完全匹配,消息才会被发送。
这个机制用来控制消息可以发送到哪些窗口;例如,当用postMessage传送密码时,这个参数就显得尤为重要,必须保证它的值与这条包含密码的信息的预期接受者的origin属性完全一致,来防止密码被恶意的第三方截获。
如果你明确的知道消息应该发送到哪个窗口,那么请始终提供一个有确切值的targetOrigin,而不是*。不提供确切的目标将导致数据泄露到任何对数据感兴趣的恶意站点。
(4)transfer可选:是一串和message 同时传递的 Transferable 对象,这些对象的所有权将被转移给消息的接收方,而发送一方将不再保有所有权。
这里需要注意一点的就是:postMessage语法 - window.postMessage(msg,targetOrigin),postMessage要通过 window 对象调用!因为这里的window不只是当前window,大部分使用postMessage的时候,都不是本页面的window,而是其他网页的window!如:
(1)iframe的contentWindow
(2)通过window.open方法打开的新窗口的window
(3)window.opener
(4)如果你使用postMessage时没有带window,那么当然,你就是用的本页面的window来调用了它。
案例3:
demo1.html:数据发送端
<!DOCTYPE html>
<html>
<head>
<title></title>
<meta charset="utf-8" />
<script>
function openChild() {
child = window.open('demo2.html', 'popup', 'height=300px, width=500px');
}
function sendMessage(){
//发送的数据内容
let msg={pName : "jack", pAge: "12"};
//发送消息数据数据到任意目标源, *指的是任意anyone
child.postMessage(msg,'*');
}
</script>
</head>
<body>
<form>
<fieldset>
<input type='button' id='btnopen' value='Open child' onclick='openChild();' />
<input type='button' id='btnSendMsg' value='Send Message' onclick='sendMessage();' />
</fieldset>
</form>
</body>
</html>
demo2.html:数据接收端
<!DOCTYPE html>
<html>
<head>
<title></title>
<meta charset="utf-8" />
<script>
//添加事件监控消息
window.addEventListener("message", (event)=>{
let txt=document.getElementById("msg");
//接收传输过来的变量数据
txt.value=`Name is ${event.data.pName} Age is ${event.data.pAge}` ;
});
</script>
</head>
<body>
<form>
<h1>postMessage学习</h1>
<input type='text' id='msg'/>
</form>
</body>
</html>
成功收到消息
接着进行消息劫持,然后进行发送恶意消息
demo3.html
<!DOCTYPE html>
<html>
<head>
<title></title>
<meta charset="utf-8" />
<script>
childwin = window.open('/demo2.html');
function sendMessage(){
let msg={pName : "test", pAge: "111"};
childwin.postMessage(msg,'*')
}
(function(){setTimeout("sendMessage()",1000);}());
</script>
</head>
</html>
接着进行xss漏洞测试
<!DOCTYPE html>
<html>
<head>
<title></title>
<meta charset="utf-8" />
<script>
childwin = window.open('xss.html');
function sendMessage(){
let msg={url:"javascript:alert(/xss/)"};
childwin.postMessage(msg,'*')
}
(function(){setTimeout("sendMessage()",1000);}());
</script>
</head>
</html>
4.浏览器常见编码
歧义:
例子:歧义句
她说话的声音如同钢琴的音符,在空气中飘荡。
4.1URL编码
浏览器常常使用URL编码来处理特殊字符和非ASCII字符,以确保它们在URL中能够正确传输和解析。以下是一些常见的URL编码规则:
1. 空格
- 原始字符:空格
- URL编码:%20
2. 特殊字符
- 原始字符:!, @, #, $, &, ', (, ), *, +, ,, /, :, ;, =, ?, [, ]
- URL编码:%21, %40, %23, %24, %26, %27, %28, %29, %2A, %2B, %2C, %2F, %3A, %3B, %3D, %3F, %5B, %5D
3. 空白字符
- 原始字符:换行符(\n)、制表符(\t)等
- URL编码:%0A, %09 等
4. 非ASCII字符
- 原始字符:汉字、特殊符号等
- URL编码:使用UTF-8编码的百分比编码,例如:%E4%BD%A0(代表汉字“你”)
5. 保留字符
- 原始字符:; / ? : @ & = + $ ,
- URL编码:保留字符在URL中有特殊含义,但如果要表示其原始字符,同样需要进行编码。
这些URL编码规则有助于确保在URL传输中不会引起混淆或错误解析。在编写Web应用程序或处理URL参数时,理解这些编码规则是很重要的。
4.2html编码
HTML编码是用于在网页中表示特殊字符的方法。这种编码使得浏览器能够正确地显示各种字符,包括特殊符号和其他语言的字符。在HTML编码中,某些字符使用实体名称或实体编号来表示。例如:
- < 表示 <(小于号)
- > 表示 >(大于号)
- & 表示 &(和号)
- " 表示 "(引号)
- 表示空格
1、为什么要进行编码?
主要是因为某些数据不适合传输。原因多种多样,如 Size 过大,包含隐私数据,另外重要的一点就是有些字符会引起歧义。
对于 URL: &用于分割多个参数,倘若有某个参数键值为 name=v&lue,就会因为 name 参数的值 v&lue 中携带了&而造成歧义。因此需要对&进行 URL 编码。url编码后,服务端会把紧跟在“%”后的字节当成普通的字节,就是不会把它当成各个参数或键值对的分隔符。
对于 HTML: 当浏览器遇到<会识别为元素定义的开始,>会识别为元素的结束。倘若有<div id="1>" ></div>,由于标签的属性值携带了>,同样会造成歧义。因此需要属性值的>需要 进行 HTML 编码,即使用字符实体。
案例4:
<a href="javascript:alert('XSS')">a</a>
4.3三种编码
HTML 编码(字符实体)
字符实体是一个预先定义好的转义序列。 字符实体两种表示方法:
1、 字符实体以&开头+预先定义的实体名称+;分号结束,如“<”的实体名称为<
2、 字符实体还可以以&开头+#符号+字符在 ASCII 对应的十进制数字+;分号结束,如<的实体编号为<
字符都是有实体编号的,但有些字符是没有实体名称
畅读付费文章
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf 客服小蜜蜂(微信:freebee1024)
