Dortmund now lead the group, two points ahead of defending champions Real Madrid, who drew 3-3 at Warsaw Legia.
Borussia Dortmund booked their place in the last 16 of the Champions League with a 1-0 win over Sporting Lisbon on Wednesday despite suspending striker Pierre-Emerick Aubameyang.
With two games still to play, Dortmund are guaranteed at least a top-two place in Group F.
They now lead the group, two points ahead of defending champions Real Madrid, who drew 3-3 at Warsaw Legia on Wednesday.
But despite the home win, coach Thomas Tuchel was far from pleased.
"We had no self-confidence in any phase of our game," he fumed.
"Defensively we made a lot of mistakes, but we're through after four matches."
Tuchel delivered a shock before kick-off at Dortmund's Signal Iduna Park.
Star striker Aubameyang was suspended "for internal reasons" and his replacement Adrian Ramos hit the first-half winner.
"The coach has taken the decision and it is absolutely correct," Dortmund's CEO Hans-Joachim Watzke told Sky.
The 27-year-old Aubameyang, who has scored 10 goals already this season, is suspended until Thursday and was cut from the match day squad.
"We completely accept there will be speculation, but internal means internal," added Tuchel.
Ramos took Aubameyang's place in a 4-1-4-1 formation.
The Colombia striker needed just 12 minutes to give Dortmund the lead with a looping header in his side's first real attack.
Germany internationals Julian Weigl and Mario Goetze combined in the box, then Matthias Ginter put in a cross from the right flank.
Ramos placed a pinpoint header past Sporting's goalkeeper Rui Patricio into the top right corner.
Sporting exploited the acres of space Dortmund left at the back with Gelson Martins twice going close.
With half an hour gone, only the crossbar denied Dortmund a two-goal cushion.
USA international Christian Pulisic combined with Goetze and crashed his shot off the woodwork.
After the break, Sporting probed the Dortmund defence.
Portugal international Adrien Silva came on for the final half an hour, going close on a few occasions.
Tuchel then closed the game down. He replaced Goetze and Gonzalo Castro with Sebastian Rode and left-back Lukasz Piszczek for the final 20 minutes.
Defensive midfielder Rode filled in for the more creative Castro, Piszczek took over on the right wing from Pulisic, who filled Goetze's attacking midfield role.
Up front, Germany winger Andre Schuerrle, just back from injury, was a constant threat to the Sporting goal as Dortmund held on.
Sporting remain without a win in Germany after one draw and now 12 defeats.
Dortmund maintain their 100 percent home record against Portuguese sides in Europe with five wins from five.
They can now focus on their poor Bundesliga poor and are winless in their last four domestic games.
Borussia host bottom side Legia in their next game and their final group match at Real's Bernabeu stadium, on December 7, is likely to decide the group winner.