Birmingham clinched their first win at St Andrew's in five attempts as they inflicted a sixth successive defeat on Bristol City.
Chris Burke was recalled to Lee Clark's line-up and opened the scoring with a well-taken finish in the 59th minute.
Marlon King latched on to Nikola Zigic's header to double the hosts' lead with his eighth goal this season.
Dean Gerken capped a fine individual display for Bristol City when he saved Peter Lovenkrands' late penalty.
It will be a more than welcome three points for the midlands outfit, who had only managed five goals in seven home games before kick-off but enjoyed a total of 20 shots at goal tonight and are now 18th in the table.
Blues manager Clark will have been happy to see his side so positive from the start as Wade Elliott and King both tested visiting goalkeeper Gerken.
Elliott spurned another good chance in the second half as he fired over the bar before Zigic done the same.
However, on the hour the breakthrough came as Burke received the ball on the right before skipping past two players and unleashing an effort high past Gerken.
King doubled the lead to make sure of the points but Gerken prevented Lovenkrands from adding a third by saving the forward's penalty after Burke had been brought down in the box.
Birmingham manager Lee Clark: "We kept plugging and got what we deserved. If we had won four or five Bristol City could not have had any complaints.
"My wide men probably had more chances and shots on goal than they have had in all the previous games combined because we were positive and played off the threat of our strikers.
"We took risks which we are allowed to do playing at home. This is the only way we are going to be progressive."
Bristol City manager Derek McInnes: "This is now six defeats in a row.
"It is embarrassing. I am embarrassed. The players should be embarrassed and it is now a crucial game against Charlton on Sunday.
"The game ran away with us with the injuries at the end. We cannot hide behind the fact that the better team won on the night."
Sorry, we were unable to load match stats, please try again.