MySQL长字符截断的实现示例
作者:辰霖心 发布时间:2024-01-25 23:55:01
MySQL超长字符截断又名"SQL-Column-Truncation",是安全研究者Stefan Esser在2008 年8月提出的。
在MySQL中的一个设置里有一个sql_mode选项,当sql_mode设置为default时,即没有开启STRICT_ALL_TABLES选项时(MySQLsql_mode默认即default),MySQL对插入超长的值只会提示warning,而不是error,这样就可能会导致一些截断问题。
新建一张表测试,表结构如下(MySQL5.1):
CREATE TABLE USERS(
id int(11) NOT NULL, //长度为7
username varchar(7)NOT NULL,
password varchar(12)NOT NULL ,
)
分别插入以下SQL语句(注入提示消息)。
①插入正常的SQL语句。
mysql> insert into users(id,username,password)values(1,'admin','admin');//成功插入,无警告,无错误
Query OK,1 row affected(0.00 sec)
②插入错误的SQL语句,此时的"admin "右面有三个空格,长度为8,已经超过了原有的规定长度。
mysql> insert into users(id,username,password)values(2,'admin ','admin');
//成功插入,一个警告
Query OK,1 row affected,1 warning(0.00 sec)
③插入错误的SQL语句,长度已经超过原有的规定长度。
mysql> insert into users(id,username,password) values(3,'admin x','admin');
//成功插入,一个警告
Query OK,1 row affected,1 warning(0.00 sec)
MySQL提示三条语句都已经插入到数据库,只不过后面两条语句产生了警告。那么最终有没有插入到数据库呢?执行SQL语句查看一下就知道了。
mysql> select username from users;
可以看到,三条数据都 * 入到数据库,但值发生了变化,此时在通过length来取得长度,判断值的长度。
mysql> select length(username)from users where id =1 ;
可以发现,第二条与第三条数据的长度为7,也就是列的规定长度,由此可知,在默认情况下,如果数据超出列默认长度,MySQL会将其截断。
但这样何来攻击一说呢?
面查询用户名为'admin'的用户就知道了。
mysql> select username from users where username='admin';
只查询用户名为admin的用户,但是另外两个长度不一致的admin用户也被查询出,这样就会造成一些安全问题,比如,有一处管理员登录是这样判断的,语句如下:
$sql = "select count(*) from users where username='admin' and password='*******;
假设这条SQL语句没有任何注入漏洞,攻击者也可能登录到管理页面。假设管理员登录的用户名为 admin,那么攻击者仅需要注册一个"admin”用户即可轻易进入后台管理页面,像著名的WordPress就被这样的方式攻击过。
来源:https://blog.csdn.net/cyynid/article/details/129261347


猜你喜欢
- 小编使用python中的django框架来完成!1,首先用pycharm创建django项目并配置相关环境这里小编默认项目都会创建setti
- 1. 创建shell脚本 vim backupdb.sh 创建脚本内容如下: #!/bin/sh db_user="root&qu
- jwt详解Django之auth模块(用户认证)jwt的作用json web token,一般用于用户认证就是做用户登录的(前后端分离/微信
- 第一种方案、最简单、普通的方法:SELECT TOP 30 * FROM ARTICLE WHERE ID NOT IN(SELECT TO
- 如何把程序打包为whl首先需要一个库:setuptools如果是conda环境的话,这个包是自带的,不需要另外安装。首先把需要打包的py文件
- 安装lodashnpm i --save-dev @types/lodash在组件中引入lodashimport * as _ from &
- 数据归一化是深度学习数据预处理中非常关键的步骤,可以起到统一量纲,防止小数据被吞噬的作用。一:归一化的概念归一化就是把所有数据都转化成[0,
- 前言使用python直接使用pip install xx时,出现 Could not fetch URL https://pypi.pyth
- 思路:队列使用说明:multiprocessing.Queue()#用于进程间通信,单主进程与子进程无法通信(使用进程池时尽量不要使用这个)
- 本文实例讲述了Java基于正则表达式实现的替换匹配文本功能。分享给大家供大家参考,具体如下:package replaceDemo;impo
- 工作时常遇到需要在其它地方拷贝样式,比如Firebug之类的,但是复制出来的样式是带有换行和空格的,对于我这种有点洁癖的人来说,经常会一个个
- 前言本文主要基于在Uber的Go monorepo中发现的各种数据竞争模式,分析了其背后的原因与分类,希望能够帮助更多的Go开发人员,去关注
- 由于之前有一个项目老是要打开文件,然后用pickle.load(file),再处理。。。最后要关闭文件,所以觉得有点繁琐,代码也不简洁。所以
- 本文实例为大家分享了原生js实现波浪导航效果的具体代码,供大家参考,具体内容如下展示效果:源码展示:<!doctype html>
- 一个最最简单的例子:绘制一个从 0 到 360 度完整的 SIN 函数图形import numpy as npimport matplotl
- 一、 排序的基本使用在查询数据时,如果没有使用排序操作,默认情况下SQL会按元组添加的顺序来排列查询结果。在SQL中,使用关键字 ORDER
- python中基本数据类型和其他的语言占用的内存空间大小有很大差别import sysa = 100b = Truec = 100Ld =
- 快速排序由于排序效率在同为O(N*logN)的几种排序方法中效率较高,因此经常被采用。该方法的基本思想是:1.先从数列中取出一个数作为基准数
- 本文实例讲述了Python对列表排序的方法。分享给大家供大家参考。具体分析如下:1、sort()函数sort()函数使用固定的排序算法对列表
- <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN&q