SQL Injection
SQL Injection
Agenda
HTTP
request:
https://www.deliver-me-pizza.com/show_orders?month=10
Normal
SQL
Query
https://www.deliver-me-pizza.com/show_orders?month=0%20OR%201%3D1
WHERE condition is
always true!
OR
precedes AND
Type 1 Attack:
Gains access to
other users
private data!
All User Data
Compromised
Attacker is able to
Combine
2 queries
1st query: empty
table (where fails)
2nd query: credit
card #s of all users
Then DB executes
Type
2 Attack:
Removes creditcards
from schema!
Future orders fail: DoS!
month=0;
DROP TABLE creditcards;
SELECT pizza, toppings,
quantity, order_day
FROM orders
WHERE userid=4123
AND order_month=0;
DROP TABLE creditcards;
Problematic Statements:
Modifiers: INSERT INTO admin_users VALUES ('hacker',...)
Administrative: shut down DB, control OS
sql_query =
"SELECT pizza, toppings, quantity, order_day " +
"FROM orders " +
"WHERE userid=" + session.getCurrentUserId() + " " +
"AND topping LIKE '%" + request.getParamenter("topping") + "%' ";
empty table
-- comments out end
Credit card info dropped
Source: http://xkcd.com/327/
8.2. Solutions
Mitigate Impact
8.2.3. Escaping
escape(o'connor)
= o''connor
8.2.4. Second-Order
SQL Injection (1)
Username
Query
8.2.4. Second-Order
SQL Injection (2)
control
Bind Variable:
Data Placeholder
Do
Ex:
Vulnerable use:
$db->exec("change_password '"+$uname+"','"+new_passwd+"'");
line of defense
w/o key, attacker cant read sensitive info
Summary