如何在一条UPDATE查询中实现SQL注入
跟往常一样,在喝完我最爱的果汁饮料之后,我会习惯性地登录我的Synack账号,然后选择一个应用来进行渗透测试,此时我的“黑客之夜”便正式开始了。
我与很多其他的安全研究人员的习惯一样,我会在待测试目标中随机选择测试点来加载我的XSS Payload(我通常会使用’”img src=x onerror=alert(2) x=来作为Payload,注:开头是一个单引号)。在测试的过程中,我的这个Payload让其中一个测试点返回了一个“500 error”,错误信息提示为“系统遇到了一个SQL错误”,看到了这条错误信息之后,我瞬间就兴奋起来了,因为凭我之前的经验来看,这里很有可能存在一个SQL注入漏洞。
根据系统返回的错误信息来看,错误内容就是我的“用户全名(Full Name)”,所以我赶紧切回刚才的测试界面,然后用test‘test再次进行了一次测试,而此时系统返回的是与刚才一模一样的错误内容,这也就意味着引起系统发生错误的“罪魁祸首”就是Payload中的那个单引号。
了解到这一关键信息之后,我意识到这个应用中所使用的SQL查询语句并没有对单引号进行转义,所以我打算输入两个单引号来看看会发生什么事。所以我这一次输入的是test”test,使我感到震惊的是,这一次系统并没有提示任何的错误信息,但是我的用户全名变成了test’test!
由于这个存在注入点的文本域是用来编辑用户全名(FullName)的,所以我猜这个存在漏洞的查询语句为UPDATE查询。于是我将我的全名改为了’+@@VERSION +’,然后重新加载页面之后,我的用户全名就变成了5.6,而不出意外的话,这个5.6代表的就是后台MySQL数据库的版本号了。
需要注意的是,页面发送的是JSON请求,所以这里的“+”代表的并不是空格符(%20)。
面试的时候,问了一个问题,什么是 防止SQL注入
简单回答:防止——利用即有的应用、功能,将(恶意)SQL命令发送到到后台数据库引擎。
----------详述,及关键要点,有耐心可以看一看--------
-------(下面的论述,要看懂需要有基本的SQL数据库编程和操作知识,本人实际经验,仅供参考)------
1、SQL语言在当前主要用于数据库管理系统软件中,进行数据查询、分析、汇总等等,但一些高级别的数据库管理系统还存在一些非常高级的能力,可以以向它发送SQL指令的方法让它干一些特别的事,甚至出格的事,比如起动某个应用程序等,具体的能力视“数据库管理系统”(也称“数据库引擎”)而定。一些通用的数据库指令有时也能干出一些出格的事,比如创建用户、修改用户(特别是管理员用户)基础信息(比如密码)等。
2、其实,一般而言,绝大多数没有学过电脑与数据库的人是不懂得SQL语言的。也就是说,一般的客户端使用者总是按设计者的预设以点击或输入常规信息的方法来与电脑进行交互,进而将数据传给客户端,客户端合成SQL指令后向“数据库引擎”获取或提交数据。
3、但是因为SQL指令是一种纯文本的字串,在某些特定情况下,操作者输入的字串经客户端合成后,会异化成能让“数据库引擎”误读的指令。
4、举个简单的例子进行说明吧:
----**********************-----
A、设计者预先的设计,用户输入条件,'其他费用'(或别的字串),就查出 ABA02字段 中值为‘其它费用’(或别的字串)的数据。预期合成后发向服务器的字串为:
SELECT * FROM ABA1 A
WHERE ABA02 = '其他费用'
B、但是,输入者并不按预期的输入,而是输入可以合成恶意SQL语句的字串,那么,我们来看看会发生什么事。
合成SQL的代码一般是:
"SELECT * FROM ABA1 A WHERE ABA02 = '"+ 用户输入字串 + "'"
现在用户输入
"其他费用';DELETE [!AY_LS] WHERE '0' = '0"
代入上一行,变成:
"SELECT * FROM ABA1 A WHERE ABA02 = '"+ "其他费用';DELETE [!AY_LS] WHERE '0' = '0" + "'"
最终合成的SQL字串就是:
SELECT * FROM ABA1 A WHERE ABA02
= '其他费用';DELETE [LSTAB] WHERE '0' = '0'
能看懂SQL的人就明白了,这个字串如果发向“数据库引擎”,结果是,查出数据之外,还将LSTAB这个数据表中所有的数据进行了删除,这根本不是设计者预先所需要的。
----**********************-----
5、更多的相关的发挥你可以自个去想,有的SQL语句利用“数据库引擎”的能力可以产生相当可怕的后果。产生这种“SQL注入”的可能,是因为设计者没有客户输入后,合成SQL语句时,可能有“SQL注入”进行猜测与预想。另一方面,“SQL注入”的实现往往需要客户对SQL数据库有相当的了解。
6、防止SQL注入最基本的要点就是,破坏用户的输入可能合成有效的SQL语句的可能。做法有很多,比如限制输入的长度,限制输入特定的字符,对用户输入的数据进行预检,不让用户自由输入,只能输入关键词并转码为特定数值,等等。
7、最常规的,违范的做法就是,不让用户自由输入条件字串,只能输入特定的条件,这是防SQL注入的最好办法。实在需要自由输入的情况下,一定要做预判,不让自由输入的字串能合成有效SQL语句。比如,最简单的禁止中存在“空格”这样,就无法合成有效的无错的SQL语句了,等等!
8、“SQL注入”不但在网页输入中可能存在,在其它的,只要涉及用户输入与“数据库引擎”的情况下,都可能存在!另外,网页提交中,有些非常规的方法可以绕过正常的方式输入,比如直接在浏览器网址处输入特定字串,以直接post数据等。
已知程序有SQL注入漏洞,黑客通过该漏洞得到管理员表和字段,那么他们时怎么知道用户名和密码的
当有注入漏洞的时候..
他们就猜表啊..
其实可以把用户和密码的表名改成 admin984324这样的话.
他们就猜不到了..
就得不到管理员的用户和密码.
但是不过MSSQL就不一样了.
只要有注入..呵呵
就参了.
可以挂马的..
得到计算机管理员权限.
希望可以帮到你
如何进行sql注入?
你,这是黑客的东西啊。不过只对安全性很差的系统有用。
比如你有一个SQL是这样的:SELECT fieldlist FROM table WHERE field = '$EMAIL';
你的原意是让用户输入$EMAIL的值,根据email地址查询,比如tom@tom.com,那么SQL就是
SELECT fieldlist FROM table WHERE field = 'tom@tom.com';
但是我输入anything' OR 'x'='x作为email地址,SQL就变成
SELECT fieldlist FROM table WHERE field = 'anything' OR 'x'='x';了
这个SQL是怎么都会通过的。返回的值是你的表里面的所有内容。这样就达到黑客目的了。不过这东西是比较容易被防止的。
怎么防止黑客SQL注入
有个办法非常简单,安装安全狗就行了要最新版的,他如果能绕过再告诉你其他办法。
0条大神的评论