The Cardinals saw their last hope for a division title wiped out by the loss and they also fell three games behind Atlanta in the National League wild card race with just five games to play.
The setback for St. Louis, coupled with a 4-1 win by Milwaukee over Florida, gave the Brewers their first division title since becoming a National League team in 1998.
St. Louis scored its only run in the second on a successful squeeze bunt by pitcher Chris Carpenter and the Cardinals clung to a 1-0 lead until the sixth. The Cubs tied it in that inning on an RBI double by Carlos Pena.
With Kyle McClellan (12-7) on the mound in the eighth, Darwin Barney led off the inning with a triple. One out later the Cardinals intentionally walked Pena to get to Soriano, who hit a 2-0 pitch over the wall in left-center.
Starlin Castro singled in another Chicago run in the ninth.