GET - 基于错误 - 过滤注释
首先看到GET方式,要习惯的打一个半角英文单引号。我们这里打一下试试 ?id=1'
这时候发现报错了(显示多了一个单引号,如上图), 但是要是按照我们之前使用联合查询获取额外信息,就要注释掉后面的『’ LIMIT 0,1』,但是这里的代码却过滤掉了注释。
所以我们先要闭合’limit的单引号 使用语句 ?id=1' or 1=1 or ' 发现已经可以正常显示用户名和密码了,但由于我们只是闭合了单引号而没有注释掉limit,所以还不能使用联合查询,此时考虑使用爆破注入,可构造语句为?id=1' or extractvalue(1,concat(0x7e,database())) or ' 这个就是爆破语句,之后上传语句 就可以得到数据库名了
第二种:使用联合注入 构造语句:?id=1' order by 3;%00 (;%00可以当做注释符号,用来注释掉后面的' limit 0,1等等)
用上述语句来判断显示位,然后就可以使用联合查询注入了,例如:?id=-1' union select 1,2,3;%00 替换掉中间的order by换成其他的查询语句都是ok的
GET - 基于错误 - 过滤OR&AND - 单引号
这次还过滤了and和or,那我们就无法进行布尔判断了。此处可以使用替代的办法,即使用『&&』替代『and』,『||』替代『or』。此处还有个问题,就是preg_replace按照代码中的用法是无限次替换的,但实际中却可以使用『oorr』这样来绕过,这不科学。
GET - 基于错误 - 过滤OR&AND
这和上面的差不多,但是这次使用『oorr』这样的方式试一下。
GET - 基于错误 - 过滤空格和注释 - 单引号
看到这个名单有没有心寒的感觉?SQL语句中函数之间是要有空格的,如『and union』不能写成『andunion』,但是函数和变量中可以去掉空格,如『2 = 1』可以写成『2=1』。这个黑名单屏蔽了空白字符以及斜杠星号,意味着用『/**/』伪装成空格的日子一去不复返了。因为空格只是隔开前后函数,有没有其他的符号也能达到同样的效果 所以,可以使用+来代替空格来连接union与select 例如:union+select