In a meeting of the teams with the two worst records in the American League, Chicago won for the 10th time in 12 games.
Houston forged a 1-1 tie in the top of the seventh on a home run by Chris Carter, but the White Sox quickly regained the lead with the game's decisive inning thanks chiefly to wildness suffered by Lucas Harrell (6-15).
Leury Garcia opened the seventh with a walk, stole second and went on to third on a poor throw from catcher Cody Clark.
Jeff Keppinger drove home the tiebreaking run with a sacrifice fly, after which Harrell walked two more batters and Avasail Garcia launched his homer to center.
Chris Sale (10-12) went eight innings to get the win, striking out 12 and giving up a run on just four hits.