SQL注入攻击
SQL注入攻击(SQL injection attack)是攻击者把SQL语句插入到应用程序的输入数据中,或web表单的输入域,总之就是欺骗服务器执行恶意SQL语句。
SQL注入攻击是黑客对数据库进行攻击的常用手段之一。一次成功的SQL注入,允许你读取数据库中的敏感数据、修改数据库、执行数据库的管理员操作等。
SQL注入是数据库驱动型网站所面临的普遍问题,SQL注入漏洞常见于PHP和ASP应用:
- 输入不信任的数据
- SQL语句是动态构建的
示例1
假设有一个SQL查询:
SELECT id, name, nickname FROM users
如果有人提供如下信息:
name:evil'man
nickname:test
查询语句应为:
SELECT id, name, nickname FROM users WHERE name = 'evil'man' AND nickname = test
执行时会报错:
Incorrect syntax near il' as the database tried to execute evil.
在构建SQL语句要小心,下面是安全的Java代码:
String name = req.getParameter('name');
String nickname = req.getParameter('nickname');
String sqlQuery = "SELECT id, name, nickname FROM users WHERE name = ? AND nickname = ?";
PreparedStatement pstmt = connection.prepareStatement(sqlQuery);
pstmt.setString(1, name);
pstmt.setString(2, nickname);
示例2
下面是一段C#代码,它动态构造一个SQL查询语句:
string username = ...
string item = ...
string sqlQuery = "SELECT * FROM items WHERE username = "'" + username + "' AND itemname = '" + item + "'";
想要执行的查询语句如下:
SELECT * FROM items
WHERE username =
AND itemname =
上面的语句只有在itemname中没有单引号时正确。如果在查询语句后添加OR 1=1
,where限制条件将失效:
SELECT * FROM items
WHERE username = 'usr'
AND itemname = 'item' OR 1=1
等同于:
SELECT * FROM items
这允许攻击者查询到权限外的数据。
sqlmap是利用这种攻击的一个自动化工具:使用sqlmap执行SQL注入攻击
防止SQL注入攻击的方法:
- 对输入的数据进行检验,可以使用白名单/黑名单
- 使用存储过程
Written on April 13, 2016