Вопрос. Перехват sql injection.

Статус
В этой теме нельзя размещать новые ответы.
... но все же если очень хочется, то нужно парсить входящие данные на предмет `служебных` слов sql, вроде:
Интересно написал =).
А если ведется поиск и слова
union
select
and
or
from
where
встреча.тся в поиске. Например книги, фильмы, музыка...

Добавлено через 42 секунды
...
или же как вариант парсить access логи, на запросы
Будет уже поздно.
 
Интересно написал =).
А если ведется поиск и слова
встреча.тся в поиске. Например книги, фильмы, музыка...


1. На сайте обычно десятки (а то и сотни) переменных, а переменная которая передает поисковый запрос от пользователя всего одна.
2. Так не по отдельности каждое слово парсить =) (хотя можно и так конечно) – сами по себе они ничего не значат, при проведении инъекции будут определенные сочетания. На них и должен реагировать фильтр. А что бы такой фильтр составить нужно разобраться в тонкостях проведения инъекций (а еще лучше поручить это дело человеку, который хорошо с этим знаком). Я не думаю, что сочетание этих слов будет встречается в названиях фильмов, книг, музыки =)

Но я повторю – не вижу смысла в таком изврате. Лучше организовать нормальную защиту и спать спокойно. ТС, что ты собираешься потом делать с этими данными ? В ЦРУ отправлять ? =) Думаешь кто-то ради твоих сайтов будет расследования проводить ? =) Тем более если взлом проводился через цепочку прокси + впн
 
Можно фильтровать название таблиц или префикс.
Причем префикс можно сделать сложным и уникальным, тогда вероятность того, что он встертится в тексте почти 0.
 
Можно фильтровать название таблиц или префикс.
Причем префикс можно сделать сложным и уникальным, тогда вероятность того, что он встертится в тексте почти 0.

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

site.com/script.php?id=-1+union+select+1,load_file('/site/config.php'),1,1/*

Более того, если прочитать удастся (file_priv=Y для юзера) и если отключены меджик_квотес, то можно сразу заливать вебшелл

site.com/script.php?id=-1+union+select+1,'<?php код_шелла ?>',1,1+into+DUMPFILE+'/blabla/shell.php'/*

Защитится от этого просто - откл файловые привилегии и вкл меджик_квотес, но ТС ведь хочет `ловить` потенциальных хакеров =) а для этого нужно учесть и вышесказанное.
 
Ситуция другого рода.
Есть компания, которая планирует проводить исследования для дальнейшего анализа и продажи.
Хотят сделать возможность заполнения информации аудиторами через интернет, в закрытой для обычных людей зоне сайта.
Аудиторы - это подрядные организации по России.
Так вот. Задача в том, чтобы выявлять неблагонадежных подрядчиков, которые пытаются получить доступ к информации, к которой в рамках исследования они не должны иметь доступа. Например аудитор из магадана, пытается проникнуть и слить базу по всей тест-панели (Россия).
Потому и возник вопрос, как можно именно перехватывать такие действия, как их гасить это уже другая проблема.
 
Шарь все переменные GET на содержание всего кроме [0-9a-z_-], если есть что то левое типа пробел в перменной или кавычки логируй данные... в чем сложность?
 
Например google analytics сохраняет ссылки и там можно найти инъекции, Content->Top Content фильтровать по select или union и будут ссылки типа
post.php?id=-1/**/UNION/**/ALL/**/SELECT/**/
login.php?id=-1+UNION+SELECT+1,2,3,4,concat_ws(0x3a3a,uid,user,psw)

или если пофильтровать по script будут попытки на xss:
?q=javascript:;&B1=search
?q="><script>alert(document.cookie);</script>&sort=&
 
Просто ловить нужно все переменные которые пользователь может отправить на сайт, в обязательном порядке $_GET - основной вид SQL-инъекции и по-любому с него начинается проверка. Далее все просто, например у вас новости: news.php?id=123

Вы делаете проверку регулярными выражениями и проверяете есть ли в $_GET['id'] символы - ' и т.д. Заодно проверяйте UNION, AND, FROM и т.д. Но не забывайте, что можно написать unION, Union, union и т.п.
 
Спасибо всем огромное
 
  • Заблокирован
  • #20
Не знаю на сколько практичен мой метод, но пользую....

PHP:
foreach($_GET as $key=>$val){
 if(eregi("union|select|insert|truncate|delete|show",$val)){ write_log('GET->Injection detect from '.$_SERVER['REMOTE_ADDR'].'('.$_SERVER['REMOTE_HOST'].'): '.$key.'='.$val);}
 else { $stdin[$key] = ereg_replace('<','&lt;',$val);}
}

foreach($_POST as $key=>$val){
 if(eregi("union|select|insert|truncate|delete|show",$val)){ write_log('POST->Injection detect from '.$_SERVER['REMOTE_ADDR'].'('.$_SERVER['REMOTE_HOST'].'): '.$key.'='.$val);}
  else { $stdin[$key] = ereg_replace('<','&lt;',$val);}
}

Просьба сильно не материть.
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху