Marco Richter scored twice in the second half.
Julian Brandt had given the visitors a 31st-minute lead at the Olympiastadion, but Ishak Belfodil had equalised early in the second half.
Dortmund, missing England midfielder Jude Bellingham through suspension, then were left stunned when Marco Richter struck twice.
Although Steffen Tigges headed in with seven minutes left, there was no grandstand finale as Tayfun Korkut’s side held out to move up to 11th.
Jesper Lindstrom’s first-half goal proved enough to give Eintracht Frankfurt a 1-0 win over derby rivals Mainz.
Strugglers Arminia Bielefeld picked up a second-successive league win after a 2-0 victory at RB Leipzig despite having a man sent off.
Janni-Luca Serra’s first Bundesliga goal put the visitors ahead in the 57th minute, but substitute Fabian Klos was then shown a straight red card for a late challenge given after a VAR review.
Japanese midfielder Masaya Okugawa, though, secured all three points with 15 minutes left.
Bottom side Greuther Furth battled to a goalless draw at home against Augsburg, while Max Kruse’s first-half strike gave Union Berlin a 1-0 win at Bochum.
Hoffenheim missed the chance to move third after they needed a stoppage-time equaliser from defender Kevin Akpoguma to snatch a 1-1 draw at home against Borussia Monchengladbach, who had taken the lead through Breel Embolo.
Barcelona ended a three-game winless run as a late goal from Nico Gonzalez secured a 3-2 victory over Elche in their LaLiga game at the Nou Camp.
Ferran Jutgla headed in his first goal for Barca in the 16th minute, with Gavi swiftly adding a second.
Elche struck twice in as many minutes after the hour through Tete Morente and Pere Milla Pena’s diving header.
Substitute Gonzalez, though, crashed the ball in with just five minutes left as Xavi’s men climbed to seventh.
In Saturday’s late match, Lucas Ocampos scored a last-minute winner as Sevilla beat Atletico Madrid 2-1 to close to within five points of leaders Real Madrid.
Ivan Rakitic gave the hosts an early lead before Felipe’s header had Atletico level at half-time, only for Ocampos to settle matters.
Earlier, Gerard Moreno scored twice as Villarreal won 3-1 at 10-man Real Sociedad, while Rayo Vallecano beat strugglers Alaves 2-0 to sit fourth.
In Serie A, England forward Tammy Abraham scored twice as Roma won 4-1 at Atalanta.
Abraham’s deflected shot gave Roma the lead inside the opening minute, with Nicolo Zaniolo adding a second ahead of half-time.
Atalanta saw Duvan Zapata’s header ruled out by VAR for offside and Chris Smalling knocked in Roma’s third from a free-kick with 18 minutes left before Abraham grabbed a late second.
Juventus sit sixth, level on points with Roma, after a 2-0 win at foggy Bologna.
Alvaro Morata fired the visitors into an early lead and a long-range deflected effort from Juan Cuadrado secured all three points with 20 minutes to go.
Saturday’s late match saw strugglers Cagliari beaten 4-0 by Udinese at Sardegna Arena, where they finished with 10 men.
Gerard Deulofeu scored either side of half-time, the first a stunning free-kick, with Cagliari midfielder Razvan Marin dismissed just after the hour for a second caution.
Ligue 2 Nancy had three players sent off, but still booked their place in the last 32 of the Coupe de France with a penalty shoot-out win over Troyes.
The second-tier’s bottom club saw Maxime Nonnenmacher, Saliou Ciss and Souleymane Karamoko all dismissed.
Brandon Domingues had given Troyes the lead shortly before half-time, with Andrew Jung equalising in the 64th minute, but the tie was eventually settled on spot-kicks as Nancy won 4-2.
In Saturday’s only all Ligue 1 tie, Rennes beat Lorient 1-0 with a first-half goal from defender Warmed Omari.
League champions Lille saw off second division Auxerre 3-1 and Nantes eventually got past Sochaux 5-4 on penalties after it was goalless at full-time.
Clermont ended the hopes of seventh-tier Nimes Chemin Bas with a 4-0 win in another game which was marred by crowd trouble.