本文实例讲述了MySQL解决SQL注入的另类方法。分享给大家供大家参考,具体如下:

问题解读

我觉得,这个问题每年带来的成本可以高达数十亿美元了。本文就来谈谈,假定我们有如下 SQL 模板语句:

select * from T where f1 = '{value1}' and f2 = {value2}

现在我们需要根据用户输入值填充该语句:

value1=hello

value2=5

我们得到了下面的 SQL 语句,我们再提交给数据库:

select * from T where f1='hello' and f2=5

问题在于,攻击者可以构造如下的用户输入值:

value1=anything' or 1=1 or f1='whatever

value2=5

拼接好的最终语句就变成了:

select * from T where f1='anything' or 1=1 or f1='whatever' and f2=5

攻击者成功地改变了模板语句的语义。这种问题不单单发生在 SQL 上,还出现在通常使用模板的任何语言上,比如 HTML 和 shell 脚本。

常规解决方案的说明

SQL 是具备任意性和一致性的公理,token 和派生规则构成其公理化基础。要注意的一个词语是「任意性」。与 SQL 等价的公理化数不胜数。对于这种任意等价的表示,每一条合法的语句都能被准确地映射到 SQL 里的合法语句,其它语言亦然。在这种任意等价表示中,如果某语句是不合法的,那么它在 SQL 里也是不合法的。攻击者不可能构造出可以满足任何可能的、任意与 SQL 等价的规则。

策略1:根据不同的派生规则,用另一种语法扩展模板语句

例子1:前缀语言

SQL 使用中缀表示法注1。中缀表示法等价于 lisp 风格的前缀表示法注2。中缀与前缀:

a OP1 b OP2 c <=> (OP1 a (OP2 b c))

a、b、c 是标识符或值,OP1、OP2 是操作符或功能。

前缀表示法的示例语句:

(select * T (and (= f1 '{value1}') (= f2 {value2})))

该语句是等价的。它们在语义上属于外延。自动把 SQL 的中缀表示法转换成前缀表示法或其它表示法,都不算问题了。然而,攻击者的注入在前缀语法方面就是不合法的:

(select * T (and (= f1  'anything' or 1=1 or a='whatever') (= f2 5)))

语法错误。攻击者想要的是:

(select * T (or (= f1 'anything') (or (=1 1) (and (= a 'whatever') (= f2 5)))))

这是不同的。攻击者的注入不能输出合法的前缀语言。

例子2:欧拉表示法

另一个替代方法将数得着欧拉表示法了。从中缀表示法到欧拉:

a OP1 b OP2 c <=> OP1(a,OP2(b,c))

例子中的语句:

select( *,T,and(=(f1,'{value1}'),=(f2,{value2})))

而注入的语句将出现语法错误:

select( *,T,and(=(f1,'anything' or 1=1 or a='whatever'),=(f2,5)))

攻击者本来是想写成:

select( *,T,or(=(f1,'anything',or(=(1,1),and(=(a,'whatever'),=(f2,5))))))

攻击者正在做错误的事情。他的注入根本就没有注意到所选的任意标记法。

例子3:对象标记法(object notation)

还有一种替代方法,对象标记法。从前缀表示法到对象:

a OP1 b OP2 c <=> a.OP1(b).OP2(c)

例子的代码:

T.where(f1.=('{value1}').and(f2.=({value2})).select(*)

注入再一次折戟于语法:

T.where(f1.=('anything' or 1=1 or a='whatever').and(f2.=5)).select(*)

我不再提供正确答案了,读者可以当做练习,看看攻击者应该写成什么样子。

策略2:为 SQL 选择其它任意 token

keyword 常常是一门语言里的任意 token。重要的是它们在派生规则里的位置、而非它们的任意体现。你总是可以用其它 keyword 替换现有 keyword,并且来回转换。举个例子,我们可以将下面 SQL 语句中的 keyword 转换成我们姑且称为「任意的 brainfuck」:

{"select":"iph0ohKi", "*":"ieZoh4xa", "from":"aeZi5uja", "where":"OoJ4aX4n", "=":"eeQu2Zad", "(":"eiD5aera",")":"Soo2uach", "or":"Ocaig5Es"}

为了论证起见,我们将把操作数映射为 半任意的结构化序列:

T <=> @phai1Oa6@T@

hello <=> @phai1Oa6@hello@

phai1Oa6 是任意选取的字符序列。对于当前情形,例子:

select * from T where f1 = '{value1}' and f2 = {value2}

变成了:

iph0ohKi ieZoh4xa aeZi5uja @phai1Oa6@T@ OoJ4aX4n @phai1Oa6@f1@ eeQu2Zad '{value1}' @phai1Oa6@and@ @phai1Oa6@f2@ eeQu2Zad {value2}

这是合法的、任意的 brainfuck 语言。经过注入之后,我们得到了:

iph0ohKi ieZoh4xa aeZi5uja @phai1Oa6@T@ OoJ4aX4n @phai1Oa6@f1@ eeQu2Zad 'anything' or 1=1 or a='whatever' @phai1Oa6@and@ @phai1Oa6@f2@ eeQu2Zad 5

你可以看到,它包含的 token 有 'or' 和 '=',它们在任意的 brainfuck 语言中是不合法的。我们的语法说,你必须这样使用:

or <=> Ocaig5Es

= <=> eeQu2Zad

这些 token 也不是操作数,因为它们将只能被视作:

or <=> @phai1Oa6@or@

= <=> @phai1Oa6@=@

换句话说,注入之后的语句就变得不合法、也不可用了。

策略3:验证不变量

你数数下面模板语句例子中的 token 有几个?

[1] select [2] * [3] from [4] T [5] where [6] f1 [7] = [8] '{value1}' [9] and [10] f2 [11] = [12] {value2}

12 个。模板填充之后,总数必须仍然为 12,但是我们却看到了攻击者所引发的结果:

[1] select [2] * [3] from [4] T [5] where [6] f1 [7] = [8] 'anything' [9] or [10] 1 [11] = [12] 1 [13] or [14] a [15] = [16] 'whatever' [17] and [18] f2 [19] = [20] 5

现在有 20 个 token 。违反这种不变量,就暴露了有问题的地方。同样适用于相同语句的表示,除了任意的、brainfuck 语言。模板的填充根本不可能导致 token 数量的变化。

事实上,你可以试着使用其它不变量,并在填充之后进行验证。攻击者必须和它们保持一致。

结论

有些人提倡,程序员在填充 SQL 模板时,应该更加小心。应对 SQL 注入问题,只是需要在编程方面多加小心。很明显,这种方式算不上解决方案。人们仍然在校验用户输入值方面出现错误,最终接受了带有恶意的用户输入值。换句话说,单凭我们所有人更努力地工作,是无法根本解决这种问题的。

真正的解决方案在于,SQL 语句本身的任意性,并要求所有现存不变量都符合任意的等价结构的规则。无需程序员的干预,就能自动完成。

攻击者不得不符合一种未知的、任意的 brainfuck 语法的规则。想要符合一组未知的规则,将是难以解决的问题。因此,攻击者通常无法得手。

希望本文所述对大家MySQL数据库计有所帮助。

mysql注入实例获取答案_本文实例讲述了MySQL解决SQL注入的另类方法。分享给大家供大家参考,具体如下:问题解读我觉得,这个问题每年带来的成本可以高达数十亿美元了。本文就来谈谈,...相关推荐

  1. mysql5无法注入_MySQL解决SQL注入的另类方法详解_MySQL

    本文实例讲述了MySQL解决SQL注入的另类方法.分享给大家供大家参考,具体如下: 问题解读 我觉得,这个问题每年带来的成本可以高达数十亿美元了.本文就来谈谈,假定我们有如下 SQL 模板语句: se ...

  2. 英国将强制互联网公司遏制外国政府发布假信息,违法者或被罚款数十亿美元...

    NEW 关注Tech逆向思维视频号 最新视频→[人工智能打算毁灭人类?] 7月5日消息,英国计划对即将出台的全新网络安全法进行修正,强制社交媒体和搜索引擎等应用程序的所有者遏制"外国发布的虚 ...

  3. mysql导出权限授权_本文实例讲述了mysql数据库创建账号、授权、数据导出、导入操作。分享给大家供大家参考,具体如下:1、账号创建及授权grant all privileg...

    本文实例讲述了mysql数据库创建账号.授权.数据导出.导入操作.分享给大家供大家参考,具体如下: 1.账号创建及授权 grant all privileges on *.* to 'yangxin' ...

  4. ChatGPT 的背后:OpenAI 创始人Sam Altman如何用微软的数十亿美元打造了全球最热门技术...

    内容来自 MoPaaS 编者按: ChatGPT产生的影响还在继续,ChatGPT 以及其创造者 OpenAI 背后的故事却鲜为人知.OpenAI 是怎样偏离其初心坚持商业化?凭什么 Altman可以 ...

  5. 开源激荡 30 年:从免费社区到价值数十亿美元公司

    开源起始于边缘活动,活跃于社区,30 年来一路进化,无数的企业在开源项目的基础上拔地而起,今天,开源商业已经迎来了最好的发展机会. 演讲 | Peter Levine,A16Z Partner Edi ...

  6. 唯链瞄准数十亿美元中国宠物食品可追溯性市场

    上海2021年8月13日 /美通社/ -- 面对全球疫情带来的整体市场低迷,中国宠物食品行业却逆势显著增长.2020年估值为10.82亿美元,预计到2026年将达到14.749亿美元.尽管中国的宠物食 ...

  7. 国委派在华产权专员 谋求数十亿美元利益

    出处:PConline 导语:谁将站在盗版CD和数十亿美元的损失之间?Mark Cohen-美国的新任驻华"知识产权专员".但这不是一个人的任务. 本周一开始,好莱坞在北京将有一名 ...

  8. 软银投资工业软件公司OSIsoft 价值数十亿美元

    6月1日消息,据国外媒体报道,软银集团于当地时间周三表示,将收购OSIsoft的少数股权. OSIsoft是一家私人控股的工业软件制造商,其软件可用于管理工厂.OSIsoft是所谓的"物联网 ...

  9. c语言顺序表的例子,本文实例讲述了C语言实现的顺序表功能。分享给大家供大家参考,具体如下:seqlist.h#ifndef __SEQLIST_H__#define __...

    本文实例讲述了C语言实现的顺序表功能.分享给大家供大家参考,具体如下: seqlist.h #ifndef __SEQLIST_H__ #define __SEQLIST_H__ #include # ...

最新文章

  1. linux top命令查看内存及多核CPU的使用讲述 [转]
  2. 【PTA 天梯赛】L2-1 分而治之(结构体存边)
  3. asp开发中存储过程应用全接触 _asp技巧
  4. PL/SQL如何设置 窗口列表默认显示
  5. iheatmapr包:可交互的热图绘制方法
  6. 一:ActiveMQ知识整理
  7. 直接插入排序的python实现
  8. java 多线程4: java线程的优先级
  9. 苹果无人车野心越发明显,再挖一名特斯拉工程师,或负责汽车软件UI
  10. 为什么能上QQ而不能上网
  11. 主函数中冒泡法 VS 自定义函数选择法
  12. 海康/大华/宇视等网络摄像头云台控制功能探测方法解析
  13. 872. 叶子相似的树 / 剑指 Offer 33. 二叉搜索树的后序遍历序列 / 剑指 Offer 34. 二叉树中和为某一值的路径 / 剑指 Offer 35. 复杂链表的复制
  14. Can not import avx core while this file exists
  15. [项目记录]用vue-electron搭建pc网易云音乐程序(2)——搭建基本页面
  16. PTA团队练习题C语言
  17. mac 升级php 到7,macOS High Sierra 10.13升级PHP到7.3并创建Laravel 7项目
  18. 海南省教育厅关于普通高中综合实践活动课程实施的指导意见
  19. 查看进程名称 linux,在Linux系统服务器按名称查找进程的命令
  20. 第一章 计算机网络和因特网

热门文章

  1. PCL common中常见的基础功能函数
  2. PCL点云特征描述与提取(2)
  3. 在ubuntu下设置eclipse开发STM32等嵌入式设备
  4. 在CentOS 6.3 64bit上安装ActiveMQ 5.15.9实录
  5. 在Ubuntu 14.04 64bit上安装百度云Linux客户端BCloud
  6. C语言网络编程:bind函数详解
  7. vectorbool不是容器
  8. 排序算法之直接插入排序
  9. caffe prototxt分析
  10. UVALive2678:Subsequence