Johan Manzambi put Villa ahead deep into first-half stoppage time, before Nicolas Jackson doubled the lead just after the hour mark.
Emi Buendía made it 3-0 with 11 minutes to go, putting the game seemingly out of reach. Tottenham responded late on, though, with Conor Gallagher pulling one back in the 86th minute and Jan Paul van Hecke adding a second deep into stoppage time, but Villa held on for the win.
The result lifts Aston Villa up to 15th in the Premier League table, having now won just once this season but showing signs of life after a difficult start.
Tottenham remain 18th, with just two wins from five matches, and will be frustrated to have let such a commanding lead slip so close to a result, even in defeat.
Photo: Alex Pantling/Getty Images