Firmino had the chance to maintain the Reds’ good record when he was put through by James Milner but Villarreal keeper Sergio Asenjo tipped his effort onto the post.
The game appeared to be heading to a stalemate which would have suited the visitors fine after what was not one of their best displays under Klopp.
But as the game headed into the second of three added minutes a lofted ball fell to the feet of Denis Suarez with Moreono out of position and he slid across to Adrian, who turned home with Mignolet already beaten.
Villarreal are looking to reach their first European final at their fourth outing in the semi-finals. They will feel much more confident of doing it now.
VILLARREAL (4-4-2): Asenjo; Gaspar, Bailly (Musacchio 76), Ruiz, Costa; Dos Santos (Castillejo 72), Pina, Bruno, Suarez; Bakambu, Soldado (Lopez 74).
Subs: Areola, Samu, Trigueros, Rukavina.
LIVERPOOL (4-3-3): Mignolet; Clyne, Lovren, Toure, Moreno; Lucas, Allen, Milner; Coutinho (Ibe 46), Lallana, Firmino (Benteke 90).
Subs: Ward, Sturridge, Skrtel, Smith, Chirivella.
REFEREE: Damir Skomina (Slovenia).