Serie A leaders fail to banish their Champions League blues as they fall to a surprise defeat to at San Siro
Zlatan Ibrahimovic fired the home side in front from the penalty spot, but Stevan Jovetic levelled and a late, late winner from Amauri stunned the home fans into silence, and means that Juventus can go top with victory at Palermo later tonight.
Milan started the game half-asleep, the visitors making the most of their hosts stupor to go close early on through the lively Jovetic, who fired a warning across Abbiati's goal after just three minutes.
Slowly but surely, however, Milan started to dominate. Ibrahimovic became increasingly involved in some dangerous link-up play. Unsurprisingly, it was the Swede who had the hosts first effort on target - his 25-yard free-kick palmed away by Artur Boruc in the Fiorentina goal - with Sulley Muntari blazing his follow-up effort over the bar.
Fiorentina briefly flickered into life as an attacking force, but were forced to shoot from distance - both Jovetic and Behrami blazing long-distance efforts wide of the target.
Milan's corner count was rising almost by the minute, but it looked like they needed a spark - or a helping hand - if they were to think about taking the lead. It turned out to be the latter - Lopez winning the hosts a penalty after tumbling over the flat-footed Nastasic in the area while trying to latch onto an Ibrahimovic cross.
Ibrahimovic stepped up confidently to drill home a low penalty, which sent Boruc the wrong way.
Up top, Milan's strike pairing were starting to click, Ibrahimovic finding Lopez with a lovely drifting pass, which the Argentine pulled down and smacked against Boruc's left-hand post from 15 yards.
Milan finished the half on top - Ibrahimovic making a barnstorming run though the visitor's defence only to blaze over.
With everyone expecting Milan to coast to victory in the second half, the last thing expected was a Fiorentina goal - but one arrived within minutes of the re-start when Jovetic took advantage of a suicidally high line from the hosts to run onto De Silvestri's through ball and slot home.
Milan were stung into action with Abate seeing one shot heroically blocked by Di Natale and Boruc pulling off a double save from Ambrosini and Emanuelson.
However, Milan's attacking efforts carried more than a whiff of desperation and were limited to blocked shots and penalty box melees. Lopez did hit the net, but saw his header disallowed after Ibrahimovic's cross drifted out of play.
With a frustrated home side mentally coming to terms with dropping two points, however, Amauri played a one-two with Jovetic, muscled Mexes off the ball and slotted home to throw the Scudetto race wide open.
Milan will now watch this afternoon to see if Juventus can overcome Palermo away from home to leapfrog the Rossoneri to the top of the table. Fiorentina, meanwhile, will be celebrating a famous victory that moves them well clear of the bottom three.