Yaya Toure and Sergio Aguero scored late goals to send Manchester City second in the table as Aston Villa suffered a third straight defeat.
City looked set for a frustrating draw as Aguero was denied by a post while David Silva and Eliaquim Mangala forced Brad Guzan into saves.
Toure broke the deadlock from 18 yards in the 82nd minute before Aguero netted a similar goal six minutes later.
Villa's Charles N'Zogbia went close when the game was goalless.
City manager Manuel Pellegrini said he thought the match was the side's "best game of the season".
Aston Villa boss Paul Lambert said: "When you play against these sides, if you get a chance you have to take it. For 82 minutes, the lads were excellent, they did really well, but the two lads that scored the goals are top players themselves."