оракул апекс запрос sql инъекция - PullRequest
0 голосов
/ 26 апреля 2018

Я проверил свой SQL-запрос, который уязвим для SQL-инъекций.V_NAME обнаружен SQL инъекций.как я могу защитить свой запрос?

это мой запрос:

FUNCTION  "GET_SEQUENCE" (P_BID VARCHAR2, P_PSC VARCHAR2) RETURN NUMBER AS
TYPE T_HASIL IS TABLE OF NUMBER;
V_HASIL T_HASIL;
V_NAME VARCHAR2(30);
V_SQL LONG;
BEGIN
SELECT KEYSEQ INTO V_NAME
FROM MST_SEQUENCE_DETAIL Tbl
WHERE BRANCHCODE=P_BID AND KEYCODE=P_PSC
AND YEAR = TO_CHAR(SYSDATE,'RRRR');

V_SQL := 'SELECT ' || V_NAME || '.NEXTVAL FROM DUAL';
EXECUTE IMMEDIATE V_SQL BULK COLLECT INTO V_HASIL;

RETURN V_HASIL(1);
END;

спасибо.

Ответы [ 2 ]

0 голосов
/ 26 апреля 2018

Ваша функция уязвима для SQL-инъекций.

Подумайте, выполняет ли кто-нибудь эту вставку:

INSERT INTO MST_SEQUENCE_DETAIL (
  BRANCHCODE,
  KEYCODE,
  YEAR,
  KEYSEQ
) VALUES (
  1,
  1,
  TO_CHAR( SYSDATE, 'RRRR' ),
  '(SELECT psswd FROM usr),keyseq'
);

Затем вызов вашей функции:

GET_SEQUENCE( 1, 1 );

Устанавливаетзапрос к:

V_SQL := 'SELECT (SELECT psswd FROM usr),keyseq.NEXTVAL FROM DUAL';

Следующий оператор:

EXECUTE IMMEDIATE V_SQL BULK COLLECT INTO V_HASIL;

Не удастся, но как не удастся сказать, может ли:

  • Есть таблица usr;если нет, тогда вы получите исключение ( SQLFiddle ):

    ORA-00942: table or view does not exist ORA-06512: at "USER_4_C4D95A.GET_SEQUENCE", line 18
    
  • У него есть столбец с именем psswd;если нет, вы получите исключение ( SQLFiddle )

    ORA-00904: "PSSWD": invalid identifier ORA-06512: at "USER_4_9B4C87.GET_SEQUENCE", line 18
    

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

0 голосов
/ 26 апреля 2018
V_SQL := 'SELECT ' || V_NAME || '.NEXTVAL FROM DUAL';
EXECUTE IMMEDIATE V_SQL BULK COLLECT INTO V_HASIL;

Проблема здесь заключается в том, что V_NAME теоретически может быть любым кодом SQL и, следовательно, уязвимостью для внедрения.Чтобы защитить это, используйте dbms_assert.simple_sql_name, так как вы ожидаете, что эта переменная будет простым идентификатором:

V_SQL := 'SELECT ' || sys.dbms_assert.simple_sql_name(V_NAME) || '.NEXTVAL FROM DUAL';
EXECUTE IMMEDIATE V_SQL BULK COLLECT INTO V_HASIL;
...