Cristian Romero sold himself with a rash dive on Ollie Watkins, missing the ball to allow the hosts to trot forward and go wide to Leon Bailey for a cutback that Jacob Ramsey slotted home.
The Tottenham gameplan was to hit Villa on the counter yet they fell foul time and again by their offside trap, leading to five flags and zero shots in the first half alone.
Bailey tested Fraser Forster with a decent low effort before Emi Buendia hit the top of the crossbar, leaving the away side lucky to be only a goal down at the break.
Shortly after the break, Tottenham finally forged a chance to test Emi Martinez as Villa were caught under pressure and Harry Kane was teed up for a one-on-one effort, which was fired too close to the goalkeeper.
Dejan Kulusevski shot narrowly wide of the far post after his introduction, which continued to liven up Spurs’ performance as the second half dragged on with Villa’s advantage still slim.
It would be via another rash moment from Romero that sealed the result as he fouled Watkins in a central position, 25 yards out. Douglas Luiz stepped up to curl home after 71 minutes, via a soft palm from Forster.
Harry Kane won and converted a late consolation from the spot for a result that leaves Tottenham above Villa on goal difference, with a two-point lead on Brighton in eighth - who have three games in hand.