注入攻击,就是数据与代码没有分离产生的结果,计算机或服务器把用户输入的数据当做代码执行,其中有两个关键条件:①用户能够控制输入,②代码进行了拼接。
SQL注入是发生在 Web 程序中数据库层的安全漏洞,是网站最常见最简单的漏洞。网站考虑地再详细也会被黑客们抓到漏洞和破绽,SQL注入利用程序对输入数据不会判断和处理进行恶意攻击,使用具有特定意义的SQL 语句执行非法操作。
简言之,SQL 注入就是在用户输入的字符串中加入 SQL 语句,如果程序没有对输入进行处理,那么这些注入进去的 SQL 语句就会被数据库服务器误认为是正常的 SQL 语句而运行,攻击者就可以执行计划外的命令或访问未被授权的数据。
如果网站web服务器开启了错误回显,则会给攻击者提供方便。攻击者在输入中输入不合理的字符,通过返回的错误信息,攻击者可以知道服务器使用的哪种数据库,查询的语句等等信息,有助于构造能攻击该网站的注入攻击语句。
因此在后续的预防中会提到“不要给用户返回错误信息”,但是即使服务器关闭了这个错误回显,攻击者也可以通过“盲注”的方式,即构造简单的条件语句,根据页面是否发生变化来判断注入的SQL语句是否执行。
复习SQL的增删改查
增
// 插入单行数据 select into ... values ... // 表添加到新表 select into ... select ... from ...
删
// 删除数据某些数据 delect from ... where ... // 删除整个表的数据 truncate table ...
改
update ... set .. where ...
例如,对一个接受输入数据的数据库语句:
SELECT * FROM users WHERE user_id = $user_id
如果传入参数为:1234; DELETE FROM users
那么传入的参数会与SQL语句合并,计算机理解为新的SQL语句
SELECT * FROM users WHERE user_id = 1234; DELETE FROM users
则会删除 users 表中的所有数据。
复习SQL的 or
使用 AND 来显示所有姓为 “Carter” 并且名为 “Thomas” 的人:
SELECT * FROM Persons WHERE FirstName='Thomas' AND LastName='Carter'
使用 OR 来显示所有姓为 “Carter” 或者名为 “Thomas” 的人:
SELECT * FROM Persons WHERE firstname='Thomas' OR lastname='Carter'
例如,对某个查询语句
SELECT COUNT(*) AS 'num' FROM game_score WHERE game_id=24411 AND version=$version
如果输入 version 包含了恶意的字符串'-1' OR 3 AND SLEEP(500)--
,那么最终查询语句会变为:
SELECT COUNT(*) AS 'num' FROM game_score WHERE game_id=24411 AND version='-1' OR 3 AND SLEEP(500)--
计算机检测到 SLEEP(500) 将导致 SQL 语句一直运行,恶意消耗性能资源
或者,查询语句为:
select * from users where nickname='{user_name}'
当输入user_name为(’ or 1='1)时,语句变为
select * from users where user_name='' or 1='1'
可以让黑客进入系统
在 SQL 语句中添加一些额外条件,以此来改变执行行为。条件一般为真值表达式。例如:
UPDATE users SET userpass='$userpass' WHERE user_id=$user_id;
如果 user_id 被传入恶意的字符串“1234 OR TRUE”,那么最终的 SQL 语句会变为:
UPDATE users SET userpass= '123456' WHERE user_id=1234 OR TRUE;
这将更改所有用户的密码。
“?”
字符加上参数名称而成。UPDATE myTable SET c1 = ?c1, c2 = ?c2, c3 = ?c3 WHERE c4 = ?c4