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

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

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

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
Sql инъекции
    #38743198
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ваш классик коннкешена скорее всего не иметт никакого отношения к инъекции, вам же говорят, что дело в запросах выполняюшихся через этот коннекшен, ищите там откуда они приходят, ну если это конечно не шелл
...
Рейтинг: 0 / 0
Sql инъекции
    #38743301
lleming
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЕлдосПри сканировании сети на сайте в котором я являюсь администратором обнаружили sql уязвимость.
где искать уязвимость, есть отдельный класс который использует combopooleddatasource для соединения.
возможно ли через этот пул провести инъекцию.
нужно ли ставить какие то дополнительную защиты вроде фильтрации имени пользователя и пароля и других данных.

а url по которому уязвимость проявилась инструмент не показал ?
...
Рейтинг: 0 / 0
Sql инъекции
    #38743311
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Елдосгде искать уязвимость
- проверить не развод ли это. Закомментировать все вызовы и дать им 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
Sql инъекции
    #38743390
Сергей Арсеньев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Sql инъекции
    #38743450
DDiver
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сергей Арсеньев,

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

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

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

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

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

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

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

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

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

А чем это в принципе может быть быстрее? Это даже не prepared statement, это при каждом вызове ХП компиляцию делать надо... При том, что обычные ХП компилируются в C.
...
Рейтинг: 0 / 0
Sql инъекции
    #38744109
Елдос
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: 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
Sql инъекции
    #38744137
ivanra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Извините, конечно, но эта картинка должна быть тут
...
Рейтинг: 0 / 0
Sql инъекции
    #38744160
Елдос
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ivanra,

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

Проверьте на рабочей базе, что будет, если в параметре 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
Sql инъекции
    #38744185
scf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Елдос,

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

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

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


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