Midfielder Gary Gardner struck to help sink Reading and lift Birmingham over their bitter rivals – and his parent club – Aston Villa.
The 26-year-old opened the scoring in the hosts’ 2-1 win for his first Birmingham goal – the last time he scored at St Andrew’s it was for Villa two years ago.
Lukas Jutkiewicz’s brilliant header – his seventh goal of the season – sealed the points despite Yakou Meite grabbing a late consolation.
It extended Birmingham’s unbeaten run to 10 games as they moved into the top half of the Sky Bet Championship, above Villa, for the first time since August 2017.
The Royals dropped to 21st, two points above the relegation zone.
Birmingham began brightly but Reading, seeking successive league wins for the first time in almost a year, conjured the best chances of the opening half an hour.
First, after 15 minutes, Meite tricked his way into the area and forced Lee Camp into a smart save.
Camp was then almost left embarrassed soon after when Liam Kelly’s shot whistled through his fingers and hit the post.
Despite pressing, Birmingham struggled to break down organised Reading as Gardner headed over and Che Adams’ tame shot was gathered by Anssi Jaakkola.
Reading continued to create the better chances and Camp smuggled John Swift’s free kick behind just before the break.
But four minutes after the re-start the hosts took the lead.
A mix-up saw Kelly concede a needless corner and, when Jota swung the ball in, Gardner stabbed in following Michael Morrison’s flick.
Jaakkola denied Jota a second soon after and Birmingham remained comfortable until they needed to rely on Camp’s reactions.
Sam Baldock wriggled into the box and crossed, only for Camp to make an excellent save to stop Maikel Kieftenbeld turning the ball into his own net.
Birmingham immediately broke and Jutkiewicz wrapped up the victory with 20 minutes remaining when he looped in a brilliant header from Adams’ deep cross.
Connor Mahoney squandered the chance to make it 3-0 late on before Meite scored from close range in injury time.