The Cubs won for the fifth time in six games to close to a half-game behind idle first-place Milwaukee in the NL Central.
Tommy LaStella and Kris Bryant had RBI singles in Chicago's decisive three-run fifth inning. Rizzo's sac fly to left capped the rally after a video review determined Phillies catcher Andrew Knapp had illegally blocked the plate with his left leg as Albert Almora tried to score from third.
Almora beat Dylan Cozen's strong throw from left field, but was unable to touch the plate with Knapp in the way. Almora initially was called out before the play was overruled.
Scott Kingery drove in two runs with a double and Carlos Santana had an RBI single as the Phillies lost for the fifth time in six games to conclude a 10-game road trip at 3-7.
Brian Duensing (2-0), the first of five Cubs relievers, got the win despite allowing two runs over one inning. Phillies starter Nick Pivetta (4-5) lost his third straight, yielding four runs on six hits in five innings.
Brandon Morrow pitched the ninth for his 15th save in 16 chances.
Cubs starter Tyler Chatwood permitted one run on four hits in 4 2/3 innings, but walked seven to tie his season-high and raise his major league-leading total to 56. The right-hander hit a batter and three times threw pitches over the heads of right-handed Phillies hitters.
Rizzo lined his home run to right with one out in the fourth to put Chicago ahead 1-0. He pounced on a down-the-middle fastball for his 10th homer and second in two days.
The Phillies tied it at 1 in a messy fifth when Santana's RBI's single drove in Odubel Herrera from third. Herrera reached on the first of Chatwood's three walks in the inning, then advanced on a wild pitch and ground out.
Chatwood issued two more passes to load the bases before being replaced by Duensing, who got pinch-hitter Maikel Franco to pop up to end the threat.
After the Cubs took a 4-1 lead in the fifth, Kingery drove in two runs off Duensing in the sixth to cut it to 4-3.