Kalu Uche opened the scoring in Durban for the African team in the 12th minute and almost doubled his side’s lead shortly after the half-hour mark but his powerful strike smashed off the near post.
Lee Jung-soo equalised in the 38th minute and then Park Chu-young’s free-kick early in the second half turned the match on its head.
Korea shot themselves in the foot when substitute Kim Nam-Il brought down Chinedu Obasi inside the area midway through the second half. Ayegbeni Yakubu, having missed the easiest of tap-ins seconds earlier, made amends by restoring parity from the penalty spot.
The outcome sealed second spot in the group for Korea and a second-round match against Uruguay on Saturday in Port Elizabeth.
Argentina, who beat Greece 2-0, topped Group B.
Needing a win to progress to the next round, Nigeria coach Lars Lagerback made four changes to his starting XI from the side that lost 2-1 against Greece, one of which saw Portsmouth striker Kanu included after failing to feature in his side’s opening two defeats.
South Korea enjoyed a strong start and almost took the lead after two minutes, but Bolton’s Lee Chung-yong directed his close-range effort just wide of the far post.
Shortly after, Celtic midfielder Ki Sung-yueng’s right-footed strike from 25 yards went over the bar as South Korea got closer.
But it was Nigeria who took a surprise lead soon after.
In their first purposeful attack, Chidi Odiah went on a superb run and crossed towards the heart of the area, where Uche beat Cha Du-ri to the ball and fired past Jung Sung-ryong.
Uche’s free-kick went over the bar in the 20th minute and, seconds later, Obasi struck wide from the edge of the area as Nigeria looked to double their lead.
Nigeria were gaining confidence and, on the half-hour mark, Obasi surged inside the area but his central shot was saved by Sung-ryong.
Shortly after the half-hour mark, Park Chu-young’s free-kick went wide as Korea struggled to find the finishing touch.
But the Koreans did find the equaliser before the break when Ki Sung-yueng’s free-kick towards the far post was met by Lee Jung-soo, whose first-time finish beat Nigeria goalkeeper Vincent Enyeama.
Both teams went into the break with all to play for.
Korea picked up where they left off after the interval and went ahead in the 48th minute.
Park Chu-young’s free-kick swerved towards the post and Enyeama failed to get a touch.
Lagerback introduced Obafemi Martins to replace Kanu in the 56th minute in the hope he could spark his team to life.
On the hour mark, Yeom Ki-hun’s dangerous cross towards the area found Park Chu-young and his seemingly goalbound strike was met by a fine save from Enyeama.
Nigeria should have pulled level seconds later after Uche set up an unmarked Yakubu, but he inexplicably tapped wide of an open goal from two yards – much to the horror of his team-mates.
Yakubu made amends soon after by firing a spot-kick past Jung Sung-ryong.
Park Ji-sung fired wide of the near post with 15 minutes remaining while, at the other end, Martins surged inside the area and his chip beat Jung Sung-ryong but went wide.
Korea defended deeply thereafter but held on for a vital point.