Villa moved up to 11th in the standings, level with 10th-placed Palace on 16 points. The defeat was Patrick Vieira's first at home since being appointed Palace manager and their first since losing at Liverpool in September.
Villa took advantage of Palace's vulnerability on set-pieces when Ashley Young's corner in the 15th minute was delivered deep into the box, where Matt Targett controlled the ball and shot low through the crowd to score.
Palace did not have a shot on target until the 79th minute when Christian Benteke's acrobatic effort with his back to goal was saved by goalkeeper Emiliano Martinez.
Villa doubled the lead late in the game when a flowing move down the left found John McGinn at the edge of the box and the midfielder curled his shot past the outstretched arms of Vicente Guaita.
Palace scored a consolation in stoppage-time when Cheikhou Kouyate's cross to the near post found Marc Guehi, who poked the ball past Martinez, but Villa held on for the three points.