The home side looked to have moved onto the shoulders of third-placed Valencia, who were beaten 4-0 by Zaragoza, but they slipped up with everything in their advantage.
Villarreal were far from their best and Sporting dominated possession for long spells but lacked the finesse in front of goal.
Sporting gifted the opening goal to Giuseppe Rossi with keeper Ivan Cuellar dropping a cross at the feet of the striker who just had to place the ball into an empty net.
Sporting were reduced to ten men when Jose Angel foolishly received a second yellow card for complaining to the referee and then Rafael Sastre was also given his marching orders in the final minute for upending Rossi as last man.
It all looked to have gone against Sporting until deep in stoppage time when Gonzalo Rodriguez conceded a penalty and Castro coolly struck the ball home from 12 yards.
In Sunday's late match leaders Barçelona face Sevilla looking to restore their seven point lead at the top after Real Madrid beat Hercules 2-0.
Earlier, Espanyol boosted their European hopes with a 2-0 win over 10-man Deportivo la Coruna.
The home side had lost six of their previous seven games before the visit of the Galician side, but after a tight opening spell the match turned in Espanyol's favour with the dismissal of Pablo Alvarez shortly before half-time.
Ivan Alonso, who had been brought on to add ammunition to the attack, had a shot saved from point blank range but broke the deadlock minutes later.
Deportivo never looked like finding an equaliser and Joan Verdu added a touch of quality to the game with a fine strike into the top corner from 20 yards.
Bottom side Malaga pulled off a surprise 2-0 win away to Real Sociedad with Sergio Duda, who returned after missing six games, sending them on their way.
Sociedad dominated possession of the ball after the break but it was Malaga who scored again through Jose Rondon.
Struggling Osasuna followed up their defeat over Malaga last weekend with a commanding 3-1 victory over Racing Santander. Kike Sola, Javad Nekounam and Fernando Soriano put them on the road to three more points with Markus Rosenberg netting a consolation.
An Ivan Ramis goal earnt Mallorca a draw against Levante, who went ahead through Juanlu Gomez, and brought to an end their four match winning run at home.
Last gasp penalty earns Sporting a point
Advertisement