Antichat снова доступен.
Форум Antichat (Античат) возвращается и снова открыт для пользователей.
Здесь обсуждаются безопасность, программирование, технологии и многое другое.
Сообщество снова собирается вместе.
Новый адрес: forum.antichat.xyz
 |
|

13.02.2010, 11:06
|
|
Pagan Heart
Регистрация: 12.08.2004
Сообщений: 3,791
Провел на форуме: 6490435
Репутация:
2290
|
|
А если так использовать можно избежать xss/sqli???
Самый говнокодистый говнокод в этой теме.
|
|
|

17.02.2010, 00:36
|
|
Участник форума
Регистрация: 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 к числовому типу. Если я ошибаюсь, то поправьте, а то заведу кого-нибудь в заблуждение этим постом...
|
|
|

04.04.2010, 00:04
|
|
Познающий
Регистрация: 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_type, time() + 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..
|
|
|

04.04.2010, 01:28
|
|
Reservists Of Antichat - Level 6
Регистрация: 25.04.2008
Сообщений: 827
Провел на форуме: 2769640
Репутация:
1304
|
|
draliokero Вы вообще первый пост читали? А попробуйте, перестанете херь писать
__________________
Любая действущая программа устарела.
Создайте систему, которой сможет пользоваться даже дурак ,и только дурак захочет ею пользоваться.
Как правильно задавать вопросы: _http://www.yakimchuk.ru/questions.htm
|
|
|

04.04.2010, 01:57
|
|
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_type, time() + 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
пиу-пиу, наши победили
ЗЫ Код супер, было страшно 
|
|
|

04.04.2010, 02:05
|
|
Познающий
Регистрация: 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..
|
|
|

04.04.2010, 13:25
|
|
Members of Antichat - Level 5
Регистрация: 18.02.2008
Сообщений: 1,136
Провел на форуме: 17621293
Репутация:
4915
|
|
Сообщение от draliokero
Можно еще как-нибудь закодировать?
Да, разумеется.
strashnaya_beda.php?aaaa=php://input
POST
<?php phpinfo(); ?>
Думаю есть ещё варианты, но копать лень. Это самое очевидное.
Тебе правильно сказали, завязывай с фильтрацией, сила не в ней, а в правильной обработке переменных.
Всего не учтёшь, как видишь
|
|
|

26.05.2010, 12:06
|
|
Новичок
Регистрация: 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.");
|
|
|

26.05.2010, 12:21
|
|
Участник форума
Регистрация: 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..
|
|
|

26.05.2010, 12:46
|
|
Новичок
Регистрация: 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..
|
|
|
|
 |
|
|
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
|
|
|
|