SQL Injection Attack

SQL Injection

SQL Injection:

通过在网页的查询字符串(Web表单,输入域名,页面请求)中输入sql查询语句,从而欺骗服务器

漏洞原因:符号# 会被认为是注释(comment)

例如:

1. 查询时加入”#“
1
2
3
SELECT Name, Salary, SSN
FROM employee
WHERE eid = ' EID5002'#' ' and password = 'xyz'
2. 1=1

1=1: 总是正确的,输入:

1
"a ' OR  1=1 #"

会转换为:

1
2
3
SELECT Name, Salary, SSN
FROM employee、
WHERE eid = ' a ' OR 1=1

于是所有的查询结果都会显示

3. 使用cRUL攻击:
1
curl 'www.example.com/getdata.php?EID=a' OR 1=1 #&Password ='

但不会执行,因为data中特殊的符号会被编码,所以输入时需要编码特殊符号

4. 多个SQL语句:

可以通过分号;(semicolon)分开新的SQL语句

1
Input: a'; DROP DATABASE dbtest; #

根本原因:

代码与数据混合 (如XSS attack,system() 函数,format string attack)

预防措施:

  1. Filtering and encoding data

    • 在混合data和code之前,检查data,过滤所有的可能会被解释为code的字符
    • PHP中用real_escape_string
  2. Prepared statement

    • 最好的方法是分离code和data
    • 使用SQL statement模版。数据库分析,编译,都建立在sql模版的基础上,并且存储结果并不执行。之后,将输入的参数和预先编译好的模板连接。在不同的执行过程中,只有输入的数据是不一样的,代码部分是一样的。
    • 在sql查询语句中设定question mask,为了日后将data放入;当data输入后,将他们结合起来