James Chester scrambled the opener in the 20th minute before Tammy Abraham grabbed the second just after the hour.
The victory was completed when substitute Glenn Whelan’s long range effort was helped in by goalkeeper Darren Randolph with seven minutes left.
It means that Middlesbrough, who disappointed from start to finish and only truly went close when Jordan Hugill hit the bar, are four points behind the automatic promotion spots.
Boro manager Tony Pulis said: “On the day we weren’t good enough, not bright enough. Right from the start, Marcus Tavernier ran round the wrong side of Jordan, and from that moment on we didn’t look bright enough, didn’t play as well as we can do. The difference against these teams, every player has to be on it. They were better than us. Full stop.
“People can have a go at Randolph, others, I am not. We look at the league, and we look at today and we got beaten badly. I can pick holes in everything, from the back to the front. I am not going to because I don’t think they deserve it.
“Darren should do better in both goals but he has been fantastic, a fantastic lad as well. I have been here nearly a year, he is a great pro. They are disappointed with their performance today. We will dust ourselves down and we go again.”
Middlesbrough: Randolph, Fry (McNair 59), Flint, Batth, Friend, Clayton, Besic (Assombalonga 62), Downing, Howson, Tavernier (Braithwaite 62), Hugill. Unused substitutes: Konstantopoulos, Ayala, Saville, Wing.
Aston Villa: Nyland, Elmohamady, Tuanzebe, Chester, Taylor, El Ghazi, McGinn (Whelan 82), Hourihane, Bolasie (Kodjia 73), Grealish, Abraham (Hogan 82). Unused substitutes: Jedinak, Bunn, O’Hare, Revan.
Referee: A Davies (Hampshire).