什么是sql注入
原理:
产生SQL注入漏洞的根本原因在于代码中没有对用户的输入项进行验证和处理变直接拼接到查询语句中,利用SQL注入漏洞,攻击者可以在应用中的查询语句中插入自己的SQL代码并传递给后台SQL服务器时加以解析并执行
-
可以使用一组针对应用程序中每个入口点的系统测试来手动检测 SQL 注入。
-
单引号字符,并查找错误或其他异常。
'
-
一些特定于 SQL 的语法,用于计算入口点的基本(原始)值和其他值,并查找应用程序响应中的系统差异。
-
布尔条件(如 和 ),并查找应用程序响应中的差异。
OR 1=1
,OR 1=2
-
有效负载设计用于在 SQL 查询中执行时触发时间延迟,并查找响应所需时间的差异。
-
OAST 有效负载,用于在 SQL 查询中执行时触发带外网络交互,并监视任何生成的交互。
或者可以使用 Burp Scanner 快速可靠地找到大多数 SQL 注入漏洞。
检索隐藏数据
想象一下,一个显示不同类别产品的购物应用程序。当用户单击购物”类别时,其浏览器会请求 URL:
https://insecure-website.com/products?category=Gifts
这会导致应用程序进行 SQL 查询,以从数据库中检索相关产品的详细信息:
SELECT * FROM products WHERE category = 'Gifts' AND released = 1
此 SQL 查询要求数据库返回:
- 所有细节 (
*
) - 从表格中
products
- 其中 是
category
,Gifts
- 并且是
released
,1
该限制用于隐藏未发布的产品。我们可以假设对于未发布的产品,.released = 1
,released = 0
应用程序未实现任何针对 SQL 注入攻击的防御措施。这意味着攻击者可以构建以下攻击,例如:
https://insecure-website.com/products?category=Gifts'--
这将导致 SQL 查询:
SELECT * FROM products WHERE category = 'Gifts'--' AND released = 1
至关重要的是注意:这是 SQL 中的注释指示符。这意味着查询的其余部分被解释为注释,从而有效地删除了它。此示例中,这意味着查询不再包含 .因此,将显示所有产品,包括尚未发布的产品。--
AND released = 1
您可以使用类似的攻击来使应用程序显示任何类别中的所有产品,包括他们不知道的类别:
https://insecure-website.com/products?category=Gifts'+OR+1=1--
这将导致 SQL 查询:
SELECT * FROM products WHERE category = 'Gifts' OR 1=1--' AND released = 1
修改后的查询将返回 为 或等于 的所有项目。与往常一样,查询将返回所有项。category Gifts 1 1 1=1
注意
将条件注入 SQL 查询时要小心。即使它在你注入的上下文中看起来是无害的,应用程序在多个不同的查询中使用来自单个请求的数据也是很常见的。
例如,条件达到 OR 语句,则可能导致数据意外丢失。
OR 1=1
,UPDATE
,DELETE
颠覆应用逻辑
想象一下,一个允许用户使用用户名和密码登录的应用程序。如果用户提交用户名和密码,则应用程序通过执行以下 SQL 查询来检查凭据:wiener``bluecheese
SELECT * FROM users WHERE username = 'wiener' AND password = 'bluecheese'
如果查询返回用户的详细信息,则登录成功。否则,它将被拒绝。
在这种情况下,攻击者可以以任何用户身份登录,而无需密码。他们可以使用 SQL 注释序列来执行此操作,以从查询子句中删除密码检查。例如,提交用户名和空白密码会导致以下查询:-- WHERE administrator'--
SELECT * FROM users WHERE username = 'administrator'--' AND password = ''
此查询返回其用户,并成功以该用户身份将攻击者登录。username``administrator
sql注入四种手法
- 联合查询
- 布尔盲注
- 延时注入
- 报错注入
SQL注入的危害
- 数据库信息泄露
- 网页被篡改
- 网站挂马,传播恶意软件
- 数据库被恶意操作
- 服务器被植入后门
- 破坏银盘或者服务器等硬件设备
绕过技术
- 关键字可以用
%
(只限IIS系列),如select
可以sel%e%ct
- 通杀的,内联注释如,
/*!select*/
- 编码,可以进行多次编码
multipart
请求绕过,在POST请求中添加一个上传文件可以绕过大多数的WAF- 参数绕过,复制参数,
id=1&id=1
- 组合法,如and可以用
&&
再URL编码 - 替换法,如:
and
改为&&;=
可以用like
或in
等
如何进行SQL防御
- 关闭应用的错误提示
- 加设备,如:
waf
- 对输入进行过滤,编写黑白名单
- 限制输入长度
- 限制数据库权限,如
drop/create/truncate
等权限谨慎grant - 避免采用拼接的方式构造SQL语句,可以采用预编译等技术(同时也称为参数化查询)
- 数据库信息加密安全,不采用MD5因为有彩虹表,一般是一次MD5后加盐值在MD5