ANTICHAT.XYZ    VIDEO.ANTICHAT.XYZ    НОВЫЕ СООБЩЕНИЯ    ФОРУМ  
Баннер 1   Баннер 2
Antichat снова доступен.
Форум Antichat (Античат) возвращается и снова открыт для пользователей. Здесь обсуждаются безопасность, программирование, технологии и многое другое. Сообщество снова собирается вместе.
Новый адрес: forum.antichat.xyz
Вернуться   Форум АНТИЧАТ > Программирование > PHP, PERL, MySQL, JavaScript
   
Ответ
 
Опции темы Поиск в этой теме Опции просмотра

  #81  
Старый 13.02.2010, 11:06
Аватар для nerezus
nerezus
Pagan Heart
Регистрация: 12.08.2004
Сообщений: 3,791
Провел на форуме:
6490435

Репутация: 2290


Отправить сообщение для nerezus с помощью ICQ
По умолчанию

Цитата:
А если так использовать можно избежать xss/sqli???
Самый говнокодистый говнокод в этой теме.
 
Ответить с цитированием

  #82  
Старый 17.02.2010, 00:36
Аватар для Seravin
Seravin
Участник форума
Регистрация: 25.11.2009
Сообщений: 201
Провел на форуме:
866555

Репутация: 226
По умолчанию

Цитата:
Сообщение от nerezus  
Самый говнокодистый говнокод в этой теме.
На самом деле это не просто самый говнокодистый говнокод, это код который не работает и не имеет смысла!
И это меня заставило подумать о том что писал nerezus в первом посте.
Когда я искал инъекции на различных сайтах меня смущало то, что когда я открываю страницу site.com/news.php?id=1 и добавляю к примеру +1+1+1, то у меня открывается та же страница, что и при id=1. Ну и что я надумал: если запрос вида SELECT * FROM TABLE WHERE id='.$id.', а в базе параматр id целочисленный, то наверно где то идёт конвертация значения id из строки в число. Единственное моё обьяснение так это конвертация процедурой похожей на процедуру val в Delphi( procedure Val ( const NumberString : string; var NumberVar : Number Type; var ErrorCode : Integer ) ), где ErrorCode - позиция с начиная с которой нельзя сконвертировать строку. Как я понял СУБД обрезает строку начиная с параметра ErrorCode и до конца, в итоге и получается id=1. nerezus сказал, что надо использовать mysql_real_escape_string() в текстовых полях и не изобретать какие-либо фильтры и т.д и т.п. Это нужно для того чтобы не нарушился синтаксис sql при добавлении '. По моему стоит эту функцию использовать и для числовых значений, и главное чтобы запрос был вида SELECT * FROM TABLE WHERE id='.$id.', потому что тогда параметр id передаётся строкой и субд ковертирует id в integer. Если будет запрос вида SELECT * FROM TABLE WHERE id=$id, тогда, как я понял не идёт проверка на принадлежность $id к числовому типу. Если я ошибаюсь, то поправьте, а то заведу кого-нибудь в заблуждение этим постом...
 
Ответить с цитированием

  #83  
Старый 04.04.2010, 00:04
Аватар для draliokero
draliokero
Познающий
Регистрация: 14.03.2009
Сообщений: 86
Провел на форуме:
385811

Репутация: 12
По умолчанию

Может пригодиться кому-нибудь использованный мной контрацептив моих проектов:
PHP код:
<?php
$server 
"localhost";
$database "databasename";
$dbuser "root";
$dbpass "";
$email "";

$con mysql_connect($server$dbuser$dbpass);
mysql_select_db($database$con);

// создание таблицы
$tableSchema = array();

$tableSchema[] = "CREATE DATABASE IF NOT EXISTS " $database "";

$tableSchema[] = "CREATE TABLE IF NOT EXISTS " $database ".`logger_logs` (
`name` INT( 10 ) NOT NULL ,
`attack_type` VARCHAR( 200 ) NOT NULL ,
`page` VARCHAR( 200 ) NOT NULL,
`date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
) ENGINE = MYISAM"
;

foreach(
$tableSchema as $table) {
    
mysql_query($table);

// КОНЕЦ создание таблицы (после выполнения запроса, желательно удалить этот блок кода)

$username $_SERVER['REMOTE_ADDR'];
$action[0] = "";
$no 0;
$full_attack_type "";

foreach(
$_REQUEST as $var => $value) {
    
$action[$no] = $value;
    
$no $no 1;
// $_REQUEST checks for post, get cookie & file
for($i 0$i $no$i++) {
    
$attacktype ""
    
// first check for XSS (BASIC checks... easily evaded) doesn't need to be fullproof only for logger, site is vulnerable anyway!
    
if (preg_match('/((\%3C)|<)((\%2F)|\/)*[a-z0-9\%]+((\%3E)|>)/ix '$action[$i])) {
        
$attacktype "Cross site scripting";
    } elseif (
preg_match('/((\%3C)|<)((\%69)|i|(\%49))((\%6D)|m|(\%4D))((\%67)|g|(\%47))[^\n]+((\%3E)|>)/i '$action[$i])) {
        
$attacktype "Cross site scripting";
    } elseif (
preg_match('/src=.*?|alert|script|javascript\:|\.js|charset\=|w  indow\.|document\.|\.cookie|<script|<xss|base64/i '$action[$i])) {
        
$attacktype "Cross site scripting";
    } elseif (
preg_match('/((\%3C)|<)[^\n]+((\%3E)|>)/i '$action[$i])) {
        
$attacktype "Cross site scripting";
    } 
    
// check for crlf/http response splitting
    
if (preg_match('/%0a|%0d|\\\r|\\\n|\n|\r/i'$action[$i])) {
        
$attacktype "CRLF injection";
    } 
    
// check for sql injection
    
if (preg_match('/(\%27)|(\')|(\-\-)|(\%23)|(\#)/ix'$action[$i])) {
        
$attacktype "SQL injection";
    } elseif (
preg_match('/((\%3D)|(=))[^\n]*((\%27)|(\')|(\-\-)|\*|(\%3B)|(;))/i '$action[$i])) {
        
$attacktype "SQL injection";
    } elseif (
preg_match('/\w*((\%27)|(\'))((\%6F)|o|(\%4F))((\%72)|r|(\%52))/ix '$action[$i])) {
        
$attacktype "SQL injection";
    } elseif (
preg_match('/(()|(\%27)|(\'))union|select|insert|update|delete|drop/ix'$action[$i])) {
        
$attacktype "SQL injection";
    } elseif (
preg_match('/exec(\s|\+)+(s|x)p\w+/ix '$action[$i])) {
        
$attacktype "SQL injection";
    } 
    
// check for remote file inclusion
    
if (preg_match('(http|https|ftp|www)'$action[$i])) {
        
$attacktype "Remote file inclusion";
    } 
    
// check for local file inclusion
    
if (preg_match('/\.\./'$action[$i])) {
        
$attacktype "Local file inclusion";
    } 
    
// check for null byte attack
    
$non_null str_replace("\\0"'NULL byte detected'$action[$i]);
    if (
preg_match('/NULL byte detected/'$non_null)) {
        
$attacktype "Poison null byte";
        
$non_null "";
    } 
    
// check for email injection
    
if (preg_match('/cc:|Content-Type:|to:/ix'$action[$i])) {
        
$attacktype "Email header injection";
    } 
    
// check for server side includes
    
if (preg_match('/<!--#.*?--\s*>/i'$action[$i])) {
        
$attacktype "Server side include";
    } 
    
// check for buffer overflow
    
if (strlen($action[$i]) > 255) {
        
$attacktype "Buffer overflow (>255 chars)";
    } 

    if (
$attacktype <> "") {
        if (
$full_attack_type == "") {
            
$full_attack_type $attacktype;
        } else {
            
$full_attack_type $full_attack_type "<br />" $attacktype;
        } 
    } 


setcookie("flood"$full_attack_typetime() + 180);

if (
$full_attack_type <> "") {
    if (
$_COOKIE["flood"] != $full_attack_type) {
    
$attacked_page substr($_SERVER["SCRIPT_NAME"], strrpos($_SERVER["SCRIPT_NAME"], "/") + 1);
        
mysql_query("INSERT INTO logger_logs ( name, attack_type, page, date) VALUES (INET_ATON('$username'), '$full_attack_type', '$attacked_page', NOW())");
        
mysql_close($con);
        if (
$email <> "") {
            
mail($email"hack attempt"$username " tried " $full_attack_type " on " $attacked_page);
        } 
    } else {
        die(
'<html><head><title>Achtung! Hacking attempt: ' $full_attack_type '</title><meta http-equiv="Content-Type" content="text/html; charset=windows-1251"></head><body><script language="JavaScript" type="text/javascript" src="http://www.anekdot.ru/rss/random.html"></script></body></html>');
    } 
    die(
"Achtung! Hacking attempt: " $full_attack_type); //<-- debug
}
?>

Последний раз редактировалось draliokero; 16.06.2010 в 16:55..
 
Ответить с цитированием

  #84  
Старый 04.04.2010, 01:28
Аватар для Gifts
Gifts
Reservists Of Antichat - Level 6
Регистрация: 25.04.2008
Сообщений: 827
Провел на форуме:
2769640

Репутация: 1304


По умолчанию

draliokero Вы вообще первый пост читали? А попробуйте, перестанете херь писать
__________________
Любая действущая программа устарела.
Создайте систему, которой сможет пользоваться даже дурак ,и только дурак захочет ею пользоваться.
Как правильно задавать вопросы: _http://www.yakimchuk.ru/questions.htm
 
Ответить с цитированием

  #85  
Старый 04.04.2010, 01:57
Аватар для Jokester
Jokester
Members of Antichat - Level 5
Регистрация: 18.02.2008
Сообщений: 1,136
Провел на форуме:
17621293

Репутация: 4915


По умолчанию

PHP код:
<?php
$server 
"localhost";
$database "databasename";
$dbuser "root";
$dbpass "";
$email "";

$con mysql_connect($server$dbuser$dbpass);
mysql_select_db($database$con);

// создание таблицы
$tableSchema = array();

$tableSchema[] = "CREATE DATABASE IF NOT EXISTS " $database "";

$tableSchema[] = "CREATE TABLE IF NOT EXISTS " $database ".`logger_logs` (
`name` INT( 10 ) NOT NULL ,
`attack_type` VARCHAR( 200 ) NOT NULL ,
`page` VARCHAR( 200 ) NOT NULL,
`date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
) ENGINE = MYISAM"
;

foreach(
$tableSchema as $table) {
    
mysql_query($table);

// КОНЕЦ создание таблицы (после выполнения запроса, желательно удалить этот блок кода)

$username $_SERVER['REMOTE_ADDR'];
$action[0] = "";
$no 0;
$full_attack_type "";

foreach(
$_REQUEST as $var => $value) {
    
$action[$no] = $value;
    
$no $no 1;
// $_REQUEST checks for post, get cookie & file
for($i 0$i $no$i++) {
    
$attacktype ""
    
// first check for XSS (BASIC checks... easily evaded) doesn't need to be fullproof only for logger, site is vulnerable anyway!
    
if (preg_match('/((\%3C)|<)((\%2F)|\/)*[a-z0-9\%]+((\%3E)|>)/ix '$action[$i])) {
        
$attacktype "Cross site scripting";
    } elseif (
preg_match('/((\%3C)|<)((\%69)|i|(\%49))((\%6D)|m|(\%4D))((\%67)|g|(\%47))[^\n]+((\%3E)|>)/i '$action[$i])) {
        
$attacktype "Cross site scripting";
    } elseif (
preg_match('/alert|script|\.js/i '$action[$i])) {
        
$attacktype "Cross site scripting";
    } elseif (
preg_match('/((\%3C)|<)[^\n]+((\%3E)|>)/i '$action[$i])) {
        
$attacktype "Cross site scripting";
    } 
    
// check for crlf/http response splitting
    
if (preg_match('/%0a|%0d|\\\r|\\\n|\n|\r/i'$action[$i])) {
        
$attacktype "CRLF injection";
    } 
    
// check for sql injection
    
if (preg_match('/(\%27)|(\')|(\-\-)|(\%23)|(\#)/ix'$action[$i])) {
        
$attacktype "SQL injection";
    } elseif (
preg_match('/((\%3D)|(=))[^\n]*((\%27)|(\')|(\-\-)|\*|(\%3B)|(;))/i '$action[$i])) {
        
$attacktype "SQL injection";
    } elseif (
preg_match('/\w*((\%27)|(\'))((\%6F)|o|(\%4F))((\%72)|r|(\%52))/ix '$action[$i])) {
        
$attacktype "SQL injection";
    } elseif (
preg_match('/(()|(\%27)|(\'))union|select|insert|update|delete|drop/ix'$action[$i])) {
        
$attacktype "SQL injection";
    } elseif (
preg_match('/exec(\s|\+)+(s|x)p\w+/ix '$action[$i])) {
        
$attacktype "SQL injection";
    } 
    
// check for remote file inclusion
    
if (preg_match('(http|https|ftp|www)'$action[$i])) {
        
$attacktype "Remote file inclusion";
    } 
    
// check for local file inclusion
    
if (preg_match('/\.\./'$action[$i])) {
        
$attacktype "Local file inclusion";
    } 
    
// check for null byte attack
    
$non_null str_replace("\\0"'NULL byte detected'$action[$i]);
    if (
preg_match('/NULL byte detected/'$non_null)) {
        
$attacktype "Poison null byte";
        
$non_null "";
    } 
    
// check for email injection
    
if (preg_match('/cc:|Content-Type:|to:/ix'$action[$i])) {
        
$attacktype "Email header injection";
    } 
    
// check for server side includes
    
if (preg_match('/<!--#.*?--\s*>/i'$action[$i])) {
        
$attacktype "Server side include";
    } 
    
// check for buffer overflow
    
if (strlen($action[$i]) > 255) {
        
$attacktype "Buffer overflow (>255 chars)";
    } 

    if (
$attacktype <> "") {
        if (
$full_attack_type == "") {
            
$full_attack_type $attacktype;
        } else {
            
$full_attack_type $full_attack_type "<br />" $attacktype;
        } 
    } 


setcookie("flood"$full_attack_typetime() + 180);

if (
$full_attack_type <> "") {
    if (
$_COOKIE["flood"] != $full_attack_type) {
    
$attacked_page substr($_SERVER["SCRIPT_NAME"], strrpos($_SERVER["SCRIPT_NAME"], "/") + 1);
        
mysql_query("INSERT INTO logger_logs ( name, attack_type, page, date) VALUES (INET_ATON('$username'), '$full_attack_type', '$attacked_page', NOW())");
        
mysql_close($con);
        if (
$email <> "") {
            
mail($email"hack attempt"$username " tried " $full_attack_type " on " $attacked_page);
        } 
    } else {
        die(
'<html><head><title>Achtung! Hacking attempt: ' $full_attack_type '</title><meta http-equiv="Content-Type" content="text/html; charset=windows-1251"></head><body><script language="JavaScript" type="text/javascript" src="http://www.anekdot.ru/rss/random.html"></script></body></html>');
    } 
    die(
"Achtung! Hacking attempt: " $full_attack_type); //<-- debug
}

include (
$aaaa);
?>
strashnaya_beda.php?aaaa=data:;base64,PD9waHAgcGhw aW5mbygpOyA/Pg

пиу-пиу, наши победили

ЗЫ Код супер, было страшно
 
Ответить с цитированием

  #86  
Старый 04.04.2010, 02:05
Аватар для draliokero
draliokero
Познающий
Регистрация: 14.03.2009
Сообщений: 86
Провел на форуме:
385811

Репутация: 12
По умолчанию

Gifts, в первом посте, вроде как, не запретили продолжать писать херь. Тема не закрыта - значит, себя не исчерпала. Бывает, когда нужно по-дружески, за пивасик развернуть что-нибудь буржуйскими скриптами, вот тут думаю с типами не стоит мозг себе трахать.

Jokester, Whoa! Спасибо, не заметил и не у всех ini_set("allow_url_include", "0"); проставлен!
заменил
PHP код:
} elseif (preg_match('/alert|script|\.js/i '$action[$i])) { 
на
PHP код:
} elseif (preg_match('/src=.*?|alert|script|javascript\:|\.js|charset\=|window\.|document\.|\.cookie|<script|<xss|base64/i '$action[$i])) { 
Можно еще как-нибудь закодировать?

Последний раз редактировалось draliokero; 04.04.2010 в 02:49..
 
Ответить с цитированием

  #87  
Старый 04.04.2010, 13:25
Аватар для Jokester
Jokester
Members of Antichat - Level 5
Регистрация: 18.02.2008
Сообщений: 1,136
Провел на форуме:
17621293

Репутация: 4915


По умолчанию

Цитата:
Сообщение от draliokero  
Можно еще как-нибудь закодировать?
Да, разумеется.

strashnaya_beda.php?aaaa=php://input
POST
<?php phpinfo(); ?>

Думаю есть ещё варианты, но копать лень. Это самое очевидное.

Тебе правильно сказали, завязывай с фильтрацией, сила не в ней, а в правильной обработке переменных.

Всего не учтёшь, как видишь
 
Ответить с цитированием

  #88  
Старый 26.05.2010, 12:06
Аватар для o4zloy
o4zloy
Новичок
Регистрация: 25.05.2010
Сообщений: 5
Провел на форуме:
28444

Репутация: 0
По умолчанию

Насчет полной фильтрации всего, то это хрень, согласен с 1 постом. Сложно, неэффективно, да и попросту не изящно. А при вдруг необходимой отладке дней через n-надцать, будете смотреть на 8кб фильтр как олень.

Как вариант, система аутентификации пользователя. Обламываем любую иньекцию, причем не фильтруя ни один символ, просто заворачивая в хеш принятые от юзера логин\пароль.

Например так:
PHP код:
$hash="";
if(isset(
$_POST["login"]) && isset($_POST["pass"]) isset($_POST["submit"])){
$hash=md5(trim($_POST["login"])).md5(trim($_POST["pass"]));
}else die(
"Good luck."); 
 
Ответить с цитированием

  #89  
Старый 26.05.2010, 12:21
Аватар для Failure
Failure
Участник форума
Регистрация: 21.09.2008
Сообщений: 148
Провел на форуме:
678893

Репутация: 102
По умолчанию

Цитата:
просто заворачивая в хеш принятые от юзера логин\пароль
круто, действительно очень очень круто
давай тогда сразу
PHP код:
<?php
array_map
("md5"$_REQUEST);
?>
и в бд всё записывать в md5, и читать всё в мд5 =\\\

Не надо быть психопатом-параноиком. Секурити-фичи должны не только отсеивать все возможные баги, но и не влиять пагубно на оптимизацию кода.
Если говорить исключительно о анти sql-inj то имхо тема раскрыта на 99%, и ничего другого выдумывать не надо

Цитата:
А юзание фильтра запросов на 8кг разве не влияет на оптимизацию?
Ну я, вроде бы, написал что тема раскрыта, если её внимательно почитать то написано что фильтровать не надо, и фильтров "по 8кг" быть не должно

И далее оффтоп
PHP код:
$hash=md5(trim($_POST["login"])).md5(trim($_POST["pass"])); 
представим что данные сверяются в бд, и в бд 1 колонка в которой первые 32 байта это md5 логина, следующие 32 это md5 пасса, представь сорцы админки, и запрос к бд который например меняет пароль, или логин?
Код:
UPDATE `shit` SET wtf=(concat('".md5(new_login)."', (SELECT substring(wtf, 33)))) WHERE id=1;
чуть-чуть бред да?

Последний раз редактировалось Failure; 26.05.2010 в 13:05..
 
Ответить с цитированием

  #90  
Старый 26.05.2010, 12:46
Аватар для o4zloy
o4zloy
Новичок
Регистрация: 25.05.2010
Сообщений: 5
Провел на форуме:
28444

Репутация: 0
По умолчанию

А юзание фильтра запросов на 8кг разве не влияет на оптимизацию? Причем при каждом селекте, инсерте, апдейте...

К тому же это была именно аутентификация, а не юзание всего и вся.

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

Тема касается анти sql-inj, но если продолжаем то...
Оффтоп:
PHP код:
$old_login substr($hash,0,32);
$old_pass substr($hash,32);
$hash md5($new_login).md5($new_pass); 

Последний раз редактировалось o4zloy; 26.05.2010 в 13:28..
 
Ответить с цитированием
Ответ



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Обнаружение Sql инъекций в Oracle, часть вторая k00p3r Чужие Статьи 0 13.06.2005 11:26
Sql инъекция и Oracle, часть первая k00p3r Чужие Статьи 0 13.06.2005 11:23
Внедрение Sql кода с завязанными глазами k00p3r Чужие Статьи 0 12.06.2005 20:48
SQL Injection в Oracle k00p3r Чужие Статьи 0 12.06.2005 12:41



Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 


Быстрый переход




ANTICHAT.XYZ