mysql - 如何在NodeJS mysql中模拟SQL注入(inject)

标签 mysql node.js sql-injection

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

对于学校示例,我想模拟 SQL 注入(inject)

我编写的代码可能带有SQL 注入(inject):

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 注入(inject) 不工作。我想攻击表名“用户”。

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

你能给我一个SQL注入(inject)的例子吗

最佳答案

你根本不是在“注入(inject)”。您所做的只是为您的 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 注入(inject)实现的是拥有两个语句。所以首先你完成 MySQL 期望的语句,然后你添加你的语句。您希望 MySQL 执行的语句类似于

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

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

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

添加了最后的 --,以注释掉结尾的 ' 以及可能跟在后面的内容。

关于mysql - 如何在NodeJS mysql中模拟SQL注入(inject),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48685854/

相关文章:

php - 如何防止 PHP 中的 SQL 注入(inject)?

php - 错误 1148 MySQL 此 MySQL 版本不允许使用的命令

mysql - 如何获取使用 Mysql 排序的不同格式化日期列表

node.js - 为什么向 OPTIONS 路由添加 CORS header 不允许浏览器访问我的 API?

javascript - 像异步 waterfall 一样执行 forEach

http - =3D 在恶意 URL 中的含义

php mail() 同时保存数据到MYSQL

php - MySQLI通过socket连接本地服务器错误

javascript - 如何使用 node.js 和 sequelize 更新对象中的值

java - 在单个 SQL 语句中插入/更新/删除多个表