UPDATE 语句中的 PHP SQL 注入漏洞

信息安全 php sql注入 脆弱性 mysql
2021-08-22 06:02:48

以下面的 SQL 查询为例:

UPDATE `sqlinjection2` SET `$vote`=`$vote`+1

我们的目标是在一个请求中将投票计数增加不止一个。

我们无法访问代码本身。

如果我们可以向 $vote 发送一个值,我们可以发送:

vote`=1, `vote`=X+`vote

所以查询看起来像这样:

SET `vote`=1, `vote`=X+`vote`=`vote`=1, `vote`=X+`vote`+1;

说明: X 是一个数字。

我的问题是,这部分是如何工作的?

`vote`=X+`vote`=`vote`=1

我知道它将列投票设置为 NULL,但这是为什么呢?

1个回答

您给出的示例导致返回值 0(非 NULL)。这是因为您构建的查询最终成为布尔比较。=UPDATE语句的分配部分(S)内是比较运营商,而不是一个赋值运算符如你所期望的。

注入vote`=1, `vote`=10+`vote导致查询UPDATE mytable SET /*part1*/`vote`=1, /*part2*/`vote`=10+`vote` = `vote`=1, /*part3*/`vote`=10+`vote` + 1解构为此(为清楚起见,使用 == 作为比较运算符:

PART1:  
vote = 1

PART2: 
vote = ((10+vote) == vote) == 1
vote = ( 11 == vote ) == 1 
vote = ( 11 == 10 ) == 1 
vote = FALSE == 1
vote = FALSE (0) 

PART 3:
vote = 10 + vote + 1 
vote = 10 + FALSE (0) + 1 
vote = 11 

更有趣的注入是只设置投票列,然后使用评论结束查询:

$vote = "vote` = 1337 -- and we don't care about the rest";
// results in: 
// UPDATE mytable set `vote` = 1337 -- and we don't care about the rest` = `vote` = 1337 -- and we don't care about the rest` + 1

MySQL 将在第一次出现 -- 作为注释后忽略所有内容,并将值(实际上是表中的所有投票值)设置为 1337。