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.
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.
"We missed chances to score earlier. Our first half was quite remarkable, but it was a match we had to wait until late to settle. I thought we were fresher than they were. We also went unrewarded because of video decisions against us," said Lyon manager Rudi Garcia.
"We knew that a derby cannot be played, but it can be won -- here, we also played. Now we must recover, and think about the Coupe de France semifinal against PSG. Three wins in a row is good and it must continue."
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.