如何在NodeJS mysql中模拟SQL注入

时间:2018-02-08 12:44:31

标签: mysql node.js sql-injection

我正在使用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

吗?

2 个答案:

答案 0 :(得分:0)

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

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,
})

答案 1 :(得分:0)

你不是"注射"一点都不您所做的只是为id语句提供DELETE,而是提供字符串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;-- "

添加了最终的--,以便注释掉跟踪'以及其他可能跟随的内容。