The Oranje took the lead when Giovanni van Bronckhorst lashed in, only for Diego Forlan to level for Uruguay from long range before halftime.
Wesley Sneijder restored the Dutch's lead despite striker Robin van Persie appearing to be offside, and an Arjen Robben header made 3-1 three minutes later.
Maxi Pereira curled in a shot from the edge of the penalty area in injury time to set up a late rally, but the Dutch held on to earn a final with Spain or Germany.
Goalscorers1-0 - Van Bronckhorst, 18
1-1 - Forlan, 41
2-1 - Sneijder, 70
3-1 - Robben, 73
3-2 - Pereira, 90+2