Spain booked a last-16 World Cup clash with hosts Russia after a last-gasp 2-2 draw against already eliminated Morocco in Kaliningrad.
The 2010 champions started Monday on top of Group B but seemed certain to slip below their Iberian rivals in the final table as both matches entered stoppage-time with Portugal and Morocco leading.
Spain went behind when Andres Iniesta and captain Sergio Ramos somehow allowed Khalid Boutaib to seize upon a loose ball and run clear to score Morocco's first goal at the finals since 1998.
Iniesta soon made amends, though, skipping through the Morocco defence to set up Isco for a quickfire leveller, with La Roja unable to break down their opponents despite dominating.
When Morocco substitute Youssef En-Nesyri got up highest to thump home a brilliant header from a Faycal Fajr corner with nine minutes to go, Herve Renard's men looked set to claim a memorable victory.
But after another substitute, Iago Aspas, tucked in a superbly improvised finish that survived a lengthy VAR review for offside, while Iran struck a late penalty, La Roja somehow finished top of the group.
Spain showed signs of their bewitching best in possession but Fernando Hierro's side must show serious improvement in the knockout stages if they have ambitions to claim their second World Cup.
WHAT DRAMA. go through to face on Sunday. June 25, 2018
A testy start to the game saw Gerard Pique perhaps fortunate to avoid punishment for a two-footed lunge on Boutaib.
Morocco's lone forward then gave his side a shock lead in the 14th minute, capitalising on a terrible mix-up between Ramos and Iniesta.
The duo's shared lapse in concentration allowed Boutaib to steal possession on the halfway line, burst through on goal and slot a neat finish through the legs of David de Gea.
The first goal at a in 20 years...Nice one, ! 0-1 June 25, 2018
That goal proved Spain's wake-up call, Iniesta and Diego Costa combining quite brilliantly to set up Isco for a slammed close-range finish that levelled the scores five minutes later.
Boutaib scampered clear again in the 25th minute when Morocco took a quick throw-in, but De Gea - beaten from all four shots on target he had faced at the World Cup - stayed tall to save.
Morocco threatened to lose their discipline with Nordin Amrabat, Manuel da Costa and Moubarak Boussoufa all booked in a tempestuous three-minute period before Sergio Busquets planted a free header from Isco's corner over the crossbar.
4 - Morocco were shown four yellow cards in the first half agaist Spain - since 1966, the only other occasion of a team having more in the first half of a World Cup game was also by Morocco (5 v Netherlands in 1994). Crunch. June 25, 2018
Pique was lucky again early in the second half when the defender appeared to handle the ball in the box, with Morocco agonisingly close to regaining the lead in the 55th minute.
Given space to let fly from at least 25 yards out, Amrabat's strike had De Gea completely beaten but the goalkeeper gratefully saw the ball bounce off the woodwork.
Isco thought he had added to his nine Spain goals scored since the start of 2017 with his looping header dipping under the crossbar, but Romain Saiss made a sensational clearance, Pique heading wide from the resulting Isco corner.
Hierro introduced Marco Asensio and Aspas as Spain sought a late winner but Morocco's determined defending held them at bay.
Although only Iran shocking Portugal could have dumped Spain out, En-Nesyri thundered home a stunning header that left De Gea helpless again.
And when Aspas turned home Dani Carvajal's cross after a short corner - the goal given by VAR after a long delay, Spain were level in the first minute of added time.
With more high drama elsewhere - Karim Ansarifard smashing home an equalising spot-kick for Iran - Spain leapfrogged Portugal to Group B's summit and will now play Russia in the last 16.
Get the best features, fun and footballing frolics straight to your inbox every week.
Thank you for signing up to Four Four Two. You will receive a verification email shortly.
There was a problem. Please refresh the page and try again.