场景:
系统对传入值使用mysql_escape_string
做了转义处理,不能直接注入,
但取出值时会自动转义,而代码中未再次转义就放到sql语句中使用(非预处理方式),使得间接注入成功,
实际场景:一个含有注册、登录、修改密码功能的系统。
数据库中有一个用户名为admin
,密码为admin
的用户,
现注册一个用户名为admin ' #
,密码为12345
的用户。
登录后将其密码修改为test
,
因为修改密码时会取出反转义后的用户名,代码将其直接用于sql语句,所以导致验证旧密码的部分被忽略执行。
修改密码的sql语句:
UPDATE users SET password = '$pass' WHERE username = '$user' and password = '$cur_pass';
因为未对$user
做转义,所以会执行
UPDATE users SET password = 'test' WHERE username = 'admin'#' and password = '123456';
而#
后的代码会被忽略执行,所以最后等于无附加条件执行把admin
的密码改为test
。