Ett dåligt spelande Manchester United skapade knappt alls målchanser i matchen, men lyckades trots det ta sin första seger i höstens Champions League.
Villareal tog ledningen genom Paco Alcacer i början av andra halvleken.
Efter en timmes spel serverade Bruno Fernandes en fin frispark till Alex Telles, som med ett volleyskott utanför straffområdet kvitterade till 1–1.
Under den femte tilläggsminuten lyckades Cristiano Ronaldo skjuta in ManU:s 2–1-segermål från liten vinkel.
Ronaldo spelade sin 178:e match i Champions League och toppar nu den statistiken före Iker Casillas. Ronaldo har också gjort flest mål i turneringen.
Krisen i Barcelona växer
FC Barcelona gick på sin andra klara förlust i rad i Champions League då ett tätt försvarande Benfica tog en 3–0-seger över den spanska storklubben. Efter en ny dålig match av Barcelona kan den nederländska tränaren Ronald Koeman sitta löst på sin post.
Darwin Nunez gav Benfica ledningen redan i den tredje spelminuten. I den andra halvleken utökade Rafa Silva till 2–0 medan Nunez fastställde slutresultatet 3–0 på straff med sitt andra mål för kvällen.
Juventus besegrade Chelsea i toppmötet
I H-gruppens toppmatch vann Juventus över Chelsea med 1–0. Matchens enda mål gjordes av Federico Chiesa i början av den andra halvleken. Juventus har vunnit båda sina matcher i gruppen, medan Chelsea nu åkte på sin första förlust.
I gruppens andra match tog Zenit från S:t Petersburg en 4–0-seger över Malmö FF. Skadade Niklas Moisander fanns inte med i Malmös trupp.
Onsdagens resultat i Champions League:
Atalanta – Young Boys 1–0 (0–0)
Zenit St Petersburg – Malmö FF 4–0 (1–0)
Bayern München – Dynamo Kiev 5–0 (2–0)
Benfica – Barcelona 3–0 (1–0)
Manchester United– Villarreal 2–1 (0–0)
Salzburg – Lille 2–1 (1–0)
Wolfsburg – Sevilla 1–1 (0–0)
Juventus – Chelsea 1–0 (0–0)