SQL注入攻击

       在 OWASP 项目年度 top 10 安全问题( https://owasp.org/www-project-top-ten/ )中,注入高居榜
首。 SQL 注入攻击指的是通过构建特殊的输入作为参数传入 Web 应用程序,而这些输入都是 SQL 语法里
的组合,通过执行 SQL 语句进而执行攻击者所要的操作,其主要原因是程序没有细致地过滤用户输入的
数据,致使非法数据侵入系统。
1 )对于 Web 应用程序而言,用户核心数据存储在数据库中,例如 MySQL SQL Server Oracle
等。
2 )通过 SQL 注入攻击,可以获取、修改、删除数据库信息,并且通过提权来控制 Web 服务器等其
他操作。
3 SQL 注入即攻击者通过构造特殊的 SQL 语句,入侵目标系统,致使后台数据库泄露数据的过
程。
4 )因为 SQL 注入漏洞造成的严重危害性,所以常年稳居 OWASP top10 的榜首。

1、项目实验环境

目标靶机: VM_1 OWASP_Broken_Web_Apps_VM_1.2
测试渗透机: Kali

2SQL注入危害

1 )拖库导致用户数据泄露。
2 )危害 Web 等应用的安全。
3 )失去操作系统的控制权。
4 )用户信息被非法买卖。
5 )危害企业及国家的安全。

3SQL基础回顾

3.1 登录OWASPmysql数据库系统

项目环境: OWASP
1 dvwa.users
2 wordpress.wp_users
3 mysql.user
语法: mysql -u 用户名 -p 密码
# mysql -uroot -p'owaspbwa'

3.2 查看数据库

show databases ;
……
附件:常用的 sql 函数
select database (); -- 返回当前数据库
select user (); -- 返回当前用户
select now(); -- 返回当前日期和时间

3.3 查看库中的表

use dvwa;
show tables ;

3.4 查看表结构

desc users; -- 查看 users 表的结构
-----------------------
show create table users; -- 查看 users 表的详细属性
show create table users \G -- \G 将查找到的内容结构旋转 90 度,变成纵向结构,方便阅读

3.5 查看表记录

select * from users;
select * from users \G -- \G 将查找到的内容结构旋转 90 度,变成纵向结构,方便阅读
select user_id,first_name,last_name from users; -- 查看指定字段的记录内容
select 查询语句使用案例:
// 简单查询示例
当前库 dvwa dvwa .users
mysql> select * from users;
mysql> select user_id,first_name,last_name from users;
其它库 mysql .user
mysql> desc mysql .user ;
mysql> select * from mysql .user ;
mysql> select user , password ,host from mysql .user ;
// 条件查询示例
mysql> select user , password ,host from mysql .user where user = 'root' ;
mysql> select user , password ,host from mysql .user where user = 'root' and
host= 'localhost' ;
mysql> select user , password ,host from mysql .user where user = 'root' or
host= 'localhost' ;

3.6 information_schema

information_schema 看作是一个数据库( schema ,本意 架构 ,在此可以理解为字典),确切说
是数据库信息字典数据库。 其中保存着关于 MySQL 服务器所维护的所有其他数据库的信息。 如数据库
名、数据库的表、表栏的数据类型与访问权限等。
information_schema # 数据库信息字典(库)
===== 查询数据库库名、表名 information_schema .tables =====
mysql> select * from information_schema .TABLES\G
mysql> select DISTINCT TABLE_SCHEMA from information_schema .TABLES ; // 等价于
show databases ;
mysql> select TABLE_SCHEMA, TABLE_NAME from information_schema .TABLES\G
mysql> select TABLE_SCHEMA, GROUP_CONCAT ( TABLE_NAME ) from
information_schema .TABLES GROUP BY TABLE_SCHEMA \G
mysql> select TABLE_NAME from information_schema .TABLES where
TABLE_SCHEMA= 'dvwa' ; // 等价于 show tables ;
 
===== 查询数据库库名、表名、字段名 information_schema .columns =====
mysql> select * from information_schema .columns\G
mysql> select column_name from information_schema .columns ;
mysql> select column_name from information_schema .columns where
table_schema= 'dvwa' and table_name = 'users' ;
mysql> select column_name from information_schema .columns where
table_name = 'USER_PRIVILEGES' ;
mysql> select column_name from information_schema .columns where
table_name = 'SCHEMA_PRIVILEGES' ;

3.7 MySQL常用函数与运算符

4SQL注入流程

关系型数据库系统,具有明显的 列(字段) 内容 的结构层次,因此通过 SQL 注入漏洞获
取数据库中信息,可以依据这样的顺序。获取数据库名 表名 列名(字段名) 数据。
1 )判断是否有 SQL 注入漏洞;
2 )判断操作系统、数据库和 web 应用的类型;
3 )获取数据库信息,包括管理员信息及拖库;
4 )加密信息破解, sqlmap 自动破解;
5 )提权,获得 sql-shell os-shell 、登录应用后台

5、手动注入实战

5.1 基于错误的注入

# 错误注入的思路是通过构造特殊的 sql 语句,根据得到的错误信息,确认 sql 注入点;
# 通过数据库报错信息,也可以探测到数据库的类型和其他有用信息;
# 通过输入单撇号,触发数据库异常,通过异常日志诊断数据库类型,例如这里是 MySQL 数据库。

5.2 基于布尔的注入

# 布尔逻辑注入的思路是闭合 SQL 语句、构造 or and 逻辑语句,注释多余的代码。

5.3 基于union注入

5.4 基于时间的盲注

# 有些数据库对错误信息做了安全配置,使得无法通过以上方式探测到注入点,此时可通过设置 sleep 语句探
测注入点。
SQL 注入语句解析:
select first_name,last_name from dvwa .users where user_id= '1' and sleep( 5 ) -- ' ;

6. sqlmap自动化注入

sqlmap 是一个国内外著名的安全测试工具,可以用来进行自动化检测,利用 SQL 注入漏洞,获取数
据库服务器的权限。

7 sql注入概述

7.1 什么是SQL注入

SQL 是操作数据库数据的结构化查询语言,网页的应用数据和后台数据库中的数据进行交互时会采
SQL 。而 SQL 注入 是将 Web 页面的原 URL 、表单域或数据包输入的参数,修改拼接成 SQL 语句,传递给
Web 服务器,进而传给数据库服务器以执行数据库命令。如 Web 应用程序的开发人员对用户所输入的数
据或 cookie 等内容不进行过滤或验证 ( 即存在注入点 ) 就直接传输给数据库,就可能导致拼接的 SQL 被执
行,获取对数据库的信息以及提权,发生 SQL 注入攻击。

7.2 SQL注入过程

1步:SQL注入点探测。

探测 SQL 注入点是关键的一步,通过适当的分析应用程序,可以判断什么地方存在 SQL 注入点。通
常只要带有输入提交的动态网页,并且动态网页访问数据库,就可能存在 SQL 注入漏洞。如果程序员信
息安全意识不强,采用动态构造 SQL 语句访问数据库,并且对用户的输入未进行有效性验证,则存在
SQL 注入漏洞的可能性很大。一般通过页面的报错信息来确定是否存在 SQL 注入漏洞。

2步:收集后台数据库信息。

不同数据库的注入方法、函数都不尽相同,因此在注入之前,我们先要判断一下数据库的类型。判
断数据库类型的方法很多,可以输入特殊字符,如单引号,让程序返回错误信息,我们根据错误信息提
示进行判断;还可以使用特定函数来判断,比如输入 “1 and version () >0” ,程序返回正常,说明
version ()函数被数据库识别并执行,而 version ()函数是 MySQL 特有的函数,因此可以推断后台数
据库为 MySQL

3步:猜解用户名和密码。

数据库中的表和字段命名一般都是有规律的。通过构造特殊 SQL 语句在数据库中依次猜解出表名、
字段名、字段数、用户名和密码。

4步:查找Web后台管理入口。

WEB 后台管理通常不对普通用户开放,要找到后台管理的登录网址,可以利用 Web 目录扫描工具
(如: wwwscan AWVS )快速搜索到可能的登录地址,然后逐一尝试,便可以找到后台管理平台的登
录网址。

5步:入侵和破坏。

一般后台管理具有较高权限和较多的功能,使用前面已破译的用户名、密码成功登录后台管理平台
后,就可以任意进行破坏,比如上传木马、篡改网页、修改和窃取信息等,还可以进一步提权,入侵
Web 服务器和数据库服务器。

7.3 SQL注入方式

由于编写程序时未对用户输入数据的合理性进行判断,导致攻击者能在 SQL Injection 的注入点中夹
杂代码进行执行,并通过页面返回的提示,获取进行下一步攻击所需的信息。根据输入的参数,可将
SQL 注入方式大致分为两类:数字型注入、字符型注入。

1、数字型注入

当输入的参数为整型时,如 ID 、年龄、页码等,如果存在注入漏洞,则可以认为是数字型注入。这
种数字型注入最多出现在 ASP PHP 等弱类型语言中,弱类型语言会自动推导变量类型,例如,参数 id=8 PHP 会自动推导变量 id 的数据类型为 int 类型,那么 id=8 and 1=1 ,则会推导为 string 类型,这是
弱类型语言的特性。而对于 Java C# 这类强类型语言,如果试图把一个字符串转换为 int 类型,则会抛出
异常,无法继续执行。所以,强类型的语言很少存在数字型注入漏洞。

2、字符型注入

当输入参数为字符串时,称为字符型。数字型与字符型注入最大的区别在于:数字型不需要单引号
闭合,而字符串类型一般要使用单引号来闭合。

7.4 SQL注入攻击手法

1、基于布尔的盲注

因为 web 的页面返回值都是 True 或者 False ,所以布尔盲注就是注入后根据页面返回值来得到数据库
信息的一种办法。

2、基于时间的盲注

当布尔型注入没有结果(页面显示正常)的时候,我们很难判断注入的代码是否被执行,也可以说
到底这个注入点存不存在?这个时候布尔型注入就无法发挥自己的作用了。基于时间的盲注便应运而
生,所谓基于时间的盲注,就是我们根据 web 页面相应的时间差来判断该页面是否存在 SQL 注入点。

3、联合查询注入

使用联合查询进行注入的前提是我们要进行注入的页面必须有显示位。所谓联合查询注入即是使用
union 合并两个或多个 SELECT 语句的结果集,所以两个及以上的 select 必须有相同列、且各列的数据类
型也都相同。联合查询注入可在链接最后添加 order by 9 基于随意数字的注入,根据页面的返回结果来
判断站点中的字段数目。

4、基于错误信息的注入

此方法是在页面没有显示位,但是 echo mysql_error(); 函数输出了错误信息的时候方能使用。优点
是注入速度快,缺点是语句较为复杂,而且只能用 limit 依次进行猜解。总体来说,报错注入其实是一种
公式化的注入方法,主要用于在页面中没有显示位,但是用 echo mysql_error(); 输出了错误信息时使
用。

8 实验环境

9 实验心得

SQL注入实验总结‌‌

SQL注入是一种常见的安全漏洞,通过将恶意代码插入到应用程序的SQL查询中,攻击者可以对数据库进行非法访问和操作。‌在进行SQL注入实验的过程中,我学到了许多关于SQL注入的原理、检测和利用方法,以及防御措施。

SQL注入的原理

SQL注入的发生是因为应用程序没有对用户输入的数据进行充分验证和过滤。当用户输入的数据被直接拼接到SQL查询中时,攻击者可以利用这个漏洞注入恶意代码,执行未授权的操作。

SQL注入的检测和利用方法

在实验中,我使用了一些常用的技术和工具来检测和利用SQL注入漏洞。例如,通过手工注入、使用单引号、分析错误信息等方法,可以发现应用程序中的SQL注入漏洞,并尝试利用这些漏洞获取敏感信息或修改数据库数据。此外,通过SQLmap等工具也可以有效地检测和利用SQL注入漏洞。

SQL注入的防御措施

为了防止SQL注入攻击,实验中我发现了一些常见的防御措施,如使用参数化查询、输入验证和过滤、最小权限原则等。这些措施可以有效地防止SQL注入攻击,增加应用程序的安全性。

SQL注入的常见攻击场景

登录页面、搜索功能、用户注册等都是攻击者经常利用的入口点。通过对这些场景进行实验,我更好地理解了SQL注入攻击的实际应用场景,并且能够更好地保护应用程序的安全。

通过这次实验,我不仅掌握了SQL注入的基本原理和检测利用方法,还了解了如何在实际开发中避免这类漏洞的出现。这些知识和经验对我未来的工作和学习有着重要的指导意义。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wd200426

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值