【问题标题】:How to simulate SQL injection in NodeJS mysql如何在 NodeJS mysql 中模拟 SQL 注入
【发布时间】:2018-07-19 01:04:23
【问题描述】:

我正在使用 NodeJSmysql 来处理 SQL 数据库。

以学校为例,我想模拟 SQL 注入

我用可能的SQL injection写代码:

const mysql = require('mysql')

const connection = mysql.createConnection({
    host: settings.DB_MYSQL_HOST,
    user: settings.DB_MYSQL_USER,
    password: settings.DB_MYSQL_PSW,
    database: settings.DB_MYSQL_DB,
})

let sql = 'DROP TABLE user;'
connection.query('DELETE FROM todos WHERE id = \'' + sql + '\'', (error) => {
                if (error) {
                    res.json({ res: error })
                    console.log('SQL ERROR')
                    console.log(error)
                    throw error
                }
                this._sendSucc(res)
})

但是SQL injection 不起作用。我想攻击表名'user'。

哪里出了问题?我没有使用准备语句。

你能给我一个SQL injection的例子

【问题讨论】:

    标签: mysql node.js sql-injection


    【解决方案1】:

    您必须更改更新语句,使其成为两个工作语句。这应该可以解决问题:

    let sql = '\';DROP TABLE user;-- '
    

    它正在关闭引用,添加有效负载,并使用 -- 和一个空格来删除该行的其余部分。

    然而,正如Stacking queries in node.js mysql 所证明的那样,node.js-mysql 受到保护,不会在 sql 语句中包含多个查询。 你能做的最大的破坏就是修改delete语句删除表的所有行。

    let sql = '\' OR 1=1 -- '
    

    或者你可以打开多个语句,这看起来像是在作弊:

    const connection = mysql.createConnection({
        host: settings.DB_MYSQL_HOST,
        user: settings.DB_MYSQL_USER,
        password: settings.DB_MYSQL_PSW,
        database: settings.DB_MYSQL_DB,
        multipleStatements: true,
    })
    

    【讨论】:

    • 我收到一个 sql 错误 { Error: ER_PARSE_ERROR: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '''';DROP TABLE user;--''' at line 1 但 db 仍然“满”
    • 在 -- 后面加一个空格再试一次
    【解决方案2】:

    你根本不是在“注射”。您所做的不是为您的DELETE 语句提供id,而是提供字符串DROP TABLE user;。您的最终语句(MySQL 将看到的语句)如下所示:

    DELETE FROM todos WHERE id = 'DROP TABLE user;'
    

    发生的情况是,(假设 id 是整数或其他类型)MySQL 隐式地将字符串转换为数字。由于正文开头没有数字,所以结果为0。MySQL最终执行的语句是

    DELETE FROM todos WHERE id = '0'
    

    您希望通过 SQL 注入实现的目标是拥有两条语句。所以首先你完成 MySQL 期望的语句,然后添加你的语句。您希望 MySQL 执行的语句类似于

    DELETE FROM todos WHERE id = 'foo'; DROP TABLE user;
    

    所以你的字符串需要看起来像

    let sql = "foo'; DROP TABLE user;-- "
    

    添加最后的--,以注释掉结尾的' 以及后面可能出现的其他内容。

    【讨论】:

      猜你喜欢
      • 2016-01-13
      • 1970-01-01
      • 1970-01-01
      • 2018-12-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多