Oracle SQL盲注场景下字符串大小写比较不符合ASCII规则问题
你遇到的大小写字符比较不符合ASCII规则的问题,是Oracle数据库的NLS字符排序比较规则导致的,和默认用ASCII值比较的逻辑不同。
具体原因
Oracle的字符串比较规则由两个全局/会话级参数控制:
NLS_SORT:指定字符串排序的规则,默认通常是和数据库所在地区对应的语言排序规则,而非二进制ASCII排序NLS_COMP:指定字符串比较时是否遵循NLS_SORT的配置
你测试得到的D < e < E < F的排序结果,是语言排序规则下的典型表现:排序时首先按字母的语义顺序排列(即不区分大小写先排基础字母顺序,D < E < F),同一字母的小写字符优先级高于大写字符,所以小写e排在大写E前面,最终就得到了你观察到的比较结果。
盲注场景规避方案
要避免排序规则干扰注入判断,直接用ASCII值做数值比较即可,完全不受排序规则影响:
- 比如要判断目标字符是不是小写
e,可以写ASCII(SUBSTR(目标字段, 偏移量, 1)) = 101 - 要判断是不是大写
E,对应ASCII值为69,直接比较数值结果不会有歧义。
如果需要强制使用二进制排序比较字符串,也可以用NLSSORT函数显式指定排序规则:NLSSORT('E','NLS_SORT=BINARY') > NLSSORT('e','NLS_SORT=BINARY')的返回结果为FALSE,符合ASCII的比较逻辑。
内容的提问来源于stack exchange,提问作者Woo
相关产品推荐
相关产品推荐

