Last year's finalists carried a 4-2 aggregate lead into the home leg but Hulk reduced the deficit when he fired in a sensational 25-yard shot.
Sebastian Kehl restored the advantage with a header shortly before half-time.
Venezuela striker Jose Rondon's 73rd-minute header ensured a nervy final few moments for the German side.

Kehl's still got it

Michael Zorc (35 years v Galatasaray in 1997) is the only player older than Sebastian Kehl, 34, to score a Champions League goal for Dortmund
Dortmund deserved to lose the match but were the better team over the two ties. They will, however, need to play far better in the quarter-finals if they are going to advance further. And they will have to do without leading striker Robert Lewandowski, who will be suspended for the first leg after an early booking for deliberate handball.
Jurgen Klopp's side have been decimated by key injuries this season and at times on Wednesday the absence in quality showed.
They stuck to type by dominating possession for long periods, but the sharp passing that has also been their trademark under their personable coach was missing.
"They were fresh, they took risks because they had to and we had to put a huge amount of work into it," said Klopp.
Nevertheless they are through at the expense of Zenit, whose hopes of progressing were severely damaged by the defeat in the first leg.
Coach Luciano Spalletti was subsequently sacked and eventually replaced by former Chelsea and Tottenham coach Andre Villas-Boas,who begins his tenure on Thursday.
Hulk scores for Zenit
Hulk scored a fabulous goal for Zenit in the first half at the Dortmund Stadium
The Portuguese would have been buoyed by Zenit's start and the forward threat of Brazilian Hulk.
The 27-year-old, who will be hoping he is involved with the national team at the World Cup, gave the Russian club hope when he struck a rocket of a shot that swerved at the last moment to beat keeper Roman Weidenfeller.
Zenit should have built on the goal but instead allowed Dortmund to come back into the game.
The home side had a golden chance prior to the goal when summer signing Pierre-Emerick Aubameyang nodded wide from three yards, however captain Kehl made no mistake with a header six minutes from the break.
Full-back Marcel Schmelzer was the provider for the 34-year-old, whose effort was inadvertently pushed into the net by keeper Vyacheslav Malafeev.
Zenit showed plenty of determination in the second half but little guile in Dortmund's final third.
They breached the last line of defence again with one of their few opportunities when substitute Rondon stooped low to head in Domenico Criscito's cross from the left.
There were still 17 minutes remaining for Zenit to get the two goals required, but they only managed one more effort on goal through Axel Witsel, whose low strike was turned round the post by the competent Weidenfeller.
"We did not communicate at times. There was nervousness, you could see it. That is why we deserved to go through. The players battled extremely hard," added the Dortmund coach.

LINEUP, BOOKINGS (4) & SUBSTITUTIONS (6)

Borussia Dortmund

  • 01 Weidenfeller
  • 26 Piszczek
  • 29 Schmelzer (Durm - 77' )
  • 18 Sahin
  • 25 Papastathopoulos
  • 15 Hummels
  • 17 Aubameyang (Hofmann - 91' )
  • 05 Kehl Booked
  • 09 Lewandowski Booked
  • 10 Mkhitaryan (Jojic - 69' Booked )
  • 19 Großkreutz

Substitutes

  • 02 Friedrich
  • 07 Hofmann
  • 14 Jojic
  • 20 Langerak
  • 21 Kirch
  • 23 Schieber
  • 37 Durm

Zenit St Petersburg

  • 16 Malafeev
  • 22 Anyukov
  • 04 Criscito
  • 20 Faizulin (Smolnikov - 84' )
  • 14 Hubocan
  • 06 Lombaerts Booked (Neto - 45' )
  • 07 Hulk
  • 28 Witsel
  • 11 Kerzhakov (Rondón - 63' )
  • 10 Danny
  • 17 Shatov

Substitutes

  • 01 Lodygin
  • 13 Neto
  • 18 Zyryanov
  • 19 Smolnikov
  • 24 Lukovic
  • 29 Rondón
  • 44 Tymoshchuk
Ref: Alberto Undiano Mallenco

MATCH STATS

Possession52%48%90minsBorussia DortmundZenit St Petersburg

Shots

128

On target

35

Corners

81

Fouls

1814

Live Text Commentary

Full time
Full TimeMatch ends, Borussia Dortmund 1, Zenit St Petersburg 2.
90:00+3:03Full time
Full TimeSecond Half ends, Borussia Dortmund 1, Zenit St Petersburg 2.
90:00+1:57
Hulk (Zenit St Petersburg) wins a free kick on the left wing.
90:00+1:57
Foul by Lukasz Piszczek (Borussia Dortmund).
90:00+0:32
Delay over. They are ready to continue.
90:00+0:27Substitution
SubstitutionSubstitution, Borussia Dortmund. Jonas Hofmann replaces Pierre-Emerick Aubameyang.
89:35
Delay in match Tomas Hubocan (Zenit St Petersburg) because of an injury.
89:02
Alexander Anyukov (Zenit St Petersburg) wins a free kick in the defensive half.
89:02
Foul by Robert Lewandowski (Borussia Dortmund).
88:25
Attempt saved. Oleg Shatov (Zenit St Petersburg) right footed shot from outside the box is saved in the centre of the goal.
87:14
Corner, Zenit St Petersburg. Conceded by Roman Weidenfeller.
87:08
Attempt saved. Axel Witsel (Zenit St Petersburg) right footed shot from outside the box is saved in the bottom left corner.
86:03
Axel Witsel (Zenit St Petersburg) wins a free kick in the defensive half.
86:03
Foul by Pierre-Emerick Aubameyang (Borussia Dortmund).
84:50
Foul by Hulk (Zenit St Petersburg).
84:50
Lukasz Piszczek (Borussia Dortmund) wins a free kick in the defensive half.
84:24
Attempt blocked. Hulk (Zenit St Petersburg) left footed shot from outside the box is blocked.
83:52
Hulk (Zenit St Petersburg) wins a free kick on the left wing.
83:52
Foul by Milos Jojic (Borussia Dortmund).
83:39
Danny (Zenit St Petersburg) wins a free kick in the attacking half
.