Turkey beat Croatia 3-1 on penalties after their Euro 2008 quarter-final finished 1-1 following extra-time on Friday.
Turkey will meet Germany, who beat Portugal 3-2 on Thursday, in the first semi-final in Basel on Wednesday.
Extra-time had finished in dramatic fashion with two goals in the last minute.
Ivan Klasnic headed Croatia in front at the near post after a good run and cross by Luka Modric in the 119th minute.
But there was still time for comeback kings Turkey, who twice rallied from behind to win in the group stages, to equalise in breathtaking style as Semih Senturk's left-foot shot took a wicked deflection to beat Stipe Pletikosa.
Overall the Croatians had the better of the chances with Turkey weakened by a string of injuries plus suspensions to keeper Volkan Demirel and defender Mehmet Aurelio.
The Turks struggled at first with Croatia's pace and movement, only really threatening early in the match.
The opening chance came in the fifth minute when Turkey playmaker Hamit Altintop's low drive from 25 metres flew wide.
Slaven Bilic's Croatia soon found their stride and repeatedly managed to get in behind the Turkish defence on the flanks through clever passing.
One such occasion led to the best opportunity of the half in the 19th minute when Luka Modric's low cross found striker Ivica Olic close in but his sliding effort rattled the bar under pressure from keeper Rustu Recber.
Niko Kranjcar then headed the rebound over to the anguish of the Croatian contingent of fans inside the noisy Ernst Happel Stadium, where several flares were lit during the game.
Mehmet Topal sent a 30-metre piledriver just wide towards the end of the first period in a rare effort for the Turks.
Croatia went close at the start of the second half when Gokhan Zan's weak back header let in Olic, who nodded over Rustu but failed to add the finishing touch with two defenders on the line.
Olic had two more chances and Darijo Srna forced Rustu into two saves from free kicks late in the 90 minutes but Turkey hung on to take the game into extra time during which substitute Semih Senturk shot over and Tuncay Sanli fired narrowly wide.