首页 > 数据库 >Web学习_SQL注入_联合查询注入

Web学习_SQL注入_联合查询注入

时间:2024-06-06 21:00:04浏览次数:19  
标签:语句 Web name 数据库 SQL id 注入

UNION 操作符用于合并两个或多个 SELECT 语句的结果集, UNION 结果集中的列名总是等于 UNION 中第一个 SELECT 语句 中的列名,并且UNION 内部的 SELECT 语句必须拥有相同数量的 列。 联合查询注入就是利用union操作符,将攻击者希望查询的语句注入 到正常select语句之后,并返回输出结果。 SQL注入的一般流程为:

1. SQL注入点探测。探测SQL注入点是关键的一步,通过适当的分 析应用程序,可以判断什么地方存在SQL注入点。通常只要带有 输入提交的动态网页,并且动态网页访问数据库,就可能存在 SQL注入漏洞。如果程序员信息安全意识不强,采用动态构造 SQL语句访问数据库,并且对用户的输入未进行有效性验证,则 存在SQL注入漏洞的可能性很大。一般通过页面的报错信息来确 定是否存在SQL注入漏洞。

2. 收集后台数据库信息。不同数据库的注入方法、函数都不尽相 同,因此在注入之前,我们先要判断一下数据库的类型。判断数 据库类型的方法很多,可以输入特殊字符,如单引号,让程序返 回错误信息,我们根据错误信息提示进行判断;还可以使用特定 函数来判断,比如输入"select version()",程序返回正常,说明 version()函数被数据库识别并执行,而version()函数是MySQL特 有的函数,因此可以推断后台数据库为MySQL。

3. 猜解数据库字段。数据库中的表和字段命名一般都是有规律的。 通过构造特殊SQL语句在数据库中依次猜解出表名、字段名、字 段数、用户名和密码。

4. 查找Web后台管理入口。WEB后台管理通常不对普通用户开 放,要找到后台管理的登录网址,可以利用Web目录扫描工具 (如:wwwscan、AWVS)快速搜索到可能的登录地址,然后 逐一尝试,便可以找到后台管理平台的登录网址。

5. 入侵和破坏。一般后台管理具有较高权限和较多的功能,使用前 面已破译的用户名、密码成功登录后台管理平台后,就可以任意 进行破坏,比如上传木马、篡改网页、修改和窃取信息等,还可 以进一步提权,入侵Web服务器和数据库服务器。

判断漏洞是否存在

 根据客户端返回的结果来判断提交的测试语句是否成功被数据库引擎执行,如果测试语句被执行了,说明存在注入漏洞。 一般利用单引号(')或者双引号(")来判断是否存在漏洞,如果出 现SQL语句错误说明有很大的可能会存在漏洞。

比如,访问dvwa靶场: http://127.0.0.1/dvwa/vulnerabilities/sqli/? id=1&Submit=Submit#,此时URL实际向服务器传递了值为1的变量id,此时服务器就会从users表中把满足user_id=1这个条件的行(记 录)的first_name, last_name查询出来:

后端 (phpstudy\PHPTutorial\WWW\DVWA\vulnerabilities\sqli\source\lo w.php)向数据库获取数据的SQL语句为:

SELECT first_name, last_name FROM users WHERE user_id = '$id';

 

再SQL-Font里显示为:

这里我们加了一个   ‘,http://www.dvwa.test/vulnerabilities/sqli/?id=1'&Submit=Submit#

SQL语句就变为了

SELECT first_name, last_name FROM users WHERE user_id = '$id'';

可以看到多了一个单引号,因为单引号不匹配,则会报错。如果能 引起数据库的报错,说明用户是可以对查询语句进行修改的,说明存在漏洞。

判断注入类型

判断注入类型是数字型还是字符型,这涉及到在注入的过程中是否需要添加单引号,可以使用and( 逻辑与)进行判断,,当条件表 达式两边都为真才是真,有一边为假则是假

1 and 1=1

1 and 1=2

如果输入1 and 1=1和1 and 1=2页面的查询结果都返回相同的内容,说明不是数字型注入。既然不是数字型,那就有很大的可能是字符型注入了。

如果是字符型则需要对单引号(')进行闭合,因为MySQL中的引号 都是成双成对出现的。

思考:为什么从以上方法中可以判断出注入的类型呢?

首先回到数字型注入和字符型注入的定义,当用户输入上方的判断语句时,

如果是数字型注入,则SQL语句变成了

SELECT first_name, last_name FROM users WHERE user_id = 1 and 1=1;

SELECT first_name, last_name FROM users WHERE user_id = 1 and 1=2;

如果是字符型注入,则变成了

SELECT first_name, last_name FROM users WHERE user_id = '1 and 1=1';

SELECT first_name, last_name FROM users WHERE user_id = '1 and 1=2';

数据库会把用户输入的内容当成了一体进行查询,大家可以将以上四条语句拿到数据库里执行,前两条语句会返回不一样的内容,后 两条语句会返回相同的内容。

 思考:为什么后两条语句同样是用and,但是输出的内容是相同的?

这个涉及到了MySQL的隐式类型转换。隐式转换隐式转换是自动调用的, 用于实现自动将某种类型的数据转换为另外一种类型的数 据。上面的例子中,user_id是int型,传入的'1 and 1=1'是字符串, 会触发隐式类型转换:

'1 and 1=1'==>1

'2admin' ==>2

'admin'==>0

'33admin'==>33 

所以两条语句都通过转换变为了1。

判断表中列数

 为了方便后续获取数据,需要先知道查询的表中显示的字段数,可以使用order by来进行判断。ORDER BY*语句用于根据指定的列对结果集进行排序。

用法:order by 列名或者order by 列编号。

特性:当order by的数字大于当前的列数时候就会报错,SQL注入利用这个特性来判断列数。

这里我们猜3,发现抱错

 这里我们猜对了列数

图中URL的%23为井号(#)进行了url编码,是为了将SQL语句中多余的单引号注释掉,GET型注入可以使用#号的url编码%23或者--+进行注释

 SELECT first_name, last_name FROM users WHERE user_id = '1' order by 2#';

 确定显示位

 显示位:在一个网站的正常页面,服务端执行SQL语句查询数据库 中的数据,客户端将数据展示在页面中,这个展示数据的位置就叫显示位。

这里我们输入

http://127.0.0.1/test/vulnerabilities/sqli/? id=1'+union+select+1%2C2%23&Submit=Submit#

但我们一般都要把1改为-1,

在实战中,一般不查询union左边的内容,这是因为程序在展示 数据的时候通常只会取结果集的第一行数据,所以,只要让第一行查询的结果是空集,即union左边的select子句查询结果为 空,那么union右边的查询结果自然就成为了第一行,打印在网页上了。所以让union左边查询不到,可以将其改为负数或者改 为比较大的数字。

 获取数据

 以DVWA靶场为例,演示如何获取数据库中的数据

获取数据库名、版本

1' union select version(),database()#

获取数据库表名

-1' union select 1,table_name from information_schema.tables where table_schema='dvwa'#

很多网站只显示1条结果,为了能够输出所有结果,可以使用 group_concat()函数,将多行合并成一行:

-1' union select 1,group_concat(table_name) from information_schema.tables where table_schema='dvwa'#-1' union select 1,table_name from information_schema.tables where table_schema='dvwa' limit 0,1

#group_concat()函数被过滤时,可以使用limit n,1 来逐个输出查询内容

 

 这里的数据库名、表名等的字符串表示,需要用单引号、双引号包裹住,或者可以使用对应的十六进制的形式。

获取某个表中的字段名 

-1' union select 1,group_concat(column_name) from information_schema.columns where table_name='guestbook'#

 

获取字段中的记录 

-1' union select 1,group_concat(comment_id,comment,name) from guestbook#

标签:语句,Web,name,数据库,SQL,id,注入
From: https://blog.csdn.net/DonG333_/article/details/139455961

相关文章

  • 什么是Web应用--以JavaWeb为例
    Web应用(WebApplication)是指通过Web浏览器访问的应用程序。与传统的桌面应用不同,Web应用运行在服务器上,通过网络传输数据,并在客户端浏览器中显示和操作。这种架构具有跨平台、易于更新和维护等优势。Web服务器的作用Web服务器在Web应用中扮演着重要角色,主要功能包括:接收......
  • JavaWeb_SpringBootWeb案例
    环境搭建:开发规范接口风格-Restful:统一响应结果-Result:开发流程:        第一步应该根据需求定义表结构和定义接口文档注意:    本文代码从上往下一直添加功能,后面的模块下的代码包括前面的模块,并不是某个模块中的代码只有当前功能。部门管理查......
  • DotNet8自宿主web服务器搭建记录
    建立3个项目,分别是类库项目ConfigTool.WebSite、webapi项目ConfigTool.TestWebSite、webapi项目ConfigTool.WinService,目标框架均为.NET8。 其中控制台ConfigTool.TestWebSite方便开发调试,win服务ConfigTool.WinService作为宿主服务,类库ConfigTool.WebSite为自定义web服务器的......
  • Web应用课 第三讲 文本、字体、背景、边框、展示格式
    文本对齐方式text-alignCSS属性定义行内内容(例如文字)如何相对它的块父元素对齐。text-align并不控制块元素自己的对齐,只控制它的行内内容的对齐。left 把文本排列到左边。默认值:由浏览器决定。right 把文本排列到右边。center 把文本排列到中间。justify 实现两端对齐文......
  • sql 条件用空值进行比对的结果
    selectSUM(e.Qty)asInputQtyfromUT_InputInfoasainnerjoinT_ProcessDefasbona.ProcessID=b.ProcessIDinnerjoinUT_PrdTaskasdona.OrderID=d.OrderIDinnerjoindbo.UT_LabelInfoRecaseona.LabelPrtRecID=e.PrtRecIDinnerjoinUT_PrdTaskash......
  • Web攻防:SQL注入 - 前置知识
    SQL注入-前置知识1.注入原理1.1.什么是SQL注入1.2.SQL注入产生的条件2.系统函数2.1.version()-MySQL版本2.2.user()-数据库用户名2.3.database()-数据库名2.4.@@datadir-数据库路径2.5.@@version_compile_os-操作系统版本3.字符串连接函数3.1.C......
  • 聊聊如何理解MySQL引擎--Innodb和MyISAM和Memory
    mysql的常见的引擎有许多比如,MYISAM、Innodb、Memory、MERGE。可以通过mysql>showengines;查看数据库提供的引擎:我们今天聊聊如何理解Innodb和MyISAM,Memory,这是面试时会问的问题。首先是Innodb:先上概念:Innodb:行级锁,提供了具有提交、回滚和崩溃回复能力的事务安全,支......
  • 安卓架构组件-依赖注入
    安卓依赖注入什么是依赖注入依赖注入(DI,DependencyInjection)是一种广泛的编程技术。把依赖(所需对象)传递给其它对象创建,好处是类的耦合更加松散,遵循依赖倒置的原则。类获取所需对象classEngine{funstart(){println("enginestart")}}class......
  • Java (Docker MySql)
    前沿加油每天进步一点就是无敌可以去官网下载Docker yuminstall-ydocker重启刷新停止sudosystemctlstartdockersudosystemctlstopdockersudosystemctlrestartdocker哈可以装客户端端dcocker直接安装就完事了  然后安装mysql然后遇到这样的......
  • python SQLite3 库
    sqlite3是一个python中内置数据库,执行时会在本地文件夹中创建一个数据库   importsqlite3#连接到数据库,如果数据库不存在,则会被创建conn=sqlite3.connect('example.db')#创建一个cursor对象cursor=conn.cursor()#创建表格的SQL命令create_table_query......