The result lifted Lyon five places to fifth in the standings on 40 points from 27 games while St Etienne stayed 16th on 29 points, two points above the relegation zone.
Dembele put the home side ahead with a glancing header in the 27th minute after Lucas Tousart floated over a free kick from the left and sealed the win with a stoppage time penalty.
The hosts also had two goals ruled out after the break, one for handball and the other for offside, but St Etienne got the upper hand in the second half and missed several chances.
Statistics will count for nothing when we face Bayern - Lyon coach
Lyon keeper Lopes parried a stinging low drive by Lois Diony in the 50th minute and then twice denied Denis Bouanga as the visitors piled on the pressure in the closing stages.
Diego Simeone ready to tempt Chelsea star to Atletico – Euro Papers
With St Etienne throwing men forward, Lyon substitute Karl Toko Ekambi raced clear and his shot from the edge of the area struck Saint-Etienne's Yann M'Vila on the arm in the area, with Dembele's dinked spot-kick beating keeper Jessy Moulin.
Fourth-placed Lille ground out a 1-0 win at Nantes while Nice held Girondins Bordeaux to a 1-1 draw in a mid-table clash.
Lille's Benjamin Andre struck in the 58th minute to keep them in contention for a top-three finish and Champions League football next season, while Nice midfielder Adam Ounas cancelled out a Nicollas De Preville opener for Bordeaux.
Lille have 46 points from 27 games, a point behind Stade Rennes who occupy the final Champions League spot behind leaders PSG, who have 68 points, and Olympique Marseille on 55.
Lyon move up to fifth with 2-1 win at Bordeaux
Southampton aims to sign new players in January - Hasenhuettl