Florian Sotoca put Lens ahead nine minutes before half-time, controlling Florian Thauvin's floated cross on his chest before turning and firing a low shot past goalkeeper Dominik Greif.
Lens had threatened earlier through Sotoca, who forced Greif into a sharp save before sending a half-volley over the crossbar.
Thauvin almost doubled the hosts' advantage before the break, but Greif tipped his effort over the bar and then denied Odsonne Edouard as Lens finished the first half strongly.
Lyon, who had conceded only twice in their opening five league matches, failed to register a shot on target before the interval.
They improved after the restart, with Pavel Sulc testing Robin Risser within three minutes, but Lens continued to carry a threat at the other end. Ruben Aguilar came close to extending the lead with a swerving effort that narrowly missed the near post.
Lens eventually found their second goal with 14 minutes remaining. Matthieu Udol rose to head home Thauvin's free-kick, scoring for the second consecutive match and putting the hosts in control.
The game took another turn six minutes from time when Udol was sent off for a poor challenge. Lyon immediately capitalised, with Khalis Merah scoring his first Ligue 1 goal for the club to set up a tense finish.
However, Lens defended resolutely with 10-men to secure all three points.
The victory lifted Lens from 15th to seventh in the standings, while second-placed Lyon missed the opportunity to move to the top of the table.