The win gave Milan 40 points from 18 matches, one point ahead of city rivals Inter who could only manage a goalless draw with Siena. Champions Juventus still comfortably lead the division on 49 points after a 2-1 defeat of Palermo on Saturday.
In the early stages at the San Siro, the visitors were pressed back into their own half and Milan strikers Andriy Shevchenko and Alberto Gilardino both narrowly missed the target.
It was Parma, however, who took the lead in the 24th minute courtesy of a howler by Milan keeper Dida, who fumbled a corner leaving Paolo Cannavaro the easiest of tap-ins.
Milan hit back with three goals in nine minutes, starting in the 27th minute when Parma defender Giuseppe Cardone deflected Kaka's low cross past his own keeper.
Gilardino then put Milan ahead. The 23-year-old Italy international, who moved to Milan from Parma during the close season, headed a Shevchenko cross past keeper Matteo Guardalben.
Kaka grabbed their third, taking advantage of a poor clearance to beat Guardalben from the edge of the area.
Parma showed flashes of class and Marco Marchionni pulled a goal back in the 70th minute but a poacher's goal by Shevchenko restored Milan's two-goal cushion.
Marchionni dribbled through the Milan defence to grab his second goal of the match five minutes from time, but it was too little, too late.
The win meant Milan leapfrogged above Inter, who failed to capitalise on a series of scoring chances in their 0-0 draw in Siena.
Inter had racked up six consecutive wins leading up to the winter break were looking to extend their run at Siena's Franchi stadium against a side that had lost more games than they had won at home this season.
CHANCES SPURNED
Despite lacking urgency in the first half, Inter enjoyed greater possession and twice went close to taking the lead as Dejan Stankovic headed narrowly wide from a corner and then an Adriano free kick flew just the wrong side of the post.
Inter upped the pressure in the second half but still let a series of excellent chances go begging
Stankovic blasted Giuseppe Favalli's cutback directly at keeper Antonio Mirante on the hour and four minutes later the Serbian midfielder failed to turn Adriano's low cross into the net from close range.
He made up for his mistake soon afterwards with a precise cross to Obafemi Martins, who was unmarked in front of goal, but the striker headed over the bar.
As the seconds ticked away, Inter coach Roberto Mancini brought on a third striker, Alvaro Recoba, and replaced Adriano with Julio Cruz but the tactic failed to pay off.
Striker Cristiano Lucarelli scored twice as Livorno beat Sampdoria 2-0 to notch up their fourth win in five games and consolidate fifth place in the division on 34 points.
Sixth-placed Chievo Verona beat Lecce 3-1 to move on to 30 points.