The 6-foot-6 Wacha (3-3) had lost his last three decisions since an April 13 win over the Cubs. The 22-year-old right-hander allowed seven hits, including a homer, but did not walk a batter. He struck out five.
Trevor Rosenthal pitched 1 2-3 innings for his 11th save. Rosenthal, who blew a save Tuesday, inherited a one-out, bases-loaded situation and gave up a sacrifice fly, but closed out the inning and retired the side in the ninth.
The Cubs have lost nine of their last 11 and are off to the worst start in 39 games (13-26) since 2002.
Chicago starter Jason Hammel (4-2) gave up five runs on five hits and two walks in 5 1-3 innings, raising his ERA to 3.06. Hammel had six strikeouts.
Chicago got two runs back in the fourth on a home run just inside the left field foul pole by Starlin Castro. He drove in No. 3 hitter Anthony Rizzo, who beat the St. Louis shift to the right side with his second bunt to the left side in two at-bats. When Rizzo came to bat in the fifth and seventh, St. Louis did not shift.
The Cardinals made it 5-2 when Molina lined a 3-2 pitch just inside the line in left for a one-out RBI single.
Junior Lake hit a sacrifice fly for a run in the eighth, but Rosenthal got out the jam.
St. Louis lost a challenge in the third when Holliday was called out on a close play at first after hitting a grounder to shortstop. The time of the review was 2 minutes, 54 seconds.
NOTES: Missouri's new basketball coach Kim Anderson threw out the first pitch. ''It was an honor to throw the first ball out,'' Anderson said. ''I was nervous out there but it's something I will never forget.'' ... The Cardinals announced the time for making up Wednesday's game with the Cubs that was rained out. It will be played at 1:15 p.m. Aug. 30 as part of a split doubleheader. The second game will start at 7:15 p.m. instead of 6:15 p.m. ... The Cardinals recalled Kolten Wong on Wednesday from Triple-A Memphis and optioned infielder Greg Garcia back to the club. Wong was optioned April 27 after hitting .225 in 20 games. He hit .344 in 10 games at Memphis. He was not in the starting lineup as he was still battling the effects of a stomach virus.