Norwich City threw this game away after looking comfortable at half-time.
Simon Lappin got the Canaries off to a flying start when he latched on to a weak clearance from Ross Turnbull to hit the target from long range.
Substitute Peter Whittingham scored the equaliser from close range and Roger Johnson won the game for the Bluebirds six minutes from time when he headed in Whittingham's corner.
Cardiff kicked off, attacking the River End goal. Joe Ledley brought a good save from David Marshall with a fierce drive in the sixth minute.
Two minutes later Dion Dublin headed home Lappin's free-kick, but celebrations were cut short when referee Clive Penton disallowed the goal.
However, Lappin himself was soon on the scoresheet. He intercepted Ross Turnbull's mishit clearance and scored with a left-foot shot from some 30 yards.
Johnson did well to block Jamie Cureton's shot, while, at the other end, Gary Docherty headed wide from Adam Drury's cross.
Marshall did well to cut out Ledley's cross before it reached the in-rushing Robbie Fowler.
There was a double substitution for Cardiff at half-time. Paul Parry came on for Ledley and Darcy Blake replaced Chris Gunter. On the hour Fowler made way for the impressive Peter.
He pulled the Bluebirds level after 64 minutes when Parry's right-wing cross was bundled past Marshall at the far post.
The referee penalised Glenn Loovens for handball inside the visitors' penalty area by awarding Norwich a free-kick outside the box.
On 72 minutes Darren Huckerby replaced Luke Chadwick.
Whittingham turned provider six minutes from time when his left-wing corner was headed firmly past Marshall by Johnson who was unmarked beyond the far post.
Norwich tried desperately to get back into the game.
Chris Brown fired inches wide, while, at the other end, Marshall had to make a save from the matchwinner Whittingham.