我正在使用 NodeJS
和 mysql
来处理 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/