Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Sql инъекции / 25 сообщений из 46, страница 1 из 2
10.09.2014, 15:15
    #38743095
Елдос
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Sql инъекции
При сканировании сети на сайте в котором я являюсь администратором обнаружили sql уязвимость.
где искать уязвимость, есть отдельный класс который использует combopooleddatasource для соединения.
возможно ли через этот пул провести инъекцию.
нужно ли ставить какие то дополнительную защиты вроде фильтрации имени пользователя и пароля и других данных.
...
Рейтинг: 0 / 0
10.09.2014, 15:18
    #38743104
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Sql инъекции
DataSource к SQL инъекциям отношения не имеет. Ищите конкатенацию строк при построении SQL запросов.
...
Рейтинг: 0 / 0
10.09.2014, 15:22
    #38743119
DDiver
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Sql инъекции
Елдос,

в классическом понимании, sql-injection провести через datasource нельзя, т.к. никаких сторонних запросов он не выполняет. А вот через говнокод, который использует этот datasource вполне можно.
...
Рейтинг: 0 / 0
10.09.2014, 15:34
    #38743148
Елдос
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Sql инъекции
Blazkowicz,

можно привести пример,
есть маленький код класса который используется для соединения с базой данных, и там ничего подобного,
попробую поискать в других классах если вы привели бы мне пример. сайт на JSP
...
Рейтинг: 0 / 0
10.09.2014, 15:47
    #38743169
DDiver
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Sql инъекции
Елдос, как-то так

bad
Код: java
1.
ps = connection.prepareStatement("UPDATE table_name SET status="+someVar.toString()+" WHERE status="+otherVar.toString());


good
Код: java
1.
2.
3.
ps = connection.prepareStatement("UPDATE table_name SET status=? WHERE status=?");
ps.setString(1,"someString);
ps.setString(2,"otherString);
...
Рейтинг: 0 / 0
10.09.2014, 16:02
    #38743198
забыл ник
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Sql инъекции
ваш классик коннкешена скорее всего не иметт никакого отношения к инъекции, вам же говорят, что дело в запросах выполняюшихся через этот коннекшен, ищите там откуда они приходят, ну если это конечно не шелл
...
Рейтинг: 0 / 0
10.09.2014, 16:53
    #38743301
lleming
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Sql инъекции
ЕлдосПри сканировании сети на сайте в котором я являюсь администратором обнаружили sql уязвимость.
где искать уязвимость, есть отдельный класс который использует combopooleddatasource для соединения.
возможно ли через этот пул провести инъекцию.
нужно ли ставить какие то дополнительную защиты вроде фильтрации имени пользователя и пароля и других данных.

а url по которому уязвимость проявилась инструмент не показал ?
...
Рейтинг: 0 / 0
10.09.2014, 16:58
    #38743311
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Sql инъекции
Елдосгде искать уязвимость
- проверить не развод ли это. Закомментировать все вызовы и дать им URL опять.
- пример инжекции может быть такой, как подзапросы в запросе
https://www.google.com/search?q=gjlpfghjc d pfghjct&ie=utf-8&oe=utf-8&aq=t&rls=org.mozilla:ru:official&client=firefox-a&channel=sb#newwindow=1&rls=org.mozilla:ru:official&channel=sb&q=подзапрос в запросе&spell=1
...
Рейтинг: 0 / 0
10.09.2014, 17:42
    #38743390
Сергей Арсеньев
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Sql инъекции
DDivergood
Код: java
1.
2.
3.
ps = connection.prepareStatement("UPDATE table_name SET status=? WHERE status=?");
ps.setString(1,"someString);
ps.setString(2,"otherString);



Далеко не панацея. :)
1. Можно сохранить javascript, который потом вычитается у другого пользователя и ненароком выполнится.
2. Ну или не javascript, а какая-нибудь процедура (функция/триггер) в базе, которая вдруг бац и все же выполнит написанный код при составлении отчета (например вычисляя самописный агрегат или произведение значений столбца при обходе по дереву).
...
Рейтинг: 0 / 0
10.09.2014, 18:15
    #38743450
DDiver
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Sql инъекции
Сергей Арсеньев,

А ненароком это как? Если специально не интерпритировать строку как скрипт, на клиенте он не как не выполниться. Да что либо создать в бд не получится, случай особо ожаренного программиста не рассматриваем.
...
Рейтинг: 0 / 0
10.09.2014, 20:04
    #38743559
scf
scf
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Sql инъекции
Сергей Арсеньев,

от классического sql injection - как раз панацея :) Не путать с XSS!
Вот хранимки да, отдельная песня, т.к. там удобные prepared statement-ы не предусмотрены конструкцией. Вот, например, интересная ссылка: http://bobby-tables.com/plsql.html
...
Рейтинг: 0 / 0
11.09.2014, 06:27
    #38743734
Елдос
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Sql инъекции
lleming,
нет этого не показал
...
Рейтинг: 0 / 0
11.09.2014, 06:30
    #38743737
Елдос
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Sql инъекции
DDiver,
понял, спасибо
...
Рейтинг: 0 / 0
11.09.2014, 10:39
    #38743889
Alexey Tomin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Sql инъекции
scfСергей Арсеньев,

от классического sql injection - как раз панацея :) Не путать с XSS!
Вот хранимки да, отдельная песня, т.к. там удобные prepared statement-ы не предусмотрены конструкцией.

Как не предусмотрены? Всё там есть.

scfВот, например, интересная ссылка: http://bobby-tables.com/plsql.html

"Bind Variables" называются. А писать, как там в примере- это можно сервер уронить хорошо, даже без инъекций.
Наблюдал переписывание функции с конкатенации на bind Variables с ускорением на пару порядков (да, в 100 раз- оптимизатор при конкатенации каждый раз мучается, плюс кэш переполняется, а с переменными- один раз, всё быстро).

Другое дело, что вызывая любой код (не только pl/sql), хорошо бы быть уверенным, что писал его не студент (вот в моём примере так и было, кстати), а знающий человек.
...
Рейтинг: 0 / 0
11.09.2014, 11:47
    #38743980
scf
scf
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Sql инъекции
Alexey Tomin,

Речь идет об Oracle? Интересно, у нас все запросы через конкатенацию сделаны... Можно пример, как правильно? Поговорю потом с датабазниками.
...
Рейтинг: 0 / 0
11.09.2014, 12:28
    #38744036
Alexey Tomin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Sql инъекции
scfРечь идет об Oracle? Интересно, у нас все запросы через конкатенацию сделаны... Можно пример, как правильно? Поговорю потом с датабазниками.

Весело у вас :D
Вот примеры от авторов :)
...
Рейтинг: 0 / 0
11.09.2014, 12:34
    #38744047
scf
scf
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Sql инъекции
Alexey Tomin,

А чем это в принципе может быть быстрее? Это даже не prepared statement, это при каждом вызове ХП компиляцию делать надо... При том, что обычные ХП компилируются в C.
...
Рейтинг: 0 / 0
11.09.2014, 13:09
    #38744109
Елдос
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Sql инъекции
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
public class Sessions extends Template {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        super.doGet(req, resp);
    }
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        super.doPost(request, response);
    }

    @Override
    protected void run(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
        try {
            template = "sessions.xsl";
            ActionTime actionTime = ActionTime.getInstance();
            Element source = pageXml.getRootElement().addElement("source");
            Element result = pageXml.getRootElement().addElement("result");

            String limit = request.getParameter("limit");
            String from_day = request.getParameter("From_day");



            if (Helper.isNull(limit)) limit = "100";
            else if (Helper.isInteger(limit)) {
                int x = Integer.parseInt(limit);
                if (x < 1) errorList.add("LAST: введенные значение не является числом.");
            } else errorList.add("LAST: введенные значение не является числом.");

            if (Helper.isNull(from_hour)) from_hour = actionTime.getHour();
            else if (Helper.isInteger(from_hour)) {
                int x = Integer.parseInt(from_hour);
                if (x < 0 || x > 23) errorList.add("FROM_HOUR: введенные значение больше 23 или меньше 0.");
                else from_hour = Helper.fillZero(2, from_hour);
            } else errorList.add("FROM_HOUR: введенные значение не является числом.");


            Element from = source.addElement("from");
            from.addAttribute("day", from_day);
            from.addAttribute("month", from_month);


            String ip = request.getParameter("ipaddress");
            String card1 = request.getParameter("card1");
            String card2 = request.getParameter("card2");


            source.addAttribute("limit", limit);
            source.addAttribute("ipaddress", ip);
            source.addAttribute("card1", card1);

            String from_date = from_year + "-" + from_month + "-" + from_day + " " + from_hour + ":00:00";
            String to_date = to_year + "-" + to_month + "-" + to_day + " " + to_hour + ":59:59";

            String sql = "SELECT sess.*, trans.ABONENT_ID, trans.TIMES, trans.MOD, merch.MERCHANTNAME, bin.BANK " +
                    "FROM (( TSESSIONS sess LEFT JOIN TBIN bin ON sess.BIN = bin.BIN ) " +
                    "LEFT JOIN TMERCHANTS merch ON sess.MERCHANTID = merch.MERCHANTID ) " +
                    "LEFT JOIN TTRANSACTIONS trans ON sess.RNN = trans.REFERENCE " +
                    "WHERE sess.ENTERDATE >= to_date('" + from_date + "', 'yyyy-mm-dd hh24:mi:ss') " +
                    "AND sess.ENTERDATE <= to_date('" + to_date + "', 'yyyy-mm-dd hh24:mi:ss')";

            if (ip != null && !ip.equals("")) {
                if (Helper.isIP(ip)) sql += " AND sess.PAYERIP = '" + ip + "'";
                else errorList.add("IPADDRESS: введенные значение не является IP адресом.");
            }
  

            sql += " AND ROWNUM <= " + limit + " AND sess.SECUR!='HB' AND sess.MERCHANTID != '96454601' AND sess.MERCHANTID != '96454602'" +
                    " AND  sess.MERCHANTID != '96454603' AND sess.MERCHANTID != '96454604' AND sess.MERCHANTID != '96454605'" +
                    " ORDER BY sess.ENTERDATE DESC";

            if (errorList != null && errorList.size() == 0) {
                rs = stmt.executeQuery(sql);
                while (rs.next()) {
                    Element item = result.addElement("item");

                    item.addAttribute("ssr", Helper.replaceNull(rs.getString("CHOICE")).replaceAll("-", " "));
                    item.addAttribute("baner", Helper.replaceNull(rs.getString("BANER")));
                    item.addAttribute("alert", Helper.replaceNull(rs.getString("ALERT")));
                    item.addAttribute("server", rs.getString("SERVER") + " " + Helper.replaceNull(rs.getString("MOD")));

                    String transtype = "";
                    if (rs.getInt("TRANSTYPE") == 7) transtype = " conf";
                    int process = rs.getInt("PROCESS");
                    String strProcess = "";
                    switch (process) {
                        case 0:
                            strProcess = "no action";
                            break;
                        case 1:
                            strProcess = "err no 3D";
                            break;

                    }

                    String rc = Helper.replaceNull(rs.getString("RESULTCODE"));
                    String resultCode = (rc.length() > 1) ? "(" + rc + ")" : rc;
                    item.addAttribute("process", strProcess + resultCode);

                    if (process == 3 || process == 5 || process == 7 || process == 9)
                        item.addAttribute("clientpays", rs.getString("TIMES"));
                    else item.addAttribute("clientpays", "");

                        item.addAttribute("bgcolor", "#FB4848");
                    item.addAttribute("secure", secure + " " + bank);
                }
            }
        } catch (SQLException sqle) {
            out.println("SQLException (Session): " + sqle + "<br/>");
        }
    }
}



Вот код рабочий, многие переменные удалены, так как не вмещалось.
есть ли здесь хоть какая то уязвимость
...
Рейтинг: 0 / 0
11.09.2014, 13:28
    #38744137
ivanra
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Sql инъекции
Извините, конечно, но эта картинка должна быть тут
...
Рейтинг: 0 / 0
11.09.2014, 13:46
    #38744160
Елдос
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Sql инъекции
ivanra,

я не понял о чем вы
...
Рейтинг: 0 / 0
11.09.2014, 13:46
    #38744164
HoBTID
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Sql инъекции
Елдос,
Ну и говнокод у Вас!

Проверьте на рабочей базе, что будет, если в параметре to_hour придет вот такая строка:

Код: plsql
1.
"23:59:59', 'yyyy-mm-dd hh24:mi:ss'); DROP TABLE TSESSIONS; -- Comment to the end of the line"
...
Рейтинг: 0 / 0
11.09.2014, 13:53
    #38744185
scf
scf
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Sql инъекции
Елдос,

Воистину говнокод, даже если не говорить про уязвимости.
...
Рейтинг: 0 / 0
11.09.2014, 14:01
    #38744205
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Sql инъекции
Елдосivanra,
я не понял о чем вы
SQL Injection на SQL Injection-е сидит и SQL Injection-ом погоняет. Так понятно?
...
Рейтинг: 0 / 0
11.09.2014, 14:24
    #38744243
Alexey Tomin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Sql инъекции
scfAlexey Tomin,

А чем это в принципе может быть быстрее? Это даже не prepared statement, это при каждом вызове ХП компиляцию делать надо... При том, что обычные ХП компилируются в C.

У оракла есть кэш, где хранятся все запросы. Если используются bind, то каждый последующий запрос находится в кэше- уже готовый к исполнению.
Если нет- не находится и, более того, выносит оттуда все остальные "приличные" запросы (кэш общий на instance, если не путаю).
...
Рейтинг: 0 / 0
11.09.2014, 14:37
    #38744263
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Sql инъекции
Alexey TominУ оракла есть кэш, где хранятся все запросы. Если используются bind, то каждый последующий запрос находится в кэше- уже готовый к исполнению.
Если нет- не находится и, более того, выносит оттуда все остальные "приличные" запросы (кэш общий на instance, если не путаю).
По-моему там есть некоторые оптимизации, которые умеют выделять параметры запроса, даже если они заинлайнены в SQL. Но, конечно, полагаться на эти фичи, не зная о них и не понимая того как они работают бессмысленно.
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Sql инъекции / 25 сообщений из 46, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]