Despite being outplayed for long periods, Lyon refused to give in and were finally rewarded when Tolisso scored.
Gonzalo Higuain struck a first-half penalty but dominant Juventus failed to book their Champions League last 16 ticket after being stunned by Corentin Tolisso's late leveller in a 1-1 draw with Lyon on Wednesday.
The Italian champions looked to be heading for a 1-0 win after Higuain stepped up to beat Anthony Lopes from the spot before the quarter hour.
But despite being outplayed for long periods, Lyon refused to give in and were finally rewarded when Tolisso bundled the ball past Gianluigi Buffon from a long free kick with six minutes left on the clock.
Sevilla's win against Dinamo Zagreb means Juventus dropped to second place in Group H to sit two points behind the Spaniards and are now just four ahead of Lyon with two games remaining.
But Juventus Massimiliano Allegri refused to see the glass half-full.
"We missed a few chances but for me this is a positive result," said Allegri.
"We're still fighting for first place in the group and nothing has been decided yet. The Champions League is long."
Lyon created the first chance of the night, Buffon forced to block Maciej Rybus's angled drive with both legs at his near post on eight minutes after a slick one-two with Alexandre Lacazette.
But it served as a wake-up call to the Italian champions, who should have wrapped up the match by the end of the first half after Higuain spurned a golden chance to add to his opener.
A great first touch from Dani Alves from Leonardo Bonucci's long cross set Mario Mandzukic for a quick strike from 18 yards that Lopes did well to block down low with his body on 11 minutes.
Lyon coach Bruno Genesio had opted for youth at the centre of his defence, 19-year-old Mouctar Diakhaby given just his second Champions League start alongside 20-year-old Argentine Emanuel Mammana.
But mistakes from both players could have proved costly.
A slight push from Diakhaby on Stefano Sturaro as he awaited Higuain's through ball on the left was enough to send the Italian to the turf.
Referee Bjorn Kuipers pointed immediately to the spot and Higuain stepped up to send Lopes the wrong way.
Juventus were being given acres of space, but on more than one occasion, Massimiliano Allegri's men failed to capitalise.
Sturaro's smart lay off for Claudio Marchisio saw the midfielder's first time effort shaved Lopes' near post before the half hour.
Six minutes later Lopes was forced out to thwart Mandzukic as he tried to reach Sami Khedira's through ball and after Mandzukic did well to steal possession from Mammana as he headed back towards goal, Higuain somehow skied the Croat's lay-off.
Juve's profligacy continued after the break, when a superb Bonucci long ball from deep in midfield found Miralem Pjanic behind the Lyon defence.
The Bosnian's unselfish header back towards Mandzukic set it up nicely, but with absolutely no pressure he skewed his effort wide.
Allegri replaced a battle-weary Pjanic with Brazilian midfielder Alex Sandro and Mehdi Benatia came on for Leaonardo Bonucci on 68 minutes.
Moments later, Sandro broke down the left to set up Higuain for a bundled shot from the edge of the box.
At the other end, Buffon had the imposing physique of Andrea Barzagli to thank when he got down to block Maxime Gonalons' drive after a puzzled-looking Sturaro somehow lost possession with the ball at his feet.
Allegri replaced a tiring Higuain with Juan Cuadrado with seven minutes remaining with the hope the speedy Colombian, who hit the winner at Lyon a fortnight ago, would conjure a late goal.
But a minute later the stadium was stunned into silence when Buffon was well and truly beat by Tolisso's late header.
But for Genesio, it may be too little too late.
"I'm satisfied with our performance but it will be difficult for us to qualify," he said.
"I'm disappointed in that sense because we could have snatched three points."