Hannover hit Bayer Leverkusen's hopes of keeping pace with Bundesliga leaders Bayern Munich as Szabolcs Hustzi scored two penalties to secure a narrow victory for the hosts.
Leverkusen went ahead after two minutes through Gonzalo Castro but Huszti equalised from the spot in the 20th minute.
Mame Biram Diouf gave Hannover the lead 2-1 in the 57th minute before Stefan Kiessling levelled 60 seconds later, but Huszti converted another penalty in the 69th minute.
A day after head coach Mirko Slomka extended his contract until 2016, Hannover collected their fifth home victory of the season to move to 23 points.
Leverkusen saw their four-game winning streak snapped to remain on 30 points in second place - 11 points behind runaway leaders Bayern.
Leverkusen raced ahead after just two minutes with some superb passing as Andre Schurrle fed Lars Bender, who centred for Castro to fire home.
Hannover equalised after 20 minutes from the spot through Huszti after the Hungarian was fouled in the box by Manuel Friedrich.
The hosts then took the lead 12 minutes after the re-start with a fine effort as Jan Schlaudraff's long diagonal pass from the right found a charging Diouf and the Senegalese headed home.
Leverkusen answered just a minute later as Kiessling headed home Bender's pass from the right side, before visiting goalkeeper Bernd Leno made a fine save from Didier Ya Konan's shot to keep the scores level.
But Leno was beaten a second time from the spot in the 69th minute after Huszti again won and converted a spot-kick to seal the points for his side.