【问题标题】:In this case, why '--+' the comment style of mysql can work?在这种情况下,为什么 '--+' mysql 的注释样式可以工作呢?
【发布时间】:2016-08-07 18:37:32
【问题描述】:

以下示例来自 sqli-lab。在 MySQL 的 doc(comment) 中,“--”(双破折号后跟至少一个空格)表示一行的注释。它确实在某些情况下有效。

我的问题是它在此处的示例中是如何工作的,为什么它可以列出“用户”表的所有记录。你能给出一些关于它的机制的想法吗?谢谢!

mysql> select username, password from users where username = '' --+ '';
+----------+------------+
| username | password   |
+----------+------------+
| Dumb     | Dumb       |
| Angelina | I-kill-you |
| Dummy    | p@ssword   |
| secure   | crappy     |
| stupid   | stupidity  |
| superman | genious    |
| batman   | mob!le     |
| admin    | admin      |
| admin1   | admin1     |
| admin2   | admin2     |
| admin3   | admin3     |
| dhakkan  | dumbo      |
| admin4   | admin4     |
+----------+------------+

【问题讨论】:

  • “它在某些情况下确实有效。”你能澄清一下吗?这在哪里不起作用,什么时候不起作用?
  • @FrankerZ 真的很清楚,如果您尝试 .. --+ 返回所有行 .. (似乎是一种奇怪的行为)但 --+ 不是评论序列
  • 我已经发布了对您问题的可能解释

标签: mysql comments inject


【解决方案1】:

其实@scaisEdge是对的,MySQL(interactive cmdline)中的'--+'不是注释,这种用法通常用于URLencoding(查询部分的空格可以编码为'+'或'% 20')。

在这种情况下,'--+' 只是两种类型的运算符:plus&minus,以及一种 - 和一种 + 偏移量。所以这个序列等于:

select username, password from users where username = '' - '';

Original:
mysql> select username, password from users where username = '' --+ '';
+----------+------------+
| username | password   |
+----------+------------+
| Dumb     | Dumb       |
| Angelina | I-kill-you |
| Dummy    | p@ssword   |
| secure   | crappy     |
...

Now:
mysql> select username, password from users where username = '' - '';
+----------+------------+
| username | password   |
+----------+------------+
| Dumb     | Dumb       |
| Angelina | I-kill-you |
| Dummy    | p@ssword   |
| secure   | crappy     |
...

你可以看到结果是一样的。

其次,'' 在这里等于 INTEGER 0。 在 MySQL 中,任何没有有效整数的字段都将等于 0。

mysql> select '' = 0;
+--------+
| '' = 0 |
+--------+
|      1 |
+--------+

mysql> select '0s28' = 0;
+------------+
| '0s28' = 0 |
+------------+
|          1 |
+------------+

mysql> select '8s28' = 0;
+------------+
| '8s28' = 0 |
+------------+
|          0 |
+------------+

mysql> select '8s28' = 8;
+------------+
| '8s28' = 8 |
+------------+
|          1 |
+------------+

====Type Conversion====

mysql> select '12s' + 3;
+-----------+
| '12s' + 3 |
+-----------+
|        15 |
+-----------+

mysql> select 's52s6' + 3;
+-------------+
| 's52s6' + 3 |
+-------------+
|           3 |
+-------------+

mysql> select 's8' + 3;
+----------+
| 's8' + 3 |
+----------+
|        3 |
+----------+

所以 '' - '' 意味着 0 - 0 仍然是 0

虽然 USERNAME 列没有一个以有效数字字符(非 0)开头的名称,但所有名称都等于 0 并匹配条件 'where username = 0'

mysql> select 'Dumb' = 0;
+------------+
| 'Dumb' = 0 |
+------------+
|          1 |
+------------+

为了验证这个结论,我们可以将用户名以整数开头的记录插入,例如“4love”。您将看到除新记录外的所有记录都已列出。

这里有一个类似的问题: mySQL returns all rows when field=0

【讨论】:

    猜你喜欢
    • 2019-11-08
    • 1970-01-01
    • 1970-01-01
    • 2013-10-17
    • 1970-01-01
    • 2020-01-26
    • 2016-11-06
    • 1970-01-01
    相关资源
    最近更新 更多