Bryan LaHair drew a lead-off walk in the seventh from Cardinals starter Joe Kelly (1-4). Pinch-runner Campana stole second and went to third on Geovany Soto's single.
Brian Fuentes came in to pitch and recorded a second out by fanning Luis Valbuena. But Johnson, hitting for pitcher Jeff Russell, pushed a bunt to the left of the mound and Campana scampered home to break a 2-2 tie.
Alfonso Soriano provided the Cubs' other scoring with a two-run triple as the Cubs evened their three-game set against their National League Central rivals.
Kelly yielded three runs on five hits in a 6 1/3-inning effort for the Cards.
Carlos Beltran and David Descalso supplied RBI in the loss.