首页
社区
课程
招聘
[翻译]SQL注入新手教程(第一部分)
发表于: 2017-6-6 02:15 24403

[翻译]SQL注入新手教程(第一部分)

2017-6-6 02:15
24403

SQL注入是一种攻击者通过网页将SQL命令注入到SQL语句中的技术。攻击者可以绕过认证,访问、修改和删除数据库中的数据。在某些情况下,SQL注入甚至可被用于执行操作系统级的命令,攻击者可能对防火墙后的网络带来破坏性更大的攻击。

常用数据库

SQL注入类型

SQL注入开发技术

常见注入点——应用程序和数据交互的地方

常用SQL语句

常用SQL注入字符

数据库指纹

我们可以通过分析错误信息找出数据库类型。

首先从这里下载SQL注入测试平台,并且利用xampp搭建开放SQL注入实验平台。(译者注:可参考这篇博客


点击 Setup/reset Database for labs



想象一个需要输入用户名和密码的登录页面,当你输入用户名和密码后,后端就会产生并执行一条查询(SQL查询),登录后该查询结果会被显示在我们的主页。

例如:

Username - Raj

Password - Chandel

那么后端查询看起来是这样的

SELECT * FROM table_name WHERE username='Raj' AND password='Chandel';

这完全取决于开发者是如何将参数值封装在SQL查询中的,可以是单引号、双引号和引号与括号结合使用等。所以查询可能看起来会是这样的

SELECT * FROM table_name WHERE username='Raj' AND password='Chandel';

SELECT * FROM table_name WHERE username=('Raj') AND password=('Chandel');

SELECT * FROM table_name WHERE username="Raj" AND password="Chandel";

SELECT * FROM table_name WHERE username=("Raj") AND password=("Chandel");

或者是开发者选择的任何形式。这里以第一种查询为例进一步解释。

问:如果输入的用户名为 Raj' 会发生什么?

答:如果输入的用户名为 Raj' ,后台查询看起来会是这样的

SELECT * FROM table_name WHERE username='Raj'' AND password='Chandel';

由于多了一个引号,所以此处有语法错误。

问:怎样修复这条查询?可以修复吗?

答:上面的查询可以修复,即使输入的用户名仍为 Raj' 也可以修复。可以通过将 Raj' 后面的查询全部注释掉来修复。所以有效的查询会是这样的

SELECT * FROM table_name WHERE username='Raj'

这条查询语法正确

问:如何将剩余的查询注释掉?

答:这取决于后端的数据库类型。一般情况下使用 --+ 或者 # 。如果输入用户名 Raj'--+ ,完整的后端查询看起来是这样的

SELECT * FROM  table_name WHERE username='Raj'--+' AND password='Chandel';

但是数据库只会读取并执行这条查询

SELECT * FROM  table_name WHERE username='Raj'

--+ 后面的所有东西都被注释掉了,不会翻译为这条查询的一部分。这就是SQL注入。使用恶意的输入改变后端查询。

我不知道你是否对此怀有疑问,反正我当时学习的时候,有这样一个疑问:根据上面的带有注释的查询,我们不需要一个有效的密码就可以登录了吗?

是的,如果开发者没有采取防范SQL注入的措施,并且以上面方式实现查询,那么只有用户名就可能成功登录。

感到很疑惑?别急。接下来的文章我会向你展示具体过程。现在准备好实验平台,开始吧。

点击 lesson 1 并在URL中添加 id 作为参数


一直增大 id 的值(id=1, id=2...)。当 id 的值大于14,你会发现得到的是一个没有用户名和密码的空白页面,这意味着数据库只有14条记录。

后端查询一定是像这样的

SELECT * from table_name WHERE id='1';

或者

SELECT * from table_name WHERE id=('1');

或者

SELECT * from table_name WHERE id="1";

但是我们并不知道开发者具体是怎样封装 id 参数值的。所以得先找封装形式。

输入 id 的值为 1' 来破坏查询。

哈哈,现在我们得到了SQL语法错误提示。因为这个错误提示将会帮助我们找出后端查询,并且我们也会使用这个错误提示来进行SQL注入,所以这种类型的SQL注入又被称为基于错误返回的SQL注入


现在我们必须看着屏幕截图来分析这个错误。


你也可以通过转义字符来找出 参数封装形式,在MYSQL中 '\'(反斜杠)被用来转义一个字符。转义一个字符意味着取消该字符的特殊用途。使用转义字符可以得到更清楚的图片。

从上面的屏幕截图中可以清晰地看出后端查询

Less-1    -    SELECT * from table_name WHERE id='our input'

Less-2    -    SELECT * from table_name WHERE id=our input

Less-3    -    SELECT * from table_name WHERE id=('out input')

Less-4    -    SELECT * from table_name WHERE id=("our input")

这里以 Less-1 为例进一步解释。输入 1' 对应的完整的后端查询会是

SELECT * from table_name WHERE id='1'' LIMIT 0,1

这条查询有语法错误,之前我已经解释过如何使它语法正确,

输入 1'--+

或者输入 1'--%20(%20 URL编码为空格)

或者输入 1'%23 (%23 URL编码为 # )

http://localhost/sqlilabs/Less-1/?id=1'--%20

http://localhost/sqlilabs/Less-1/?id=1'%23

http://localhost/sqlilabs/Less-1/?id=1'--+

现在我们既可以破坏查询,又可以修复它的语法错误了。那么下一步干什么呢?接下来我们要努力在引号和 --+ 之间添加查询来获取数据库中的信息。


问:两条SELECT查询可以同时工作吗?

答:不行,我们必须得使用UNION操作符来实现。UNION操作符用于合并两个或多个SELECT语句的结果集。但是有一个前提条件,那就是UNION操作符两边的列数必须相同。由于我们并不知道后端的SELECT查询有多少列,所以首要任务就是找出SELECT查询中使用的列数。为此我们要使用ORDER BY子句。

ORDER BY子句会根据查询中使用的指定列将结果集按照升序或降序排列。例如:

ORDER BY country à 将会根据指定列(country)将结果集的元素按照升序排列。

问题又来了,我们根本不知道指令列的名字啊...

解决办法就隐藏在ORDER BY子句中...

我们会用到ORDER BY 1, ORDER BY 2...。因为ORDER BY 1 会根据在查询中出现的第一个指定列将结果集按照升序(默认)排列。(请注意,ORDER BY 1 不是根据表的第一列来排列结果集,而是按照查询中出现的的第一个指定列将结果集按照升序排列)

现在来试一下吧。

http://localhost/sqlilabs/Less-1/?id=1' order by 1 --+ 正确


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 4
支持
分享
最新回复 (22)
雪    币: 204
活跃值: (64)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
收藏了,有时间学习一下
2017-6-6 08:21
0
雪    币: 4441
活跃值: (805)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
3
讲的太好了,非常感谢分享
2017-6-6 08:48
0
雪    币: 522
活跃值: (251)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
4
windtrace 讲的太好了,非常感谢分享
谢谢支持。
2017-6-6 09:05
0
雪    币: 6112
活跃值: (1212)
能力值: (RANK:30 )
在线值:
发帖
回帖
粉丝
5
赞!期待后续
2017-6-6 09:36
0
雪    币: 3181
活跃值: (1801)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
Mark
2017-6-6 09:43
0
雪    币: 19
活跃值: (128)
能力值: ( LV9,RANK:146 )
在线值:
发帖
回帖
粉丝
7
sql注入,插眼
2017-6-6 12:51
0
雪    币: 2286
活跃值: (6663)
能力值: ( LV7,RANK:102 )
在线值:
发帖
回帖
粉丝
8
顶个
2017-6-6 15:53
0
雪    币: 1
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
差个真眼,队友看着点
2017-6-6 16:49
0
雪    币: 1696
活跃值: (2297)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
2017-6-6 18:08
0
雪    币: 3
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
很好    要是图片能显示完全  就更完美啦  期待下一篇
2017-6-7 16:34
0
雪    币: 522
活跃值: (251)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
12
fycy 很好 要是图片能显示完全 就更完美啦 期待下一篇
你好,所有图片现已重新上传,请再查看一下。之前因为图片是外链,需要fq才能正常显示。
2017-6-8 11:48
0
雪    币: 3
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
多谢        下一篇好久出呀
2017-6-11 13:00
0
雪    币: 522
活跃值: (251)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
14
fycy 多谢 下一篇好久出呀
下一篇时间未知(看原作者的心情吧:P),不过我们会在原文出来后的最短时间内进行翻译的。
2017-6-11 21:05
0
雪    币: 1102
活跃值: (124)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
那个-%20和下面的--%20
2017-7-10 11:10
0
雪    币: 522
活跃值: (251)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
16
whisper日天 那个-%20和下面的--%20
在URL中空格可以使用  +  或者编码  %20  。MySQL的单行注释方式有两种,一种是使用单独的  '#'  ,另一种是使用两个连字符外加一个空格,即  '--  '  。可以看到文中使用了后一种,即  '--%20'  ('--+')  。至于为什么文中的URL里写的是  '-%20'  ('-+'),而图片中却是  '--%20'  ('--+'),以我的经验来看,这应该是作者不小心打错了:P,因为根据我的实验结果来看  '-+'  并不能得到有效的返回(此处应该有图)。
关于这个问题,我也询问了原作者,不过目前还没得到回复:P,一有消息,我会第一时间通知您。
非常感谢您指出这个问题
2017-7-10 18:15
0
雪    币: 4
活跃值: (28)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
补充一下,免得后来人走弯路,如果文中Setup  Database仅仅出现“SETTING  UP  THE  DATABASE  SCHEMA  AND  POPULATING  DATA  IN  TABLES:  ”后面没有了任何输出好像卡死了,很大可能是由于PHP7不再支持mysql_xxx函数而是支持mysqli_xxx函数所致。目前git  clone得到的代码都是基于PHP5的。如果你像我一样恰好是PHP7,需要把PHP中mysql_xxx系列函数全部换成mysqli_xxx系列函数。具体可参见:http://www.hackingarticles.in/set-sqli-lab-kali/
2017-7-17 00:58
0
雪    币: 522
活跃值: (251)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
18
弟子规 补充一下,免得后来人走弯路,如果文中Setup Database仅仅出现“SETTING UP THE DATABASE SCHEMA AND POPULATING DATA IN TABLES: ” ...
这个问题我遇到过,若是Windows系统,可以改为下载一个XAMPP  for  Windows  5.6.31,不要下载  PHP7  那两个版本。之所以没有提到这个问题就是因为考虑到大家使用的是不同的操作系统,一来不方便叙说,二来我觉得有些坑还是亲自踩一下比较好。
非常感谢您的补充
2017-7-17 12:19
0
雪    币: 1
活跃值: (218)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
自行搭建的php5+apache2.4+mysql的环境,链接不上服务器,SQL语法有错误。怎么办。
2017-7-18 10:15
0
雪    币: 1
活跃值: (218)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
无法连接到数据库:没有选定数据库 
2017-7-18 10:35
0
雪    币: 522
活跃值: (251)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
21
wx_KeyboArd 自行搭建的php5+apache2.4+mysql的环境,链接不上服务器,SQL语法有错误。怎么办。
抱歉,我并没有试过这种方法,所以可能无法解决你的问题。不过,我们的目的是学习知识,正所谓条条大路通罗马,为何不直接下载一个集成环境直接投入学习本身呢?
2017-7-18 13:26
0
雪    币: 300
活跃值: (2477)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
22
mark
2018-2-8 15:29
0
雪    币:
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
23
nice 马飞
2019-10-24 09:40
0
游客
登录 | 注册 方可回帖
返回
//