百度360必应搜狗淘宝本站头条
当前位置:网站首页 > IT技术 > 正文

SQL注入的原理和危害

wptr33 2025-02-15 01:25 15 浏览

什么是SQL注入

SQL注入是发生在web端的安全漏洞,实现非法操作,欺骗服务器执行非法查询,他的危害有会恶意获取,甚至篡改数据库信息,绕过登录验证,原理是针对程序员编写时的疏忽,通过执行SQL语句,实现目的性攻击,他的流程可以分为判断注入类型,判断字段数,判断显示位,获取数据库中的信息

SQL注入的原理

SQL注入就是通过web表单吧SQL命令提交到web应用程序,由于程序没有细致的过滤用户输入的数据,造成字符串拼接,进而恶意的SQL语句被执行,造成数据库信息泄露,网页篡改,数据库被恶意操作等

SQL注入的分类

从注入参数类型分:数字型注入、字符型注入、搜索型注入

从注入方法分:基于报错、基于布尔盲注、基于时间盲注、联合查询、堆叠注入、内联查询注入、宽字节注入

从提交方式分:GET注入、POST注入、COOKIE注入、HTTP头注入

SQL注入漏洞的利用思路

第一步先找可能存在漏洞的站点,也就是目标站点

第二步通过目标站点的后缀名来判断网站使用的是哪一种数据库,简单的判断可以观察脚本的后缀,如果是.asp为后缀,则数据库可能是access,如果是.aspx为后缀,则可能是MsSql,如果是.php对应的可能是mysql数据库如果是.jsp,可能是oracl数据库。

第三步是寻找站点存在的注入点,可以在url中进行尝试输入参数后在拼接上引号,通过回显可以判断该站点传输数据的方式是否为get方式,同样的原理可查看post表单中的数据,在post表单中提交引号;而cookie可以通过burpsuit工具来判断注入点。

第四步就是判断注入点的类型,,通过减法运算哦按段是否是数据型的类型注入,通过单引号和页面的报错信息来判断是哪一种的字符型注入。

第五步就是闭合我们输入的SQL语句,通过注释的方式来获取数据。

根据页面的回显来使用当前最优的方式进行注入

情况一:当页面有回显但是没有显示位的时候,可以选择报错注入,常见的报错函数有(floor(),exp(),updatexml(),exteractvalue()等函数)

情况二:当页面没哟明确的回显信息的时候,但是在输入正确和错误的SQL语句的时候页面不同,则可以使用(ascii(),substr(),length(),concat()函数)

情况三:当页面没有回显也没有报错信息的时候,可以使用时间盲注(sleep()函数)去获取数据库中的数据

还有其他的SQL注入如宽字节注入,base64注入,cookie注入,http头部注入,二次注入,堆叠注入等。

其他SQL注入的方法详解

宽字节注入

原理:

宽字节注入发生的位置就是PHP发送请求到MYSQL时字符集使用character_set_client设置值进行了一次编码。在使用PHP连接MySQL的时候,当设置“character_set_client = gbk”时会导致一个编码转换的问题,也就是我们熟悉的宽字节注入

因为用了gbk编码,使这个为一个两字节,绕过了单引号闭合,逃逸了转义

绕过方式

已知我们的提交数据会被加入\,\的编码为%5c,我们在后面加上%df后变为了%df%5c,变成一个繁体汉字運,变成了一个有多个字节的字符。

防御方式

使用addslashes()函数,这个函数的作用就是转义SQL语句中使用字符串中的特殊字符,有单引号('),双引号("),反斜杠(\)

使用mysql_reaal_escape_string()函数,该函数的作用是转义SQL语句中使用的字符串的特殊字符,影响的字符有\x00,\n,\r,\,‘,",\x1a等。

堆叠注入

原理

堆叠注入就是将两条SQL语句合并在一起进行执行,两条语句可以使用分号(;)来分割他和union联合注入的区别就是union的执行的语句是有限的,可以用来执行查询语句,而堆叠注入可以执行的是任意的语句。

局限性和条件

堆叠注入的局限性就是不是每一个环境中可以执行,可能受到数据库引擎不支持,权限不足也不支持;在php中需要mysqli_multi_query()函数才能支持多条语句的查询,总结下来就需要以下三个条件

目标存在SQL注入漏洞

目标未对(;)进行过滤

目标中间层查询数据库信息时可同时执行多条SQL语句

利用方式

满足以上条件的目标可以直接在?id=1;后面直接插入SQL语句,例如?id=-1;insert into users(id,username,password) values(12,'jack','testjack')--+

二次注入

原理

二次注入可以理解为,攻击者构造的恶意数据存储在数据库后,恶意数据被读取并进入到SQL查询语句所导致的注入。

步骤

第一步插入恶意数据,在插入数据的时候,对其中特殊字符进行了转义处理,在写入数据库的时候又保留了原来的数据

第二步引用恶意数据,由于开发者默认存入的数据库的数据都是安全的,在查询的时候,可以直接从数据库中获取恶意的数据,没有进行检测,进而导致二次注入。

防御方式

使用预处理和数据绑定的方式

对数据的流动进行检测,无论是来自客户端的数据还是来自数据库的数据,都要对其进行过滤,转义(mysql_escape_string,mysql_real_escape_string)。

联合查询

原理

可以使用union的情况,不做过滤,或者是可以绕过过滤的关键字

步骤

依次判断类型,字段数,回显点,依次爆库名,表名,字段名,数据

构造payload进行注入

?id=1'union select 1,2,3 --

?name=1xxxx' union select group_concat(schema_name),2 from information_schema.schemata--+

使用前提

必须使前一个查询的结果为空

union之后的查询字段数必须和union之前的查询字段数相同

防御方式

添加waf对关键字union进过滤

代码层对关键字进行匹配过滤

使用安全的框架

Cookie注入

顾名思义就是后端的cookie信息存放到数据库中,注入原理和SQL注入一样,就是注入点是http请求中的cookie

User-Agent

在user-Agent字段之后加入注入语句

读写注入

原理

当我们知道web资源存储的位置,并且对改路径有读写权限的时候,我们就可以使用文件读写注入,要使用union来进行注入

使用前提

知道文件的路劲

可以使用union查询

写文件的时候没有对单引号做过滤,可以使用into_outfile()函数

读文件的时候对web目录下有写的权限,即在mysql.ini文件中有字段secure-file-priv=''不做设置

针对所有数据库的注入流程

找到注入点

尽可能找到可以利用的注入点,半段数据的类型是get型还是post型,然后再做进一步利用

判断数据库的类型,然后做出对应的闭合方式

首先判断数据库是那种数据库,可以根据每个数据库的特色来进行尝试

获取对应的信息

使用union注入或者盲注或者其他注入的方式来构造payload,然后获取信息

申明:本文仅供技术交流,请自觉遵守网络安全相关法律法规,切勿利用文章内的相关技术从事非法活动,如因此产生的一切不良后果与文章作者无关。

本文作者:黑脸未jack, 原文来源:FreeBuf.COM

相关推荐

威信Chronosonic XVX全新旗舰全球首发 设计特点彻底公开

第一眼看到WilsonAudio新推出的ChronosonicXVX音箱,相信大家都会直觉认为它是两年前超级旗舰WAMMMasterChronosonic的缩小版,不过这个推测并不完全正确。C...

C#高精度Timer和Delay以及时间测量

在PCHMI7.0后在工具箱里会多一个MsTimer,以及Delay和Microsecond两个类。...

python教程从基础到精通,第9课—日期与时间

Hello,小伙伴们,祝大家五.一玩得快乐!刚学习完了七大数据类型,今天咱们来学习日期与时间的表示方法。Python标准库中提供了时间和日期的支持:calendar:日历相关;time、datetim...

软件测试|教你轻松玩转Python日期时间

Python基础之日期时间处理...

Go语言中互斥锁与读写锁,你知多少?

简述Golang中的锁机制主要包含互斥锁和读写锁互斥锁互斥锁是传统并发程序对共享资源进行控制访问的主要手段。在Go中主要使用sync.Mutex的结构体表示。一个简单的示例:funcmutex()...

变形金刚动画大电影——经典台词赏析

YOURDAYSARENUMBEREDNOW,DECEPTI-CREEPS你们活不了多久了,霸天虎小子。-{铁皮说的话,体现了铁皮的嫉恶如仇,可是后来铁皮在飞船上遇袭身亡,可谓是出师未捷身先...

Python时间日期模块使用教程(python3日期)

1.时间日期处理概述在日常编程中,时间日期处理是非常常见的需求,比如:记录日志时间...

亚马逊介绍AWS“无服务器”云服务改进:数据库可线上扩充容量等

IT之家11月29日消息,在今天于美国拉斯维加斯展开的亚马逊“AWSre:Invent2023”活动中,亚马逊计算部门资深副总裁PeterDeSantis,介绍了旗下三款云端服务,IT...

2.日期格式 datetime(日期时间显示格式)

fromdatetimeimportdatetime1.获取当前日期和时间now=datetime.now()#2025-05-3110:56:01.4687822.格式化日期...

【科普】时间单位大盘点(时间单位都有哪些?)

时间单位,是7种基本单位之一,长度、时间、质量、物质的量、光照度、电流和(热力学)温度是七种基本单位。本词条中时间单位以时间从大到小列。今天我们来盘点下时间的单位换算...

基于PHP的Laravel框架,盘点Github高星Web管理后台,效率为王!

在Web开发工作中,选择一个高效、稳定的后台管理系统是提高开发效率的关键。虽然PHP在近些年中的热度有所减退,但其上手简单、开源、灵活且被广泛应用的特点,仍然使其在编程语言排行榜中保持前十的位置。这表...

如何使用PHP编写一个简单的留言板?

留言板是一个常见的Web应用程序,允许用户在网站上发布和查看留言。在本文中,我们将使用PHP编写一个简单的留言板,介绍构建过程中的关键步骤和技巧。一、准备工作在开始编写留言板之前,我们需要准备好以下工...

产品经理提需求时要考虑的 15 个隐性需求

虽然世界充满未知的变化,但是有一些大的方向还是可以把握的,本文跟大家谈谈产品经理提需求时要考虑的15个隐性需求,enjoy~俗话说,计划赶不上变化快,无论需求文档做得如何细致,考虑得如何周全,总会...

关于 PHP 启动 MongoDb 找不到指定模块问题

前言:最近有一个小demo,需要通过PHP将用户行为记录储存到MongoDB,再用Spark做协同过滤。由于以前处理跨语言交互是通过消息中间件,这次本地使用MongoDB却弄出了几个问...

PHP程序员老鸟面试经历(php程序员怎么样)

在任何时代找任何工作都有面试这么一说的。特别是高端技术类的工种对技术理论和技术实操能力要求很严格。大部分公司招收技术员工的要求也越来愈高。至于PHP程序员也是如此,我估计大多数PHP老鸟已经不在意所...