Colvin's go-ahead homer in the ninth was overturned by umpires after replays showed a fan wearing a Phillies T-shirt reached over the fence and interfered with the ball.
But the Cubs still won their second straight after losing eight in a row.
Sean Marshall (3-0) pitched two scoreless innings. Carlos Marmol worked the 11th for his 12th save in 16 chances.
Colvin snapped an 0-for-34 slump with his hit off Madson, who had been 14 for 14 in save chances before allowing Soto's tying solo homer.
After Soto connected, Colvin hit a drive to right-center. The ball hit off a male fan's hands and bounced into the crowd. Colvin circled the bases, but Phillies manager Charlie Manuel quickly came out to challenge the play. Umpires took several minutes to review it before ruling it a ground-rule double.
Strong winds and heavy rain stopped the game for 1 hour, 17 minutes in the bottom of the third. Neither starter returned when play resumed, and the teams used 12 relievers.
Colvin led off the 11th with a single off David Herndon (0-1). He advanced to second on a passed ball and stayed there until Darwin Barney hit a grounder to third with two outs. Placido Polanco's throw bounced and first baseman Ryan Howard couldn't catch it cleanly. Colvin never stopped running and scored without a throw home.
The NL East-leading Phillies took a 3-0 lead when Jimmy Rollins hit a three-run homer off Randy Wells in the second. Wells gave up three runs and three hits in 2 1-3 innings.
Philadelphia's Kyle Kendrick allowed two hits in three scoreless innings in his fourth start of the season. He's filling in for injured right-hander Joe Blanton.
Starting his first game since fouling a ball off his right knee last Saturday, Rollins put the Phillies ahead with his fourth homer. Raul Ibanez started the inning with a single. Dane Sardinha walked with one out. After Kendrick struck out trying to bunt, Rollins drove a 3-2 pitch into the right-field seats.
Cubs third baseman Aramis Ramirez saved at least one run with a diving grab on a grounder by Sardinha with the bases loaded to end the third.
Starlin Castro's RBI single in the sixth got Chicago within two. Barney walked with two outs and stole second base. Castro followed with a single to right off Danys Baez. Domonic Brown made a strong throw to the plate. But the ball took a tough hop and Sardinha dropped it or Castro likely would've been out by a few steps.
The Cubs cut it to 3-2 in the eighth on consecutive two-out doubles by Castro and Carlos Pena off Jose Contreras.
NOTES: Cubs RHP Ryan Dempster had no problems with his right hip that nearly forced him to miss Wednesday's start and he's on track to make his next start. ... A crowd of 44,906 was the 169th straight sellout at Citizens Bank Park, including postseason play. ... The Phillies failed to score more than three runs for the eighth time in nine games. ... Philadelphia is 32-1 when leading after eight innings.