问题描述
我想知道为什么 Owasp ZAP 在我的登录页面上检测到潜在的 sql 注入。我调用 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 注入不会发生,但扫描脚本假定您在数据库中存储了未经清理的值,而您只是使用用户提供的值而不是您存储在数据库中的值。希望这是有道理的。