Goals from Max Kruse and Jonathan Schmid followed an own goal from Christian Schulz as Christian Streich's side moved level on points with fourth-placed Schalke, behind the Royal Blues only on goals scored in the Bundesliga.
Konstantin Rausch's goal was not enough for Hannover, whose four-point deficit on the top six could increase this weekend, leaving them with a mountain to climb over the last five games of the season if they are to make it into Europe next season.
Freiburg had some good early chances to take the lead with Kruse volleying off target and then just failing to make contact with a dangerous ball at the far post.
Kruse then struck the outside of the post before a bizarre goal gave the hosts a 25th-minute lead.
Schmid's cross did not appear to be too dangerous, but Ron Robert Zieler failed to clear it and Schulz, in trying to cover his own goalkeeper's failings, contrived to turn the ball into his own goal.
The lead lasted just 10 minutes before Hannover struck back with their first real attack on goal.
Mame Diouf pounced on a weak backwards header from Pavel Krmas and got to the ball before Freiburg goalkeeper Oliver Baumann.
He squared for Rausch, who drilled the ball in past Krmas.
Freiburg regaining the lead before the interval with Kruse finally hitting the target and seeing the net ripple in the 44th minute as the Hannover defence backed off.
Schmid was denied a third Freiburg goal by an excellent save by Zieler early in the second half as Freiburg pushed forwards in search of a two-goal cushion.
Zieler made excellent saves from Schmid again and then from Daniel Caligiuri, who turned the rebound onto the post, before Schmid finally got his reward.
Zieler nearly kept his powerful shot out, but the ball still managed to trickle over the line.
Freiburg did not stop attacking, sensing that one more goal would take them above Schalke into fourth place, but they had to settle for a 3-1 win which nevertheless gives them a four-point advantage over Borussia Monchengladbach in seventh.