The Germans looked to be heading home with a draw after Mame Biram Diouf equalised Radamel Falcao's early strike, but Salvio let fly from 20 yards to leave his side in command.
Both sides went into the game on the back of weekend defeats and sitting eighth in their respective leagues, and it was the hosts who started in style by snatching the lead after eight minutes.
Diouf fouled Mario Suarez on the right flank and from Gabi's resulting free-kick Falcao jumped highest to steer a header past Hannover goalkeeper Robert Zieler and put his side in front.
The Germans were struggling to make an impression with Christian Pander hitting the Atletico wall with a dangerous free-kick, while Atletico threatened again when Diego Godin headed over the bar after 22 minutes.
Adrian Lopez fired just wide and Falcao sent another header just over the bar from close-range as the hosts continued to press, but their failure to claim a second goal cost them dear in the 33rd minute.
In one of their rare forays deep into the Atletico half, Lars Stindl found space to cross from the right flank and former Manchester United striker Diouf side-footed past Thibaut Courtois from six yards.
Falcao missed the target again with the first chance of the second half, and Hannover came close to grabbing a shock lead when Courtois was forced to punch away a dangerous Pander corner.
Hannover continued to press, with Courtois tipping a Diouf effort around the post in the 62nd minute, before Atletico made what would turn out to be their key change with Salvio replacing Lopez in the 70th minute.
Falcao missed with an overhead kick before Atletico finally made their breakthroguh in the 89th minute when Salvio curled a right-footed shot into the top corner of the net from 20 yards.
Zieler kept Hannover in with a chance for the second leg when he made a superb save to deny another substitute, Diego Ribas, who fired another overhead kick towards goal in injury time.