The Cardinals had forged a 9-9 tie in the eighth when Carlos Beltan singled home pinch-hitter Shane Robinson, who had drawn a leadoff walk against Sean Burnett.
Then in the ninth, Craig began with a single against Drew Storen (1-1), stole second one out later and then came home when Freese lined a hit over leaping Nationals third baseman Ryan Zimmerman for the decisive blow.
Freese finished 3-for-5 with a two-run homer, Mike Carpenter drove in three and Matt Holliday added a two-run shot for the Cards, who entered the contest with a half-game lead over Pittsburgh for a National League wild card spot.
Mitchell Boggs (3-1) earned the victory with a 1-2-3 eighth inning and Jason Motte corralled his 32nd save for St. Louis.
Adam LaRoche slammed a three-run homer and Danny Espinoza added a solo shot for the NL East-leading Nationals.