SQL注入攻击入门

article/2025/10/3 10:50:34

目录

一、SQL注入的原理

SQL注入漏洞的条件

二、SQL注入的危害

三、SQL注入的分类

1、注入点数据类型分类

(1)数字型注入

(2)字符型注入

2、注入点位置分类

3、注入方法分类

(1)布尔型注入

(2)报错型注入

(3)延时注入

(4)联合查询注入

(5)宽字节注入

(6)多语句查询注入

四、SQL注入的防御

五、WAF绕过方法

六、SQLMAP


一、SQL注入的原理

SQL注入是一种针对后台数据库的攻击手段,攻击者把精心构造的恶意SQL命令插入到Web表单的输入域或页面请求中,服务器执行SQL命令以达到对数据库的猜解、查询、删除、添加等。

SQL注入漏洞的条件

●输入参数用户可控

●参数被带到数据库查询,即用户输入的数据被拼接成攻击者可控的SQL语句,并被带入到了数据库查询

二、SQL注入的危害

●猜解后台数据库,盗用网站的敏感信息。

●绕过验证,如:用万能密码绕过验证登陆网站后台。

●注入可以借助数据库的存储过程进行提权等操作。

三、SQL注入的分类

1、注入点数据类型分类

(1)数字型注入

● 数字型注入是指输入的参数类型为整数,是最简单的一种注入。其对应的SQL语句可能如下:

SELECT * FROM news_table WHERE id=123 //我们输入的为123

●对其的测试也很简单,只要在末尾添加单引号或“AND 1=1”或“AND 1=2”类似的逻辑判断即可。

  ——> 输入单引号会导致SQL语句中的单引号配对出错,导致查询异常

  ——> 输入AND 1=1不会影响页面返回

  ——> 输入AND 1=2会导致返回空页面或错误页面

  ——> 若这三个都满足,则基本可以确定存在SQL数字型注入漏洞。

●数字型注入漏洞多出现在PHP等弱类型语言中,因为这种语言会对参数类型进行自动推导。但对于Java等强类型语言,将字符串转换为整型的操作会抛出异常,因此强类型语言很少存在数字型注入漏洞。

●具体步骤可以参考:

  17.注入篇————MYSQL数字型注入_Fly_鹏程万里-CSDN博客

(2)字符型注入

●字符型注入是指输入的参数类型为字符串。其与数字型注入的最大不同在于字符型注入一般需要对SQL语句中的单引号进行闭合,否则会出错。其对应的SQL语句有可能如下:

SELECT * FROM users WHERE username='admin' AND 1=1 --'
//我们输入的是admin' AND 1=1 --
//此时admin对应的单引号被闭合,后面的单引号被--注释掉(--和#在SQL里起注释作用)

●对其的测试也很简单

  ——> 输入单引号会导致SQL语句中的单引号配对出错,导致查询异常

  ——> 输入' AND '1'='1不会影响页面返回

  ——> 输入' AND '1'='2会导致返回空页面或错误页面

  ——> 若这三个都满足,则基本可以确定存在SQL字符型注入漏洞。

●具体步骤可以参考:

 18、注入篇——————MYSQL字符型注入_Fly_鹏程万里-CSDN博客

 SQL注入(二):pikachu(一):MySQL字符型注入(post) --- 字符型注入_天威一号-CSDN博客

2、注入点位置分类

按照注入点位置对SQL注入进行分类还可以分为GET注入、POST注入、Cookie注入。

3、注入方法分类

盲注:不能通过直接显示的途径来获取数据库的方法。一般有三种:布尔盲注、报错型盲注、延时盲注。

(1)布尔型注入

当查询的结果不会显示在界面,同时不会显示报错信息时,若能从页面反馈结果得知SQL语句的成功与否则可以考虑布尔盲注。

●具体步骤可以参考:

 布尔型盲注基本思路_刘启明-CSDN博客

 布尔盲注详解_AaronLuo-CSDN博客_布尔盲注

 SQL布尔型盲注思路分析(入门必看)_Pz_mstr's Blog-CSDN博客_sql布尔盲注

(2)报错型注入

当输入特殊字符页面出现报错信息时,则可以考虑使用基于错误的注入。攻击者故意在查询中注入无效输入或者SQL令牌来产生语法错误、类型不匹配,或者逻辑错误。适用于无回显数据但是有数据库报错输出的场景。主要为xpath报错和group by报错。

限制条件:后台没有屏蔽数据库报错信息,在语法发生错误时会输出到前端。

●xpath报错

①常用函数:

updatexml()函数:

 extractvalue()函数:

②部分代码:

查表名:
?id=1 union select updatexml(1,concat(0x7e,select group_concat(table_name) from information_schema.tables where table_schema='test',0x7e),1) #
查列名:
?id=1 union select updatexml(1,concat(0x7e,select group_concat(column_name) from information_schema.columns where table_schema='test' and table_name='test1'),0x7e),1) #
查test2字段数据:
?id=1 union select updatexml(1,concat(0x7e,select group_concat(test2) from test.test1),0x7e),1) #

concat()函数:用于连接两个或多个数组,将其拼接后输出到前端

group_concat()函数:将查询产生的同一个分组的值连接起来,返回一个字符串结果,可以排除重复值。一般显示内容很少时可以用这个将行与列互换显示。

0x7e:是特殊符号“~”,为了区分报错后的有用信息

●group by报错

①常用函数:

floor()函数:向下取整

floor(x)返回小于或等于x的最大整数

floor报错要求:数据库中要查询的数据至少3条以上

②部分代码:

查库名:
?id=-1 and (select 1 from (select count(*),concat(database(),floor(rand(0)*2)x from information_schema.tables group by x)) a) 
查表名:
?id=-1 and (select 1 from (select count(*),concat((select concat(table_name) from information_schema.tables where table_schema="test" limit 0,1),floor(rand(0)*2))x from information_schema.tables group by x)) a) 
查列名:
?id=-1 and (select 1 from (select count(*),concat((select concat(column_name) from information_schema.columns where table_name="test1" limit 0,1),floor(rand(0)*2))x from information_schema.tables group by x)) a) 
查test2字段数据:
?id=-1 and (select 1 from (select count(*),concat((select concat(test2) from test1 limit 0,1),floor(rand(0)*2))x from information_schema.tables group by x)) a) 

(3)延时注入

延时注入是一种基于时间差异的注入技术,通过向数据库注入时间延迟并检查服务器响应是否也已经延迟来获取数据库信息。攻击者可以采取页面加载的时间来决定注入的语句是否正确。

●常用函数:

benchmark(count,expr):将expr语句执行count次来达到延迟目的

sleep(time):直接延迟time时间

if(T,a,b):判断T,若真则执行a,若假则执行b

●具体步骤可以参考:

一次手工和工具的延时注入(时间注入)_liam liang的博客-CSDN博客_时间注入SQL盲注(延时注入)_JKding123的博客-CSDN博客一次手工和工具的延时注入(时间注入)_liam liang的博客-CSDN博客_时间注入

(4)联合查询注入

union关键字将两个或多个查询结果组合成为单个结果集,即联合查询。多数数据库支持union查询。需要注意的是所有查询的列数必须相同且数据类型兼容。

●条件:页面上有显示位

●具体步骤可以参考:

WEB漏洞-SQL注入之联合查询注入_钓鱼的猫咪的博客-CSDN博客

mssql注入实例--联合查询注入_buffedon的博客-CSDN博客

(5)宽字节注入

利用数据库的编码转换使得引号闭合的注入方式。

●相关函数:addslashes()、mysql_real_escape_string()、 mysql_escape_string() 函数或者开启magic_quotes_gpc=on的方式来防止注入,也就是给单引号(' )、 双引号(")、反斜杠(\)和NULL加上反斜杠转义。但是如果在使用PHP连接MySQL的时候,又设置了“set character_set_client = gbk" 时又会导致一个编码转换的注入问题,也就是我们所熟悉的宽字节。但一般都不是直接设置character_set_client=gbk,通常的设置方法是SET NAMES 'gbk'。

●具体步骤可以参考:

宽字节注入_heiseweiye的博客-CSDN博客_宽字节注入

●针对宽字节注入的防御:

A.在执行查询之前先执行SET NAMES 'gbk',character_set_client=binary设置 character_set_client 为binary。
B.使用 mysql_set_charset(‘gbk’) 设置编码,然后使用 mysql_real_escape_string() 函数被参数过滤。
C.使用pdo方式,在PHP5.3.6及以下版本需要设置setAttribute(PDO::ATTR_EMULATE_PREPARES, false); 来禁用 prepared statements 的仿真效果。

(6)多语句查询注入

多语句查询注入又称为堆叠查询注入,攻击者利用分隔符(如:;)攻击数据库,在原始的查询基础上附加额外的查询。通常第一个查询是合法查询,后面的查询是攻击者附加的非法查询。攻击者可以向数据库注入任意命令。

四、SQL注入的防御

(1)对输入数据进行校验

通常可以把输入数据审核技术分成以下几类:对非法数据进行修整而将其转化为合法数据、拒绝未知的非法语句输入(黑名单)、只接受已知的合法数据(白名单)。

对于数据的校验可以从前端和后端两个层面来进行。前端可以基于Javascript等脚本语言进行输入合法性校验,后端由后台开发语言代码负责数据合法性校验。单纯的前端校验没有太大意义,因为攻击者可以通过将前端校验的数据截获,然后修改后再发送给后台服务器的方式绕过前端检测。后端校验发生在数据传送到服务器以后进行,一般情况下攻击者没有权限修改到达服务器后台的数据,因此后端校验可以保证输入数据的合法性和正确性。

(2)对输入数据进行编码或数据类型校验

●数据类型校验

对于PHP等弱类型语言,数字型注入也是一种常见形式。该种类型注入的防御也比较简单,只需要在后端程序中对数据类型进行严格判断即可(如:is_numeric()函数)。

●对输入数据进行编码

对用户输入的数据进行适当的编码,这样服务器就不会执行恶意语句。如:在字符型注入攻击中,攻击者在字符型注入中为了闭合语句,必然会用到单引号等特殊字符,那么将攻击者输入的特殊字符进行转义或编码就可以防御字符型注入攻击。

在OWASP ESAPI中提供了对数据库转码的接口,其针对不同的数据库实现了不同的编码器,对于不知道需要转义这些特殊字符的用户可以直接根据数据库类型进行选择使用相应的ESAPI即可。

(3)使用预编译语句或存储过程

PHP、Java、C#等语言都提供了预编译语句,可以很好的屏蔽动态SQL语句,从而起到预防SQL注入的效果。如:Java的Statement、PreparedStatement、CallableStatement等。

(4)使用ORM或框架技术

专门与数据库进行交互的框架被称为持久化框架,如:Hibernate(开源、对JDBC进行了封装)、JORM等。

(5)不要开启数据库的错误显示

(6)限制输入长度

(7)限制好数据库权限,drop/create/truncate等权限谨慎grant

(8)数据库信息加密,可以采用一次md5后加盐再md5

五、WAF绕过方法

可以参考:

WAF绕过方法_bandongshen9543的博客-CSDN博客

六、SQLMAP

SQLMAP是一款基于Python开发的开源的SQL注入漏洞测试工具,它可以自动检测并完成SQL注入漏洞的利用。

●使用教程可以参考:

sqlmap详细使用教程_星落的博客-CSDN博客_sqlmap使用教程


http://chatgpt.dhexx.cn/article/C9GlRoKl.shtml

相关文章

数学里上凹,下凹,上凸,下凸

https://zhidao.baidu.com/question/238541854.html 数学里上凹,下凹,上凸,下凸统称为曲线的凸知性,其是指在平面坐标系里的图形样式: 1、开口向上的曲线,称为上凹,或称为下凸,形状…

凸凹函数

凹凸函数的代数定义 若函数f(x)为凸函数,那么- f(x) 为凹函数。所以,清楚了凸函数,等价于清楚了凹函数 凸函数的定义 对于一元函数f(x),如果对于任意tϵ[0,1]均满足:f(tx1(1−t)x2)≤tf(x1)(1−t)f(x2),则称…

一元函数的凹性concavity以及二阶导数

凹性(concavity)与函数导数的变化率有关。一个函数f是上凹(即抛物线方向开口向上),其导数f是增函数,也意味着f的导数(即f)是正数;类似的一个函数f是下凹(即抛物线方向开口向下),其导…

转载--32个鲜为人知的自学网站

分享32个鲜为人知并且完全免费的高质量自学网站,每个都是堪称神器,让你相见恨晚。 1:Oeasy 是一个完全免费的综合视频教程网站,非常良心实用。 它提供的视频教程非常丰富并且质量很高,包括:PS 教程、手机摄…

分享32个高质量的自学网站

原文作者:木子淇 链接:有哪些高质量的自学网站? - 知乎 来源:知乎 1:Oeasy http://oeasy.org/Oeasy 是一个完全免费的综合视频教程网站,非常良心实用。 它提供的视频教程非常丰富并且质量很高&#xf…

Jack魏--个人介绍

Jack魏 1.名字由来2.兴趣爱好3.专业技能4.所获荣誉5.所获证书6.博主平台7.阅读书籍 1.名字由来 大二去韩国大邱永进专门大学短期学习的时候, 遇到了来自加拿大的Jack老师, 他无拘无束、有趣的教学方式感动了我, 所以我的英文名为了致敬他&am…

saiku 连接 MySQL_Saiku连接mysql数据库(二)

Saiku连接Mysql数据库展示数据 参考链接:https://www.cnblogs.com/shirui/p/8573491.html 前提:Saiku已安装好,mysql已安装好 1.添加Saiku的数据库驱动: mysql-connect-java-5.1.17.jar 下载相应的数据库驱动放到 saiku-server\to…

解决生成的saiku文件读取中文乱码的问题

javax.ws.rs.WebApplicationException: org.saiku.service.util.exception.SaikuServiceException: org.saiku.service.util.exception.SaikuServiceException: Cannot get native cube for cube ( [pda].[pdaTest].[pdaTest].[鑽簵鍒嗘瀽] ) at org.saiku.web.rest.resource…

saiku集成CAS

最近一直在研究saiku如何集成公司的单点登录系统,通过google、百度搜集查阅了大量的相关资料,并和网友讨论最终在公司内部集成完成,最终测试上线;现将这一过程中的经验记录下来,分享给需要的朋友.... saiku集成CAS这一…

saiku连mysql 使用_Saiku的基本使用介绍(三)

Saiku的基本使用介绍(这里都是使用Admin用户登录系统) 1、启动安装好的Saiku ( ./start-saiku.sh ) ,浏览器使用访问系统 http://localhost:8080 ,然后使用 admin admin 登录系统 2、 登录系统后,首先点击 A ,进入管理控制平台(添加数据源信息) 2.1 根据…

使用Saiku角色权限控制Schema行级权限操作

描述:saiku加载schema模型,选择维度或度量,动态组合要展示数据进行分析操作的工具。 话不多说,直接操作 1、用admin登陆saiku,点击A按钮,添加用户sa 如图: 2、设置用户名,密码&…

saiku java_saiku 3.8 二次开发代码整理步骤(20160727更新)

创建新项目saiku3 在创建的项目中,分别创建resource目录:“src/main/saiku-web”,“src/main/saiku-service”,“src/main/saiku-olap-util”,并将saiku-core下的相应代码(java目录下和resources目录下的文件)分别copy…

saiku连mysql 使用_saiku应用的调试

ubuntu下解压saiku包后使用: 运行.sh命令(.bat是windows命令)。运行时注意权限。可以先chmod ax *.sh 提示,catali?.sh出错。 这是tomcat的一个文件,服务器不行,先查权限,当前用户。 一般是java配置的不对。…

saiku java_saiku3.8二次开发项目搭建(非maven)

参考文章:http://blog.csdn.net/gsying1474/article/details/51603535 本文大部分参考了上面的博文,这里只是做一个记录,由于本人maven能力有限,尝试失败后这里搭建的是普通web项目。 saiku3.8项目搭建步骤: 1.下载sai…

saiku 连接 MySQL_saiku迁移至mysql步骤

saiku数据库的表和用户默认创建是在启动项目的时候,通过初始化 saiku-beans.xml 中的 h2database 这个bean执行org.saiku.service.Database类的init方法来初始化数据表和默认用户的。 默认用户迁移mysql步骤: 1.修改web.xml文件,修改名为db.u…

saiku 使用笔记

OlapException :Unable to find a member with name …… 报表可以查看,但是不能使用过滤器(比如:keep only) 点击后出现错误 备注:saiku 3.15 数据库为mysql 5.5 解决方法:将mysql5.5 服务关闭&am…

saiku java_Saiku的下载与安装(一)

Saiku- 数据可视化的工具,连接数据源展示数据,并且可方便导出xls/csv/pdf等文件的工具 一、Saiku下载 二、 Saiku安装 (将下载好的Saiku包放在任意盘目录,不需要配置关于Saiku的环境变量,前提 安装好JDK,配置好JAVA_HO…

saiku安装

saiku安装使用 经过一天的查询资料摸索,记录一下笔记,方便以后使用。 1、http://community.meteorite.bi/ 下载; 2、解压运行对应系统脚本文件。 3、访问8080可以进入登录页面。 4、https://licensing.meteorite.bi/login 注册账号登录。…

Saiku

参考 http://kylin.apache.org/blog/2019/05/23/saiku-kylin-molap/ https://mondrian.pentaho.com/documentation/schema.php 简介 Saiku 是一个用于 OLAP 分析的套件。用户可在浏览器中通过拖拽的方式进行分析。降低了使用者的学习成本。它能够连接多种数据源,…