Carlos Zambrano (13-7) allowed two runs on five hits with five strikeouts in 6 1/3 innings for Chicago, which won for the fourth time in its last six games.
Derrek Lee added two hits, an RBI and a run scored in the win.
Skip Schumaker had a two-run triple for the Cardinals.
Kip Wells (4-13) was the loser after giving up three runs on eight hits over 6 2/3 frames. Wells also singled and scored a run.