可以在 WHERE 中执行 UPDATE 子句吗?

Say*_*iss 5 mysql sql sql-injection

我正在学习 SQL 注入,并且构建了一个没有 SQL 注入保护的 Web 应用程序(PHP + MYSQL(5.6))。

简而言之,我的 Web 应用程序使用

SELECT * FROM XXX.USER WHERE user_name='${USERNAME}' AND password='${PASSWORD}'
Run Code Online (Sandbox Code Playgroud)

处理登录(如果该 sql 仅返回 1 行,则登录成功)。

一开始,我发现输入 USERNAMESayakiss' --然后我的 SQL:

SELECT * FROM XXX.USER WHERE user_name='Sayakiss' -- ' AND password='${PASSWORD}'
Run Code Online (Sandbox Code Playgroud)

通过这种方式,攻击者可以在Sayakiss没有密码的情况下登录。

然后我发现了一些更有趣的东西(select子句可以在if函数中)——攻击者输入 USERNAME 作为

Sayakiss' and if((select ascii(mid(z,p,1)) from x.y limit n,1)=c,1,0) -- 
Run Code Online (Sandbox Code Playgroud)

这可以检查字符表的列的第 -th 行p位置的字符的 ascii 是否相等。nzx.yc

如果攻击者登录成功,则他知道字符的 ascii 等于c

所以攻击者可以通过枚举获取我数据库的所有内容!

现在我想知道,如何(如果可能的话)以类似的方式执行更新查询以写入数据库?

Gau*_*Lad 1

我相信,攻击者可以进行更新,可能需要表和字段的名称才能正确运行它。我认为查询会类似于
'Sayakiss'; UPDATE table_name SET field1=new-value1, field2=new-value2 WHERE user_name='Sayakiss'; -- “相关”“更多”