Запрос возвращает результаты при выполнении его по отдельности, возвращает неоднозначную ссылку, когда я добавляю ее в более крупный запрос

#mysql #sql #security #metasploit

#mysql #sql #Безопасность #metasploit

Вопрос:

Я пытаюсь написать запрос, который суммирует уязвимости по имени хоста и включает информацию об этом хосте. Запрос выполняется в Rapid7 InsightVM

Запрос, возвращающий информацию об активе, выполняется успешно, за исключением того, что когда я добавляю этот запрос для возврата информации об уязвимости, он возвращает неоднозначную ошибку ссылки на description . Но значения ip address , host_name и asset_id возвращаются просто отлично.

Я просто пытаюсь объединить их вместе, чтобы вернуть эту информацию. Я чувствую, что не хватает чего-то очевидного.

Это возвращает то, что я хочу из таблицы активов, включая описание ОС (Windows, RHEL и т.д.):

 SELECT da.asset_id, da.host_name, da.ip_address, dos.description
FROM dim_asset da
JOIN dim_operating_system dos ON dos.operating_system_id = da.operating_system_id
JOIN fact_asset fa ON fa.asset_id = da.asset_id
GROUP BY da.asset_id, da.host_name, da.ip_address, dos.description
  

Это возвращает неоднозначную ссылку для описания, это работает для asset_id, host_name и ip_address:

     WITH remediations AS (
        SELECT DISTINCT fr.solution_id AS ultimate_soln_id, summary, fix, estimate, riskscore, dshs.solution_id AS solution_id
        FROM fact_remediation(10,'riskscore DESC') fr
        JOIN dim_solution ds USING (solution_id)
        JOIN dim_solution_highest_supercedence dshs ON (fr.solution_id = dshs.superceding_solution_id AND ds.solution_id = dshs.superceding_solution_id)

    ),

    assets AS (
        SELECT da.asset_id, da.host_name, da.ip_address, dos.description
        FROM dim_asset da
        JOIN dim_operating_system dos ON dos.operating_system_id = da.operating_system_id
        JOIN fact_asset fa ON fa.asset_id = da.asset_id
        GROUP BY da.asset_id, da.host_name, da.ip_address, dos.description
    )

    SELECT
       csv(DISTINCT dv.title) AS "Vulnerability Title",
       host_name AS "Asset Hostname", ip_address AS "Asset IP", description AS "OS",
       round(sum(dv.riskscore)) AS "Asset Risk",
       summary AS "Solution",
       fix as "Fix"

    FROM remediations r
       JOIN dim_asset_vulnerability_solution dvs USING (solution_id)
       JOIN dim_vulnerability dv USING (vulnerability_id)
       JOIN assets USING (asset_id)

    GROUP BY r.riskscore, host_name, ip_address, asset_id, summary, fix
    ORDER BY "Asset Risk" DESC     WITH remediations AS (
  

Ответ №1:

Скорее всего, у dim_asset_vulnerability_solution or dim_vulnerability также есть description поле. Просто указание выбранных полей на их предполагаемый источник должно решить эту проблему.

 ...
a.host_name AS "Asset Hostname", a.ip_address AS "Asset IP", a.description AS "OS"
...
JOIN assets AS a USING (asset_id)
...
GROUP BY r.riskscore, a.host_name, a.ip_address, asset_id, summary, fix
  

Примечание: asset_id это не проблема, потому что USING обладает некоторой дополнительной «магией», которая объединяет объединенные им ссылки.

Комментарий: Если нет очень специфических причин, GROUP BY не следует использовать в качестве замены для SELECT DISTINCT (ссылаясь, в частности, на активы CTE)

Комментарии:

1. Вау, я не могу поверить, что пропустил это. Большое вам спасибо.