关注这个漏洞的其他相关笔记:SQL 注入漏洞 - 学习手册-CSDN博客
0x01:SQL 注入漏洞介绍
SQL 注入就是指 Web 应用程序对用户输入数据的合法性没有判断,前端传入后端的参数是可控的,并且参数会带入到数据库中执行,导致攻击者可以通过构造不同的 SQL 语句来实现对数据库进行任意操作的一种攻击方式。
0x0101:SQL 注入漏洞演示
实验工具准备
PHP 运行环境:phpstudy_x64_8.1.1.3.zip(Apache2.4.39 + PHP 5.6.9nts)
实验环境:PIKACHU 靶场 - 字符型注入(get) => 参考:PIKACHU - 靶场笔记合集
本次的实验环境,我们采用现成的 PIKACHU 靶场,PIKACHU 靶场的安装方法参考上面提供的链接,这里就不多说了,下面直接开始演示。
输入下面的链接,访问实验环境:
http://localhost/pikachu/vul/sqli/sqli_str.php
靶场要求我们输入 username,该值是一个字符串类型的值,我们可以随便输入一些内容,进行测试:
此时我们推测一下这个业务的查询逻辑,笔者以伪代码的形式表示出来了:
// 获取用户输入的 name$username = $_GET['name'];// 将用户输入的 name 拼接进预定义的 SQL 语句中$sql = "select * from username where name='$username'";// 将 $sql 中的内容传递到后端数据库执行,并获取结果$result = exec_sql($db_connect, $sql);// 如果查询到结果,则返回 “欢迎”,否则返回 “您输入的用户不存在”if ($result == True) {// 成功查询到用户信息echo "欢迎你" . $username;} else {echo "您输入的用户不存在";}
在上面假设的业务逻辑中,代码未对用户传递的数据做任何的过滤就直接拼接到了 SQL 语句中,并传递给了后端,因此会造成 SQL 注入漏洞:
测试 Payload: ' or 1=1 #'后端实际执行的的 Payload: select * from username where name='' or 1=1 #''
如上,我们通过传入 SQL 语句,尝试与服务器后端的查询语句拼接,成功让服务端返回了数据库中的所有内容。
除了让服务端直接爆出数据库内容,我们还可以尝试去读取目标数据库中更多的内容,甚至通过 MySQL 往目标服务器写入木马程序,进而控制整个服务器。当然,这都是后话,上面主要就是简单演示一下 SQL 注入的攻击思路和危害,更进一步的内容,笔者后面会出单期讲。
0x02:SQL 注入漏洞详解
0x0201:SQL 注入漏洞产生的条件
SQL 注入漏洞的产生需要满足以下两个条件:
-
参数用户可控: 前端传给后端的参数内容是用户可以控制的。
-
参数带入数据库执行: 传入的参数拼接到 SQL 语句中,且被带入数据库进行执行。
0x0202:SQL 注入通常出现的位置
一般的 Web 应用程序都是由 “视图层 + 业务逻辑层 + 数据访问层” 构成的,如下图所示:
我们以一个简单的登录操作,讲解一下上图的流程:
用户通过浏览器访问京东的首页,进入了登录页面。用户在视图层,输入了自己的账号和密码,浏览器将用户输入的账号密码通过某种方式传递到服务器的业务逻辑层,然后业务逻辑层将拿到的账号密码到数据库中进行匹配,如果匹配成功,则返回登录后的界面,否则返回登录失败的提示。
SQL 注入发生的位置,其实就是执行 SQL 语句的位置。在上面的流程中,就是业务逻辑层将拿到的账号和密码到数据库中进行匹配的地方(如果用户输入正常的账号信息,则无问题,但是如果用户传递过来的是 SQL 语句呢?)。
总的来说,所有可能与后端数据库发生交互的地方,都有可能出现 SQL 注入漏洞。
0x0203:SQL 注入漏洞产生的危害
-
未经授权的数据访问:攻击者可以利用 SQL 注入漏洞,无需授权即可访问数据库中的数据,从而窃取用户数据,如用户凭证、个人信息或业务数据,导致用户信息泄露。
-
数据篡改:攻击者可以修改数据库中的数据,导致数据的完整性受损。这可能导致数据不一致,对业务流程和决策产生负面影响。
-
数据库被恶意操作:攻击者可以对数据库进行增加或删除操作,例如删除数据库中重要数据的表,或篡改数据库的系统管理员账户。
-
. 服务器被远程控制:攻击者可能获取服务器的最高权限,远程控制服务器,安装后门,从而修改或控制操作系统。此外,他们还可能破坏硬盘数据,导致整个系统瘫痪。
-
网站被挂马,传播恶意软件:攻击者可以修改数据库中的一些字段值,嵌入网马链接,进行挂马攻击,或者用来传播恶意软件。
-
影响业务运营:SQL 注入攻击可能导致业务中断,降低用户信任度,损害品牌声誉,甚至带来法律责任。
0x0204:SQL 注入漏洞的防范措施
-
使用参数化查询或预编译语句,而不是直接拼接 SQL 语句。
-
对用户输入进行严格的验证和过滤,防止恶意输入。
-
使用最小权限原则,为数据库账户分配必要的权限。
-
定期更新和修补数据库管理系统和应用程序的漏洞。
-
使用 Web 应用防火墙(WAF)等安全设备,增强对 SQL 注入攻击的防御能力。
0x03:参考资料
-
《Web 安全攻防:渗透测试实战指南》 ISBN 978-7-121-34283-7