The 40-year-old Swede wasted a glorious chance to open the scoring early on and that miss proved costly as Beto pounced to give Udinese the lead in the 17th minute down the other end.
For all their pressure after the break, Milan created few clear chances and looked to be heading for a third defeat in five league games in Udine.
However, Ibrahimovic had other ideas, as he sprang into action in the 92nd minute to rescue an unlikely point for his team.
The draw moved Milan two points clear at the top of the Serie A standings, with second-placed Inter Milan playing Cagliari on Sunday.
Udinese, who finished the match with 10 men after substitute Isaac Success was sent off for clashing with Milan goalkeeper Mike Maignan just before the full-time whistle, dropped to 15th and are without a win in five league matches.
"Tonight we struggled to play our game," Milan coach Stefano Pioli told Sky Sport Italia. "We weren't fluid and precise enough to undo Udinese. We are conceding goals after mistakes. These are things that you pay for and make you lose your flow.
Are Juventus an outside bet for the Champions League?
Janusz Michallik debates whether Juventus are good enough to win the Champions League after their win over Malmo.
"In the last few games we have lost consistency in the defensive phase with little effect in the pressure phase," Pioli added. "We have to fix some things at both ends of the pitch."
Milan came into the contest looking to bounce back from being knocked out of the Champions League in midweek, and Pioli's side started well, with Ibrahimovic failing to find the target from a good position.
Udinese slowly grew into the match with Brazilian striker Beto breaking the deadlock. His first shot was initially saved, then the ball rebounded into this path and he hammered it home.
After the break, Udinese got plenty of players behind the ball in order to preserve their lead, but Milan's poor decision-making in the final third meant the hosts were rarely troubled.
Ibrahimovic's goal, his sixth Serie A strike of an injury-hit campaign, came from the visitors' only shot on target in the match, and was clinical in its execution to earn a below-par Milan a point.