Birmingham who had lost their last two, had outplayed Ipswich on November 25, despite the final narrow looking 2-1 scoreline, but this was a much closer affair.
Neither side created a great deal with defences on top for the main part and the two goalkeepers having little to do.
Cameron Jerome had an early 20-yarder deflected over by Ivan Campo, before Liam Ridgewell's fine challenge stopped Kevin Lisbie breaking clear on to a David Norris pass.
Alan Quinn volleyed wide from the edge of the box, before Jon Stead's fierce volley from a Danny Haynes cross was charged down.
Jerome sent a 20-yard volley over before McFadden sent Richard Wright the wrong way from the spot, after Moritz Volz needlessly handled Kemy Agustien's cross.
Tommy Miller forced a rare save from Maik Taylor as the half ended, while sub Jon Walters flashed a shot across goal soon after the break.
Ipswich huffed and puffed, but their main chances came from free-kicks - a Darren Ambrose 20-yarder being fielded by Taylor and Campo curling another effort narrowly wide.
Birmingham were content to defend in numbers and hit town on the break where they still posed a sporadic threat.
Frank Queudrue flashed an angled volley not far wide and Agustien's fierce volley was palmed wide by Wright.
Taylor saved an Ambrose header before a late goalmouth scramble saw substitute Nicky Hunt clear a deflected Lisbie drive from close to his own line after it looked to have wrongfooted Taylor.
The three points saw Birmingham draw level with promotion rivals Reading after they were held at home by Cardiff.