Robin van Persie scored the winner for Manchester United in stoppage time in his Manchester derby debut.
The home side dominated the early minutes of the game, with Mario Balotelli having two attempts in the first quarter of an hour.
Manchester United took the lead through a Wayne Rooney goal in the 16th minute. The England international scuffed his shot, wrongfooting Joe Hart, and the ball slowly rolled into the back of the net.
Vincent Kompany had to leave the game early after he picked up an injury, Kolo Toure coming off the bench to replace the City captain.
Rooney doubled the visitors' advantage in the 29th minute, securing his 150th Premier League goal.
City had chances in the first half, but poor finishing cost them.
Roberto Mancini brought Carlos Tevez on early in the second half, replacing Balotelli, who had spurned several chances for city in the opening period.
Ashley Young thought he had scored United's third when he rebounded a Robin van Persie effort, but the assistant referee flagged for offside, although replays suggested the goal should have stood.
The champions were immediately on the counter-attack, Yaya Toure slotting the ball home after David de Gea kept out efforts from Tevez and Sergio Aguero.
Much of the play was fast-paced following Tevez's goal, as City pushed for an equaliser, while the visitors looked to regain their two-goal cushion.
Mancini brought on Edin Dzeko late on, as the Bosnian has so often been a 'super sub' for City this season. However, it was Zabaleta that leveled the scores with a thunderous strike from the edge of the area in the 86th minute.
Sir Alex Ferguson used his final substitution to bring on Danny Welbeck as both sides looked for a winner.
City were the more threatening in the last minutes of the game, Tevez and Silva forcing De Gea into late saves.
There was a late twist, however, when United were awarded a free kick just outside the penalty box in stoppage time.
Van Persie stepped up to take the kick, which deflected into the net to give United all three points.
There were ugly scenes late on as Rio Ferdinand was left bleeding, after it appeared he was struck by an object thrown from the crowd.
The win ends City's 21-game unbeaten run, and moves United six points clear of their neighbours in the Premier League table.