Yaya Toure responded for the visitors at Selhurst Park, but it was Alan Pardew’s men who held on to claim another big scalp and virtually guarantee their place in the top flight for next season.
Defeat leaves City nine points behind Premier League leaders Chelsea, who have a game in hand, with the small matter of the Manchester derby to come on Sunday.
So poor is their current form – three defeats in five matches – that City have suddenly found themselves as the team Liverpool and Tottenham will be eyeing up as they attempt to steal fourth spot and, unthinkably, deny them a Champions League place.
By contrast it was another big scalp and a memorable night for Palace, whose revival under manager Alan Pardew shows no sign of letting up.
The hosts gave City a warning that this would not be a routine assignment in the opening seconds when Martin Kelly whipped the ball in behind City’s defence.
Puncheon slid in but could not get a touch and Wilfried Zaha, also at full stretch as he arrived at the far post, could only lift the ball over the top.
It was a big chance and the miss almost proved costly when Sergio Aguero fashioned City’s first opportunity, racing onto Joe Hart’s long clearance and rounding Julian Speroni.
With the angle too tight to shoot, Aguero squared the ball to David Silva but Palace keeper Speroni got back to deflect the shot over with his shoulder.
Aguero took matters into his own hands moments later, shifting the ball to make space on the edge of the area and beating Speroni with his shot, only to see it come back off the foot of the post.
With the pressure building a goal seemed inevitable, but when it came it went to Palace.
Joel Ward pumped the ball back into the danger area after City had cleared a corner, Joe Ledley flicked it on and Dann’s shot was blocked by Hart only for Murray to tap in the rebound for his fifth goal in as many matches.
City furiously appealed for offside, claiming both Dann and Murray were beyond the last man, but the flag stayed down and skipper Vincent Kompany’s lengthy protest to referee Michael Oliver proved in vain.
But if there were question marks about the first goal, there was nothing wrong with the second three minutes after the interval.
Murray was barged over 25 yards out and Puncheon stepped up to curl a stunning free-kick over the wall and beyond the despairing dive of Hart.
City’s frustration grew when they had appeals for a penalty waved away after the ball appeared to strike Murray’s hand in the area.
Toure’s ferocious curler 12 minutes from the end halved the deficit but they could not find an equaliser, with the final whistle sparking wild celebrations in south London – and probably parts of west London as well.
Crystal Palace: Speroni (7), Ward (7), Dann (7), Delaney (7), Kelly (7), Zaha (6), Ledley (7), McArthur (7), Bolasie (7), Puncheon (8), Murray (9).
Subs: Sanogo (5), Gayle (5), Souare (4).
Man City: Hart (7), Sagna (6), Demichelis (5), Kompany (6), Clichy (6), Fernandinho (6), Toure (8), Navas (5), Aguero (7), Silva (6), Dzeko (5).
Subs: Milner (5), Nasri (6), Lampard (5).
Man of the match: Glenn Murray.