为什么 OWASP ZAP 检测 SQL 注入?

问题描述

我想知道为什么 Owasp ZAP 在我的登录页面上检测到潜在的 sql 注入。我调用 API 来连接我的用户

PHP slim API 代码

$sql = "SELECT id,idGroup,idTeam,lastName,firstName,isLogged,login,phoneNumber,webrtc FROM users WHERE enable = 1 AND login = :login AND password = :password";
       
$db = new db();
$db = $db->connect();

$stmt = $db->prepare($sql);
$userPass = md5($password);
$stmt->bindParam(':login',$login);
$stmt->bindParam(':password',$userPass);

$stmt->execute();
$user = $stmt->fetchAll(PDO::FETCH_OBJ);

登录页面

$login = $_POST['username'];
$password = $_POST['password'];

$client = new GuzzleHttp\Client();
$response = $client->request('POST',$apiUrl . 'agent/login',[
   'form_params' => [
       'login' => $login,'password' => $password,'ipAddress' => $_SERVER['REMOTE_ADDR'],]
]);

$data = json_decode($response->getBody(),true);

if (isset($data[0]['id']) && $data[0]['id'] > 0) {
   $_SESSION['fullName'] = $data[0]['firstName'] . ' ' . $data[0]['lastName'];
   $_SESSION['idGroup'] = $data[0]['idGroup'];
   $_SESSION['idTeam'] = $data[0]['idTeam'];
   $_SESSION['idUser'] = $data[0]['id'];
   $_SESSION['login'] = $data[0]['login'];
   $_SESSION['phoneNumber'] = $data[0]['phoneNumber'];
   $_SESSION['webrtc'] = $data[0]['webrtc'];

   //Get roles for user
   $response = $client->request('GET',$apiUrl . 'web/permissions/' . $login);
   $data = json_decode($response->getBody(),true);

   foreach ($data as $roles) {
       $_SESSION['roles'][$roles['bit']] = $roles['name'];
   }

   echo "<script>window.open('index.PHP','_self')</script>";

}

我所有的 API 都使用准备好的语句和参数化查询

这是 Owasp ZAP 警报:

使用布尔值成功操作页面结果 条件 [ZAP" AND "1"="1" -- ] 和 [ZAP" AND "1"="2" -- ] 被修改的参数值没有从 HTML 输出删除 出于比较的目的,返回原始数据 参数。

解决方法

如果表单提交的响应页面包含用户指定的表单字段值,则可能会发生这种情况。例如,如果您正在登录您的用户并使用“用户名”字段的值来问候用户,但不是从数据库中而是从请求变量中提取它。 SQL 注入不会发生,但扫描脚本假定您在数据库中存储了未经清理的值,而您只是使用用户提供的值而不是您存储在数据库中的值。希望这是有道理的。