Jupp Heynckes' men succumbed to their second consecutive defeat at the AWD Arena this year, conceding for the first time in the league since Round 1 of the Bundesliga.
Mohammed Abdellaoue converted a penalty for a foul by Philipp Lahm on Christian Schulz in the first half, and shortly after Jerome Boateng was sent off after a melee on the sidelines.
The 96ers did not stop there, however, as minutes after the restart a deflected shot by Christian Pander put the game beyond Bayern Munich's reach.
The Bavarians went all guns blazing after Hannover was reduced to 10 men midway through the second half as Steven Cherundolo was dismissed. Substitute David Alaba clawed one back for Jupp Heynckes' men, but it was too little, too late.
The match started well for the 96ers as in the 12th minute a quick counterattack saw Abdellaoue break free in the Bavarians' half, but his finish from inside the box hit the left post before going to safety.
Moments later, however, Ron-Robert Zieler could only watch as a stunning drive by Toni Kroos hit the bar. Things took a turn for the worse for Jupp Heynckes' men in the 21st minute, when Lahm brought down Schulz in the box, conceding a penalty.
Abdellaoue duly converted, putting a stop to Bayern's run of nine Bundesliga games without conceding.
Ugly scenes ensued shortly after the goal as Boateng was shown a straight red card in a melee on the touchline, following a foul by Rafinha on Sergio Pinto.
Bayern Munich continue to press and nearly got the equalizer in the 39th minute, when Mario Gomez fired just over from seven yards out after a cross by Thomas Muller. The former Stuttgart striker was presented with another great chance shortly after the restart, but was denied in a one-on-one by Zieler.
Things went from bad to worse for Bayern Munich as in the 50th minute a Pander shot deflected wickedly off Luiz Gustavo, nestling past Manuel Neuer, who could only stand and watch as the ball rolled over the line.
Hannover was reduced to 10 men in the 63rd minute, when Steven Cherundolo picked up his second yellow card for a foul on Franck Ribery.
Bayern Munich threw everything forward and was finally rewarded with a goal seven minutes from the final whistle as Alaba scored after a great run on the left side of the box.
Bastian Schweinsteiger gave a dramatic ending to the game as he hit the right post moments before the final whistle, but the Bavarians lost in the end, and Bayern was subjected to just its second league defeat of the season.