DVWA—SQL Injection实例
1. low等级
进入界面后,可以看到它是一个ID的查找内容的输入框,我们输入数字1、2可以看到是从后端返回数据库相应的数据,但是我们作为SQL注入的最终目标是得到更多有关的信息,所以我们需要通过构造payload来进行操作。
在此之前我们需要判断它是属于哪一方面的漏洞,通过sql-lab的博客介绍相关sql注入类型来对它的漏洞类型进行判断。漏洞类型大致可以初定为数字型和字符型。
其实所有的类型都是根据数据库本身表的类型所产生的,在我们创建表的时候会发现其后总有个数据类型的限制,而不同的数据库又有不同的数据类型,但是无论怎么分常用的查询数据类型总是以数字与字符来区分的,所以就会产生注入点为何种类型。
数字型判断:
用 and 1=1 和 and 1=2 来判断:
1.Url 地址中输入 http://xxx/abc.php?id= x and 1=1 页面依旧运行正常,继续进行下一步。
2.Url 地址中继续输入 http://xxx/abc.php?id= x and 1=2 页面运行错误,则说明此 Sql 注入为数字型注入。因为逻辑判断错误。1并不等于2。
字符型判断
概述:当输入的参数为字符串时,称为字符型。字符型和数字型最大的一个区别在于,数字型不需要单引号或其它特殊符号来闭合,而字符串一般需要通过特殊符号,如单引号来闭合的。
如果一条后台语句为:$sql=“SELECT * FROM users WHERE id='1 ’ LIMIT 0,1”,这里的“1”被加上了单引号,使我们无法查询
我们可以通过在URL地址栏输入?id=1’ 来判断是否是字符型注入,
输入?id=1’,这时候1后面的单引号把原本语句的一对单引号隔开了,变成了?id=‘1’',多出了一个单引号,正常来说,包裹着id变量的单引号是成对,这样的语句结构没有问题的,多出了一个单引号就报错了破坏了原本的sql语句结构,并且这条语句被带进数据库进行查询,数据库由于无法处理这条 ‘非正常’ 的语句,所以也就报错了,由于数据库和前端页面是交互的,所以前端页面也会出现异常或者报错,会报错说明这条语句成功被带进数据库查询,存在字符型注入。
所以通过构造不同类型的payload可以知道这个是属于字符型注入漏洞。
1 and 1=2
1’and ‘false
从上面得到我们注入的类型是属于字符型我们就可以考虑整体注入思路,因为SQL注入最终的目标都是将数据库进行脱库然后对数据进行存储使用。
然后根据正常的SQL表的构成需要分别获取数据库库名、数据库对应的表名、数据库表名对应的列名。
① 获取库名
我选择的是union联合注入方式
1’ union select 1,database()#
得到表名为dvwa
② 获取表名
1’ union select 1,group_concat(table_name)COLLATE utf8_general_ci from information_schema.tables where table_schema=database()#
③ 获取列表名
1’ union select 1,group_concat(column_name)COLLATE utf8_general_ci from information_schema.columns where table_name=‘users’#
可以看到表中的列表共有如下这么多
得到所有列表我们就可以进行脱库处理了
例如我们只对users数据库中的用户名字(ID),账号密码感兴趣
1’ or 1=1 union select group_concat(user_id,first_name,last_name),group_concat(user,password) from users #
可以看到我们在获取到的user跟password中password是加密的,我们可以去试着查看多个user的password的长度如果相同我们可以推断这个加密方式为hash加密即将密码设为同一长度的密文形式。
2. medium等级
因为在medium等级中在页面输入中将id的值输入变成了选择项的输入框来进行数据传递,所以我们需要用到burpsuits工具进行操作。然后可以看到在medium等级中使用了mysqli_real_escape_string()函数,通过查找可以知道这是一种过滤特殊字符类似于/n、’这类字符的操作,所以这就应该是一个数字型注入漏洞。
根据上面的判断我们就可以开始进行与low等级一样的流程操作了
① 获取数据库库名
union select 1,database()#
② 获取表名
union select 1,group_concat(table_name)COLLATE utf8_general_ci from
information_schema.tables where table_schema=database()#
③ 获取列表名以及脱库操作
or 1=1 union select group_concat(user_id,first_name,last_name),group_concat(user,password) from users #
3. high等级
在high中它使用了LIMIT1这样的函数来对它进行限制,但是通过查找相关资料可以知道可以通过#来实现对它的SQL注入所以,我们可以直接套用low等级中的语句实现SQL注入,因为前面阶段都相同所以我在这里直接演示拉取数据的操作。
4. impossible等级
在impossible等级中有点大道至简的感觉了,因为我们查询的是通过id值来进行查找所以我们直接使用is_numberic()函数对输入的id是否为数字进行判断直接就杜绝了一切SQL注入的可能出现。
总结
在SQL injection注入中,我们可以选择union联合注入也可以像其他博主那样选择error注入方式,虽然各有千秋本质都是想要将数据库脱库对想要的数据进行操作,所以方法并不唯一。