Puyol scored in the 73rd minute as Spain set up an all—European final with the Netherlands on Sunday at Soccer City in Johannesburg.
One of those nations will become the first European nation to win a World Cup outside of Europe.
It will be the first Spain—Netherlands match—up at a World Cup.
Germany failed to reach eighth World Cup final and will now take on Uruguay on Saturday in the third place game in Port Elizabeth.
Each coach made one change from their teams’ quarter—final victories.
German boss Joachim Loew was forced to replace the suspended Thomas Mueller with Piotr Trochowski.
Spain coach Vicente del Bosque finally took his out—of—form striker Fernando Torres out of the starting line—up in favour of Pedro, who has been subbed in three times previously in South Africa and made his first international start.
In front of 60,900 spectators at Durban Stadium, Spain had a slight advantage in ball possession and had the first chance as Pedro sent a through ball to David Villa but German keeper Manuel Neuer rushed out to block off the attempt in the sixth minute.
The Iberians were close eight minutes later with Xavi’s cross finding Puyol but the defender’s header went over the crossbar from the edge of the box.
Germany were unable to create any chances in the first half hour as Loew’s men were too busy avoiding mistakes against the creative Spanish midfield.
Trochowski finally tested Spanish keeper Iker Casillas in the 32nd minute with a long—range blast that the Iberian captain was forced to fend to corner.
Germany were a shadow of their usual attacking style and mustered very little up front though Mesut Oezil went down in the area of stoppage time after contact with Sergio Ramos in hopes of drawing a penalty from the Hungarian referee Viktor Kassai.
Five minutes after the re—start, Xabi Alonso’s long blast sailed just wide right — his third long range attempt of the game and by far closest.
Spain were dangerously close in the 58th but Neuer made a superb stop on Pedro’s long range blast and then Villa was just half a step from hitting home Andres Iniesta’s pass across the mouth of the goal.
Germany finally pushed forward after the hour mark and created a fine chance in the 69th minute with Lukas Podolski’s looping pass finding substitute Toni Kroos, whose one—time attempt was blocked by Casillas.
But Spain broke down the German wall in the 73rd minute on a set piece as Man of the Match Xavi’s corner from the left side found Puyol, who hammered home a header from about 10 yards.
With the Germans giving everything they had to equalise, the Iberians could have ended the game with eight minutes left on a counter attack. But Pedro did not pass over to substitute Torres.