Tottenham looked down and out at half-time after skipper Matthijs de Ligt’s fifth-minute header and a superb 35th minute effort by Hakim Ziyech put Ajax in complete command of the tie.
The Dutch side had won the first leg 1-0 in London last week.
But 24 hours after Liverpool’s miracle comeback to beat FC Barcelona 4-3 on aggregate, Tottenham produced their own heroics to reach their first European Cup final match.
The celebratory mood in the jam-packed Johan Cruyff Arena turned to one of nail-biting tension after Brazilian Moura scored twice in four minutes early in the second half.
The goals had put Spurs within a goal of going through.
Ziyech hit the post for Ajax who appeared to have weathered the storm, but Moura struck past Andre Onana to flatten the Ajax players and send the away fans into delirium.
Tottenham, playing in their first European Cup semi-final for 57 years, arrived in Amsterdam on a run of woeful form having suffered three successive defeats in all competitions.
Ajax, by contrast, were buoyant after winning the Dutch Cup final at the weekend, and they began on the front foot with Dusan Tadic forcing a flying save from Hugo Lloris.
When the resulting corner kick came, Tottenham’s marking was non-existent as De Ligt glanced his header home.
It did not change the basic equation for Tottenham who knew they needed to score twice and Mauricio Pochettino’s side, so disappointing last week, responded in spirited fashion.
Son Heung-min, back after missing the first leg because of suspension, deceived goalkeeper Onana with a cross that hit the post and Son then forced another save from a flowing move.
But Ajax were cool, calm and collected and bided their time before striking again in devastating fashion.
Tadic, who moments earlier had dragged a shot just wide, was released down the left and he cut the ball back perfectly for Ziyech to whip a left-footed shot inside the far post.
Tottenham sent on veteran striker Fernando Llorente for midfielder Victor Wanyama for the start of the second half and pushed Ajax back.
Dele Alli was denied by Onana but Tottenham grabbed a lifeline soon after.
That was when a rapid counter-attack ended with Moura converting in style after sprinting through to meet Alli’s pass in the 55th minute.
Four minutes later the impossible began to look possible as Onana saved brilliantly from Llorente but Ajax failed to clear the ball and Moura fired through a crowd.
In a rip-roaring finale played out in nerve-shredding tension, Ziyech almost restored Ajax’s lead.
This was when his slow shot thudded against the post while a desperate lunging block by De Lijt denied Moura.
When ex-Ajax defender Jan Vertonghen headed against the crossbar late on it seemed Tottenham would fall just short, as they did 57 years ago in their only other European Cup semi-final.
But there was one final twist.
A high ball pumped forward was flicked to Moura by Alli and the Brazilian’s first-time shot found the corner.