Carlos Edwards' 30-yard stunner in the 27th minute looked to have settled the tie and earned Sunderland a seventh victory in their last eight games.
However, seconds after keeper Marton Fulop had beaten away Campbell's header, the striker poked in to level.
There was still time for Martin Taylor to deny David Connolly a winner when he cleared off the line for the Blues.
Sunderland manager Roy Keane
"When you are 1-0 up there is always a chance you might concede. We always needed the second goal.
"If we had got that I think we would have gone on to win. We had the chances to do that and if you don't put them away it can come back to hurt you.
"Credit to Birmingham. They kept going, are going to be up there at the end of the season, and maybe a draw was fair."
Birmingham: Doyle, N'Gotty (Campbell 83), Jaidi, Martin Taylor, Sadler, Larsson, Muamba (Danns 75), Clemence, McSheffrey, Bendtner (Vine 75), Jerome.
Subs Not Used: Maik Taylor, Nafti.
Booked: N'Gotty, McSheffrey.
Goals: Campbell 90.
Sunderland: Fulop, Simpson (Liam Miller 57), Evans, Nosworthy, Collins, Edwards, Whitehead, Yorke, Stokes (Leadbitter 85), John (Hysen 64), Connolly.
Subs Not Used: Ward, Wallace.
Booked: Evans.
Goals: Edwards 27.
Att: 20,941
Ref: M Halsey (Lancashire).