Catania went into the match knowing a victory could see them jump from eighth to fifth and they looked set to move just six points behind Milan - who occupy the final Champions League spot - when Mariano Isco put them into the lead in the 50th minute.
However Lazio scored in the 79th and then 81st minutes to snatch what could be a vital three points as they moved to 50 points, four off Massimiliano Allegri's men.
Vladimir Petkovic's side were boosted by the return of 10-goal Germany striker Miroslav Klose, who returned to the bench after missing the last six weeks with a leg injury.
Catania were without suspended defenders Nicolas Spolli and Alessandro Potenza, while Ciro Capuano, Fabio Sciacca and Blazej Augustyn missed the game through injury.
Candreva started the game brightly for the home side and an impressive effort from outside the box forced a good save from Mariano Andujar.
The home side should have gone ahead after 17 minutes when Ogenyi Onazi's precise pass found Louis Saha who, despite having an open goal, somehow missed.
Lazio were well in control and Andujar was again called into action just before the half-hour mark, turning Lorik Cana's effort onto the bar.
Andujar's heroics were rewarded five minutes after the restart when Catania took the lead.
After a scramble in the Lazio box the ball fell to Stefan Radu, whose shot was blocked, but the rebound fell to Isco whose effort beat Federico Marchetti.
Lazio continued to attack and Andujar dived full length to keep out a Saha header before Giovanni Marchese cleared off the line to deny Libor Kozak.
The pressure finally told 11 minutes from time when Radu's cross was turned into his own net by Legrottaglie.
And the home side were ahead two minutes later when Giuseppe Bellusci brought down Honorato Ederson inside the area, with Candreva slotting home the spot-kick.
Catania could have grabbed a dramatic late leveller, but somehow Gonzalo Bergessio managed to miss from close range.