Lazio fell behind to Ashley Young's first goal since joining Inter in January but rallied after the restart to hand Antonio Conte's side, which went into this weekend top of the table, its first top-flight defeat in 17 matches.
Inter centre-back Stefan de Vrij, whistled incessantly by fans of his former club, was deemed to have fouled Ciro Immobile in the box and the prolific striker made no mistake from the spot five minutes into the second period.
Sergej Milinkovic-Savic gave Lazio the lead with 21 minutes remaining and the host held on to move up to second, two points ahead of Inter and one behind leader Juventus.
Lazio was without Milinkovic-Savic for the 1-0 win over Parma last weekend due to suspension and the Serbia international almost made a significant impact within nine minutes of his return, producing a venomous 20-yard drive that hit the crossbar.
Inter's best moments came on the break and after Thomas Strakosha blocked Antonio Candreva's swerving effort Young volleyed the follow-up into the top-left corner in the 44th minute.
Lazio was level five minutes after the restart. Milan Skriniar intercepted Luis Alberto's pass but looped it over Daniele Padelli, who fell over him, and De Vrij was penalised for a push on Immobile, who slotted home the resulting penalty.
Young was disappointed not to be awarded a spot-kick when he went down under a challenge from Luiz Felipe and Inter fell behind in the 69th minute.
Marcelo Brozovic did well to block Adam Marusic's shot on the line but Milinkovic-Savic picked out the bottom-left corner with the next attempt.
Lautaro Martinez headed in a Young cross from an offside position as Inter pushed for an equaliser, while Immobile was denied a brilliant second by Padelli as Simone Inzaghi's side extended their unbeaten run in Serie A to 19 matches.