Hanover's Szabolcs Huszti was awarded two penalties and converted both himself to help his team to their first win in three games and lift them to 10th on 23 points, days after coach Mirko Slomka signed a contract extension to 2016.
Leverkusen, second on 30 with Bayern on 41, got off to a flying start after Gonzalo Castro drilled in a cutback from Lars Bender after two minutes on a soaked and heavy pitch.
Huszti drew the hosts level in the 20th minute, sending Bernd Leno the wrong way to convert a penalty after he was brought down by Manuel Friedrich.
Europa League competitors Hanover then took the lead as forward Mame Diouf, left wide open in the box, headed in a Jan Schlaudraff cross in the 57th.
Stefan Kiessling retaliated instantly with his 10th goal of the season, a powerful header, but it was the hosts who remained more aggressive.
The pressure paid off with Huszti awarded a second penalty when Stefan Reinartz clumsily brought him down. The 29-year-old beat Leno again to hand his team their first win in three games.
"I am happy it worked out with the victory today," said Slomka after his 100th game on the Hanover bench. "This win was really good for us. You could see our battling attitude and we needed that against tough Leverkusen."
In the only other game on Sunday, Venezuelan Juan Arango's outrageous lob from about 40 metres sealed Borussia Moenchengladbach's 2-0 win over Mainz 05 to move up to eighth on 24 points.
Substitute Mike Hanke had put Gladbach into the driving seat, tapping in at the far post.
Bayern Munich eased past Augsburg 2-0 on Saturday to stay in control a week before the winter break with their 13th victory in 16 league games.
Champions Borussia Dortmund lost 3-2 to VfL Wolfsburg after a controversial penalty and red card to defender Marcel Schmelzer. They stay third on 27 points.