PL/SQL中的SQL注入 - 神话还是事实?

Gic*_*ico 4 sql plsql code-injection

我试图破解我的PL/SQL代码.我们创建了打开并获取游标的PL/SQL过程.根据我们的标准,我们创建了一个动态SQL语句,但我们无法注入OR 1 = 1条件.

我做了一个http://sqlfiddle.com/#!4/a62a3/5演示,你可以尝试注入代码.

CREATE FUNCTION get_documents (p_document_id IN DOCUMENTS.DOCUMENT_ID%TYPE)
    RETURN SYS_REFCURSOR
AS
    p_rs SYS_REFCURSOR;
BEGIN
    DBMS_OUTPUT.PUT_LINE('------ INPUT VALUES ------');
    DBMS_OUTPUT.PUT_LINE('p_document_id: ' || p_document_id);

    OPEN p_rs FOR 
        SELECT DOCUMENT_ID, '(' || MY_FIELD || ')' FROM DOCUMENTS WHERE DOCUMENT_ID = '' ||  p_document_id  || '';
    RETURN p_rs;
END;
Run Code Online (Sandbox Code Playgroud)

我们尝试在p_document_id参数中注入代码.我们将其设置为:

 document_refcur_local:=get_documents('10'' OR 1=1; -- ');
Run Code Online (Sandbox Code Playgroud)

但我们无法选择所有记录.能不能让我知道我做错了什么?

Mil*_*ney 5

这实际上不是动态声明,因此不容易注入.

如果你从前端使用SQL查询之外的p_document_id的字符串连接构建此字符串 - 然后将其发送到SQL,它将是易受攻击的,但是你不能在SQL查询本身中进行注入(除非构建一个字符串然后运行它,即一个你不做的动态查询

易受注入影响的动态查询看起来更像;

EXECUTE IMMEDIATE 'SELECT * FROM DOCUMENTS WHERE DOCUMENT_ID = ''' + someUserInput + ''''
Run Code Online (Sandbox Code Playgroud)

你可以通过传递someUserInput来注入

' OR 1=1; --
Run Code Online (Sandbox Code Playgroud)