PHP的PDO允许一次执行多个查询,可以通过query()方法或作为预准备语句执行.以下两个示例均有效:
// Two SQL queries
$query = "SELECT * FROM table; DROP table;"
// Execute via query()
$pdo->query($query);
// Execute via prepared statement
$stmt = $pdo->prepare($query);
$stmt->execute();
Run Code Online (Sandbox Code Playgroud)
有没有办法一次将PDO限制为单个查询,就像mysql_query()函数一样?
我正在学习 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。
所以攻击者可以通过枚举获取我数据库的所有内容!
现在我想知道,如何(如果可能的话)以类似的方式执行更新查询以写入数据库?