Pierre-Emerick Aubameyang had put the visitors ahead in the eighth minute with his 17th goal of the season but Julien Faussurier levelled for Troyes in the 25th.
Forward Brandao put St Etienne back in front six minutes later with a powerful header only for Benjamin Nivet to hit back for Troyes in the 38th and dent the visitors' hopes of securing Champions League football next season with a top-three finish.
St Etienne, who drew by the same score at Stade Rennes and against Ligue 1 leaders Paris St Germain in their last two games, stay fourth with 50 points from 30 games, one less than Marseille who visit Nice, fifth on 48, on Sunday.
Troyes slipped one place to the foot of the table with 25 points, four from the safety zone, after AS Nancy moved above them thanks to a 2-0 victory at 10th-placed Rennes.
Ligue 1 leaders PSG, who beat visiting Montpellier 1-0 on Friday, have 61 points, eight ahead of second-placed Lyon who host lowly Sochaux also on Sunday.
"We twice had the lead in a game away... If we need to score three or four goals in each game to grab a win it will be complicated," St Etienne midfielder Fabien Lemoine told French TV channel Canal Plus.
Coach Christophe Galtier added: "I am not satisfied with the team's performance during parts of the game. Our defensive work was poor, our teamwork was poor."
Bordeaux's Ludovic Obraniak snatched a late equaliser at home to FC Lorient to earn a 1-1 draw and ruin the 30th birthday celebrations of former Arsenal striker Jeremie Aliadiere who had opeend the scoring for the visitors in the first half.
Lorient stay eighth on 44 points and Bordeaux ninth on 43.
Toulouse midfielder Etienne Capoue, who was dropped from the France squad for the first time under Didier Deschamps for this month's World Cup qualifiers, scored twice and set up another goal to help his mid-table side win 3-2 at lowly Ajaccio.