The hosts controversially went ahead on 10 minutes when Mladen Petric sent Joe Hart the wrong way with his penalty kick, after referee Mark Halsey had deemed that Pablo Zabaleta had brought down John Arne Riise.
Replays later showed that Zabaleta was guilty of a committing the foul but that the initial contact had occurred outside of the 18-yard box.
Carlos Tevez was unlucky not to be awarded a penalty at the other end when he appeared to be tugged back by Riise midway through the first half.
However, the Premier League champions finally got their deserved equaliser three minutes before the break when David Silva's instinctive effort was parried by Mark Schwarzer into the path of Sergio Aguero, who tapped home from two yards.
City laid siege to the Fulham goal in the second half and, after Mario Balotelli had spurned a hat-trick of good chances, their dominance was rewarded on 87 minutes.