Stefano Pioli's men were condemned to a first defeat in seven league matches after goals from Sergej Milinkovic-Savic and Mattia Zaccagni gave the hosts a half-time advantage.
Luis Alberto added a third from the spot after the interval before Felipe Anderson rounded off the scoring as the Rossoneri failed to win for the fifth game in a row in all competitions.
The impressive result sees Maurizio Sarri's Lazio leap from sixth to third and within a point of Milan, which remains 12 points off Napoli.
Lazio was ahead just four minutes in, Luis Alberto cleverly dummying a Zaccagni pass into the path of Milinkovic-Savic to coolly stroke into the bottom corner.
Sandro Tonali stung the palms of Ivan Provedel as Milan looked for a response, but the champion would find itself two goals down before half-time.
Adam Marusic saw a shot come back off the post after latching onto Pedro's through-ball, but Zaccagni was there to bundle home the rebound for his third goal in three league games.
Milan's shaky defending continued to be their downfall in the second half, with Lazio going further ahead when Pierre Kalulu brought down Pedro for a penalty, which Luis Alberto blasted straight down the middle past Ciprian Tatarusanu.
With Milan staring down the barrel of a heavy defeat, Anderson slotted home after a neat pass from Luis Alberto to further embarrass Pioli's side.