The victory moved the Fire (7-5-3) within three points of third-place New York in the Eastern Conference. Columbus, dominated from the start by the Fire, had entered the game with a six-match unbeaten streak (3-0-3).
The Crew's last loss was on April 28, 1-0 to Vancouver.
Pappa maneuvered to the edge of the penalty area, and using a screen, ripped a right-footed shot off the hands of diving goalkeeper Andy Gruenbaum in the second minute.
Oduro made it 2-0 in the 26th minute, outrunning a pair of defenders while in control of Sebastian Grazzini's pass before chipping the ball past Gruenbaum from 15 yards.
Chicago's Gonzalo Segares was ejected in the 29th minute when his right foot clipped the right shin of Columbus' Kevin George while they slid for a loose ball. George remained in the match, while Segares will miss Chicago's match Friday at Kansas City.