PostgreSQL盲注中pg_sleep拼接加与不加括号的区别
差异核心是PostgreSQL对||运算符的操作数语法要求不同
||是PostgreSQL的字符串拼接运算符,要求左右两侧都必须是标量表达式(返回单个值的运算单元,包括常量、函数调用、合法的标量子查询等),不能直接跟独立的SQL语句。
三个payload的执行逻辑差异如下:
- 第一个payload
' || pg_sleep(10)--pg_sleep(10)本身是PostgreSQL的内置函数调用,属于合法的标量表达式,直接放在||右侧完全符合语法规则,执行时会先触发函数调用产生10秒延迟,再完成字符串拼接,所以可以成功触发延迟。 - 第二个payload
' || (SELECT pg_sleep(10)--
用括号包裹SELECT语句时,这段内容会被识别为标量子查询:PostgreSQL规定,包裹在括号内、仅返回1行1列结果的SELECT语句属于合法的标量表达式,完全可以作为||的操作数。即使这里缺少右括号,后面的--已经注释掉了原SQL剩余的所有内容,解析器仍能正常执行子查询内的pg_sleep(10)调用,因此可以触发延迟。 - 第三个payload
' || SELECT pg_sleep(10)--
没有括号包裹时,SELECT是独立查询语句的起始标记,不属于标量表达式,不能直接放在运算符右侧,整个SQL会直接报语法错误,不会执行到pg_sleep的调用逻辑,因此没有延迟效果。
内容的提问来源于stack exchange,提问作者W2a
相关产品推荐
相关产品推荐

