The table-toppers installed one change from their last clash in Denzel Dumfries for Matteo Darmian, with Ismael Bennacer, Alexis Saelemaekers, Franck Kessie and Olivier Giroud installed for Milan.
Inter set out quick and looked to have gone ahead on ten minutes through a telling header from Ivan Perisic, but it was chalked off as the Croatian strayed into an offside position.
Another threat from Inter followed inside a minute when Marcelo Brozovic swirled on the edge of the area and curled towards the top corner, but had Mike Maignan equal to the task.
The Nerazzurri continued to hold the fort and bagged the lead late in the half after Perisic volleyed a corner-kick from Hakan Calhanoglu into the bottom-corner.
Milan put on a substitution ahead of the start of the second half in Junior Messias, who replaced Saelemaekers with the aim of getting back into the contest.
The league leaders began to feel the pressure closer to the midway phase and allowed Sandro Tonali to launch a powerful drive, but it didn’t bother goalkeeper Samir Handanovic.
Stefano Pioli’s side continued to plug away and drew level on 75 minutes after Giroud made the most of a scuffed shot from Brahim Diaz to turn home.
The Frenchman turned the match around three minutes later when he curled beyond Handanovic after latching onto Davide Calabria’s penetrative pass.
Inter looked to draw level following the final seconds of the clash, but the Rossoneri who had Theo Hernandez dismissed in the dying stages stayed firm to see out the win and the bragging rights.