数据库
首页 > 数据库> > 网络应用层安全之SQL注入

网络应用层安全之SQL注入

作者:互联网

网络应用层安全之SQL注入

在这里插入图片描述

注入攻击,就是数据与代码没有分离产生的结果,计算机或服务器把用户输入的数据当做代码执行,其中有两个关键条件:①用户能够控制输入,②代码进行了拼接。

SQL注入是发生在 Web 程序中数据库层的安全漏洞,是网站最常见最简单的漏洞。网站考虑地再详细也会被黑客们抓到漏洞和破绽,SQL注入利用程序对输入数据不会判断和处理进行恶意攻击,使用具有特定意义的SQL 语句执行非法操作。

简言之,SQL 注入就是在用户输入的字符串中加入 SQL 语句,如果程序没有对输入进行处理,那么这些注入进去的 SQL 语句就会被数据库服务器误认为是正常的 SQL 语句而运行,攻击者就可以执行计划外的命令或访问未被授权的数据。

原理

1. 通过服务器返回的错误信息给黑客提供攻击信息

如果网站web服务器开启了错误回显,则会给攻击者提供方便。攻击者在输入中输入不合理的字符,通过返回的错误信息,攻击者可以知道服务器使用的哪种数据库,查询的语句等等信息,有助于构造能攻击该网站的注入攻击语句。

因此在后续的预防中会提到“不要给用户返回错误信息”,但是即使服务器关闭了这个错误回显,攻击者也可以通过“盲注”的方式,即构造简单的条件语句,根据页面是否发生变化来判断注入的SQL语句是否执行。

2. 与原本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 表中的所有数据。

3. 利用插入注释执行非法命令

复习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'

可以让黑客进入系统

4. 添加额外条件

在 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

标签:语句,...,网络应用,数据库,user,SQL,id,注入
来源: https://blog.csdn.net/Limonor/article/details/116403275