Robinho's first-half penalty was enough to decide a tight match, and surge the home side up the table, while leaving Juve with a precarious four-point lead at the top of Serie A
The Bianconeri suffered only their second defeat in the league this season, after failing to respond to a Robinho penalty after 31 minutes in what was a closely contested match from both sides, which nevertheless lacked a lot of action in front of goal.
Juventus maintain their four-point lead at the top of the table, but could see that gap cut to a single point should Inter come away with victory at Parma on Monday, while Milan move to eighth place with 18 points, jumping five spots in the standings.
Robinho won the race to start up front for the hosts ahead of Bojan, while Juve made only one change from the side that dismantled Chelsea 3-0 in the Champions League midweek, with Mauricio Isla replacing Stephan Lichtsteiner as the right wing-back.
Milan full-back Mattia De Sciglio was in the thick of things early on, dragging a shot from the edge of the area wide after five minutes, before forcing Gianluigi Buffon to work to stop his attempt from an angle with his legs, after he was played in by Robinho.
The better openings in the match were continually going Milan's way, and they found some fortune just after the half hour mark when a soft penalty appeal for handball against Isla went their way, after the Bianconeri player struggled to clear under pressure from Nocerino.
Robinho took responsibilities from the spot, and his shot squeezed into the bottom left corner, despite Buffon getting a strong hand to the attempt.
Juve were simply not good enough in the first half, as despite controlling the majority of possession, looked decidedly out of ideas in attack.
Minutes into the second half, a terrible pass out of defence from Buffon nearly sold Andrea Barzagli short and allowed Stephan El Shaarawy to pounce, but the defender was able to slide in for a crucial tackle.
The introduction of Sebastian Giovinco for Fabio Quagliarella around the hour-mark finally sparked Juve into life. The diminutive Italian set up a great opportunity for Mirko Vucinic not long after his introduction, but the Montenegrin could not convert his cross from a good position inside the area.
At the other end, Mario Yepes forced a save from Buffon with a header from a corner, but Milan were soon forced back into some desperate defending as Juve made a late surge to get something from the match in the closing stages.
With seven minutes remaining, Giovinco again picked out Vucinic inside the area, but Amelia was in the right place to make a superb save to deny the striker from close range.
But Juve could not change their stripes that late in the game, and failed to find another breakthrough as Milan held on to record three vital points to help the recovery of their season.