Jason Kipnis had two hits and two RBI for the Indians, who took two of three from the Tigers and have won three of their last four overall.
Zach McAllister gave up three runs -- two earned -- on nine hits with two walks and seven strikeouts over 6 1/3 innings.
Tigers' starter Justin Verlander (11-6) gave up five earned runs on nine hits over seven innings, walking two and striking out four.
Detroit carried a 3-1 lead into the bottom of the seventh, when Santana led off with his eighth home run and Hafner immediately followed with his 10th. Jose Lopez reached on a single and then went to second on a two-out single by Shin-Soo Choo.
Cabrera drove in Lopez with the go-ahead run and Choo then scored on a single by Kipnis.
It was the first time in more than a week that the Indians scored more than three runs.
Notable deaths of 2014 [PHOTOS]
Michael Sam cut from the Dallas Cowboys