LINUX.ORG.RU

Теоретическая SQL-уязвимость

 , , , ,


0

1

Итак, данные из формы прямиком заносятся в базу данных. Это плохо, да?
Сделал так:
Форма:

<form method="POST" action="<%= request.getContextPath() %>/comment" accept-charset="UTF-8">
<legend>Оставить комментарий</legend>
<input type="hidden" id="id" name="id" value="${id}">
<input type="text" id="name" name="name" class="span4" placeholder="Псевдоним" />
<textarea id="comment" name="comment" class="span4" rows="3" placeholder="Комментарий"></textarea>
<button type="submit" name="submit" class="btn">Отправить</button>
</form>
Обработчик:
            int id = Integer.parseInt(request.getParameter("id")); // там может быть только int, инфа 100%
            String postName = request.getParameter("name");
            String postComm = request.getParameter("comment");
            String postAddr = request.getRemoteAddr();

            /* ... */

            String sql = "INSERT\n"
                        + "INTO `comments`\n"
                        + "(`id`, `name`, `ip`, `text`) VALUES\n"
                        + "(" + id + ",\n"
                        + "'" + postName + "',\n"
                        + "INET_ATON('" + postAddr + "'),\n"
                        + "'" + postComm + "');";

            /* ... */

            connectToDatabase().executeUpdate(sql);
Если хитрый пользователь (кулхацкер) будет писать свои специальным образом сформированные запросы в формочку или в «/comment», может ли он дропнуть мне базу или ещё что-то нехорошее сделать?

★★★★★

Последнее исправление: CYB3R (всего исправлений: 1)

Это не теоретическая уязвимость а клиническая.

man java.sql.PreparedStatement

Deleted
()
Ответ на: комментарий от beastie

Если, например, заменять эти три символа

'
`
;
на что-нибудь другое (кстати, на что их можно заменить?), то уязвимость пропадёт? Больше никаких лазеек нет?

CYB3R ★★★★★
() автор топика
Ответ на: комментарий от CYB3R

Лазеек на самом деле вагон и маленькая тележка. Лучше не изобретать велосипед (криво), а использовать уже готовое и проверенное → #.

beastie ★★★★★
()
Ответ на: комментарий от CYB3R

тише, если твоей потенциальный работодатель узнает про это то тебя еще лет на 10 отправят в школу, а выше я тебе указал на решение

кроме того у тебя id возвращается с вебстраницы - это хреново

и если ты напрямую выдаешь коменты (а учитывая твои познания это так и есть) то у тебя там еще XSS

Deleted
()
Ответ на: комментарий от Deleted

и если ты напрямую выдаешь коменты

Не угадал :)

кроме того у тебя id возвращается с вебстраницы - это хреново

Сначала я парсил URL-реферрер, но я решил, что это жуткий костыль, потому я решил сделать скрытое поле в форме. Что в этом хренового?

CYB3R ★★★★★
() автор топика
Ответ на: комментарий от CYB3R

судя по запрсоу у тебя это id комента, можно вставить -1

судя по твоему сайтику это id анекты - тогда пофигу да

Deleted
()
Ответ на: комментарий от Deleted

судя по запрсоу у тебя это id комента

У комментариев нет собственных id, есть только точное время занесения в БД (подставляется автоматически). Это серьёзный архитектурный просчёт?

можно вставить -1

Что? Как? Не распарсил эту часть.

судя по твоему сайтику это id анекты

Страница, куда выводятся комментарии, получает их так: «WHERE (`id` = id)»

CYB3R ★★★★★
() автор топика
Ответ на: комментарий от CYB3R

Это серьёзный архитектурный просчёт?

два комента с одним временем (скорее всего от разных клиентов) и только, счетчик с автоинкрементом, причем именно встреонный в субд или uuid

Deleted
()
Ответ на: комментарий от CYB3R

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

trashymichael ★★★
()
            String sql = «INSERT\n»
+ «INTO `comments`\n»
+ "(`id`, `name`, `ip`, `text`) VALUES\n"
+ "(" + id + ",\n"
+ «'» + postName + «',\n»
+ «INET_ATON('» + postAddr + «'),\n»
+ «'» + postComm + «');»;


Это ты сам себе яму роешь. Используй PrepareStatement с его setInt()/setString()/etc. Методы «вставляют» значения вместо '?' в строке.

f1xmAn ★★★★★
()
Ответ на: комментарий от CYB3R

penetration testing нашару? не, не интересно. OWASP Java Project в зубы, тогда это хотя бы интересно будет

vostrik ★★★☆
()
Ответ на: комментарий от Deleted

Вывод сделал из-за этого

судя по твоему сайтику...

Но кто-то там резвится. Надо бы забрутить его SSH :)

CYB3R ★★★★★
() автор топика
Ответ на: комментарий от CYB3R

ну сайтик то найти несложно.

ps. ну да капчу и вывод болше десятка каментов мы не умеем (про prepared stattement даже не слышали), а вот в веб приложение брутилку ssh вкорячим 8)

сорцы то поделки на гитхабе обнови а то я давно анекдотов не читал

Deleted
()
Ответ на: комментарий от Deleted

Капча не нужна, в запросе сообщений из БД стоит «LIMIT 10» на всякий случай. Про prepared statement слышал, но до сих пор не понял, в чём же это лучше простых запросов. Сорцы обновлю.

CYB3R ★★★★★
() автор топика
Ответ на: комментарий от CYB3R

Про prepared statement слышал, но до сих пор не понял, в чём же это лучше простых запросов.

Хм, тогда все тлен.

Deleted
()

Ну PreparedStatement's же с placeholder'ами!

kovrik ★★★★★
()

Ну ты сам-то как думаешь?

anonymous
()
Ответ на: комментарий от aol

Oracle 9, есть индекс users.name

select * from users where name like ?

Оптимизатор использует full scan.

select * from users where name like 'aol%'

Оптимизатор использует индекс.

На других базах не проверял, но по логике так же, т.к. оптимизатор не знает значения параметра в момент анализа и не знает, что там будет, 'aol%', который находится индексом или '%aol', который индексом не находится.

Legioner ★★★★★
()

прочитал тред... ну вы даете, про PreparedStatement никто не знает что ли?

Rastafarra ★★★★
()

А про PreparedStatement все забыли, почему никто не написал?

anonymous
()
Ответ на: комментарий от AGUtilities

вроде бы уже и на джаву перешли, а быдлокодить не перестали...

масэкуэль-с

GateKeeper ★★
()
Ответ на: комментарий от Legioner

На других базах не проверял, но по логике

оптимизатору бы для каждого поданного параметра смотреть, а не для однажды сгенеренного PS. Хотя зависит, конечно. Тем более оптимизатору никто не запрещает быть двухэтапным.

GateKeeper ★★
()
Ответ на: комментарий от Legioner

select * from users where name like ?
Оптимизатор использует full scan
select * from users where name like 'aol%'
Оптимизатор использует индекс.

users такая большая, что не вмещается в память и full table/index scan создаёт существенную нагрузку на I/O, и такие запросы составляют значитемую долю из всех? Вряд ли, поэтому нет нужды заниматься преждевременной оптимизацией. А для поиска по телу сообщений (например) есть всяческие полнотекстовые поиски и другие механизмы.

Nastishka ★★★★★
()

кроме неупомянутого здесь PreparedStatement также рекомендую посмотреть на фреймворки, при помощи которых не приходится работать напрямую с jdbc-api, например ibatis.

maloi ★★★★★
()
Ответ на: комментарий от Nastishka

users такая большая, что не вмещается в память и full table/index scan создаёт существенную нагрузку на I/O, и такие запросы составляют значитемую долю из всех? Вряд ли, поэтому нет нужды заниматься преждевременной оптимизацией. А для поиска по телу сообщений (например) есть всяческие полнотекстовые поиски и другие механизмы.

В users пара десятков миллионов записей и она вся в памяти очевидно не висит, потому что в базе таких users несколько десятков. И full scan vs index это 30 минут vs 100 миллисекунд. Это я из реальной жизни привожу пример, если что, когда система уже давно написана и никакие полнотекстовые поиски в ней делать никто не даст.

Про преждевременную оптимизацию не спорю. Но случаи, когда разные значения дадут разный план есть и учитывать это надо. Кстати, в ту же копилку случаи, когда есть очень много повторяющихся значений у поля и использование индекса будет неверным, а оптимальным будет full scan. Хотя тут, конечно, разница в производительности будет не слишком велика.

Legioner ★★★★★
()
Ответ на: комментарий от Legioner

В users пара десятков миллионов записей и она вся в памяти очевидно не висит, потому что в базе таких users несколько десятков

Если шаблоны в подавляющем большинстве имеют форму «нечто%», то задача частично решается достаточно легко. Если нет - то вы попали, и без FTS не уйдёте :-)

Nastishka ★★★★★
()
Ответ на: комментарий от maloi

Загуглил этот ибатис, на их сайте написано:

Apache iBATIS is retired at the apache software foundation (2010/06/16)
The original project team has moved to MyBatis hosted at Google Code. See http://www.mybatis.org/ for more.
for more information, please view the announcement below and refer to the Attic. 

CYB3R ★★★★★
() автор топика
Ответ на: комментарий от CYB3R

ну я уж не помню, как там называется он - все время путаю :)

maloi ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.