在 ORACLE SQL 中,比较 2 个字符串存在问题(“E”>“e”表示 true)

In ORACLE SQL, there is a problem with comparing 2 string ('E' > 'e' says true)

提问人:Woo 提问时间:11/2/2021 最后编辑:Woo 更新时间:11/3/2021 访问量:146

问:

目前,我正在研究 WebSecurityAcademy(https://portswigger.net/web-security/sql-injection/blind) 上 SQL DBMS 的 SQL 注入,特别是关于使用条件响应的盲 SQL 注入。首先,目标网站如下图所示 抱歉无法发布图片...点击此链接

现在,网络服务器提供了一个名为 TrackingId 的 cookie(它似乎是一个具有随机值的会话 cookie),我使用这个 cookie 进行盲目 SQL 注入。

第一次,我输入了 TrackingId cookie 值。重新加载页面后,没有任何变化,所以我用 修改了 cookie 值。重新加载后,我可以看到网页输出“欢迎!1' OR 2=1 -- %201' OR 1=1 -- %20

因此,我得出结论,TrackingId 的 SQL 查询将类似于 .(好吧,忽略表名 User 和列名 TrackingId...这只是一个猜测)SELECT ... FROM User WHERE TrackingId='{injection point}' ...

之后,我尝试获取管理员的密码(表中有用户名=“管理员”...它被给予了..)通过使用 ORACLE 中的字符串函数(我得出结论 DBMS 是 ORACLE,因为它可以将字符串与“||”运算符连接起来)。users

在试用之前,我输入(仅用于测试)TrackingId Cookie,期望它会返回 false(对于 ASCII 值,“E”<“e”)。但是,在重新加载页面后,网页输出“Welcome!”,因为“E”>“e”条件为真!!1' OR 'E'>'e

我对此感到非常困惑。据我所知,在ORACLE中,字符串的比较是基于ASCII值的......但是,为什么“E”<“e”条件成立????

  • 我后来也尝试了“D”<“e”,它说这是真的
  • 我也尝试了“F”>“e”,它说这是假的
  • 我也试过 'E' = 'e',它说它是假的

所以,总而言之,它说 'D'<'e' != E<'F' ????这是怎么发生的???

以下是一些示例图片

字符串 oracle 比较 sql-injection

评论

1赞 diiN__________ 11/2/2021
正如您所说,比较是基于 ASCII,而 (069) 的 ASCII 代码实际上低于 (101)。Ee
2赞 Alex Poole 11/2/2021
你的标题说“E”>“e”说“true”;您的问题文本似乎混淆了逻辑:“重新加载页面后......“E”<“e”条件为真“和”为什么'E'<'e'条件成立”。因此,目前尚不清楚您实际在测试或看到什么。(所有注入的东西都是无关紧要的 - 你可以通过直接查询 dual 和更改 nls_comp/nls_sort 来证明这一点,尽管我看不到与标题和三个项目符号相匹配的组合。
1赞 astentx 11/2/2021
文档中所述:在二进制排序规则(默认设置)中,Oracle 将字符值与二进制值进行比较。要查看二进制值,您可以使用: 字节将显示在 之后。ASCII 代码的比较是大多数代码页在前 128 点覆盖 ASCII 的结果select dump('e', 16) as "e", dump('E', 16) as "E" from duallen=..:
0赞 Woo 11/3/2021
很抱歉让您感到困惑...我编辑了问题...从“E”<“e”条件为真到“E”>“e”条件为真......
0赞 Woo 11/3/2021
如果你没事,我会发布我的照片

答: 暂无答案