Jos Hooiveld’s late strike earned Millwall their first win at The Den since October.
Hooiveld prodded home Magaye Gueye’s low drive in the 87th minute, after Gueye had cancelled out Alou Diarra’s strike for the Addicks.
Charlton had skipper Chris Solly dismissed midway through the first half for deliberate handball in the box, but Stephen Henderson saved Lee Gregory’s resulting penalty.
The result moved Millwall up to 22nd in the Sky Bet Championship table, just four points behind Rotherham, while Charlton remained 11th and without a win over the Lions since 1996.
Millwall boss Neil Harris named an unchanged line-up from the 2-2 draw at Brentford last time out and his side had the best of the early exchanges.
The hosts almost went ahead on four minutes, but Ed Upson’s brilliant ball over the top narrowly evaded the outstretched leg of Gregory.
Solly found his name in the book after just 10 minutes after a coming-together with Gregory, as the visitors struggled to get a foothold in the game.
Upson should have put the home side ahead on 18 minutes, but the unmarked midfielder headed just over from Dan Harding’s dangerous cross from the left.
But the Addicks almost took the lead against the run of play when Chris Eagles prodded narrowly wide from close range after Johann Berg Gudmundsson’s chipped ball forward.
The game changed just short of the half-hour mark when Solly was given his marching orders for deliberately handling Aiden O’Brien’s effort in the box, gifting Millwall a penalty.
Gregory stepped up, but the striker’s effort was well saved by Henderson low to his right to keep the scores level.
Charlton switched to a 4-3-2 formation, with Andre Bikey replacing Eagles, but Millwall continued to dominate and Henderson produced another spectacular save to deny Upson five minutes before half-time.
The Lions dominated the possession after the break, but the Addicks arguably looked more comfortable after going down to 10 men.
And Guy Luzon’s side almost took the lead on 52 minutes after a swift counter-attack, but Gudmundsson’s left-footed shot curled just wide of the top corner.
Millwall fans grew increasingly frustrated as the Lions struggled to break through Charlton’s dogged defence, but Shaun Williams had Henderson at full stretch again on the hour mark after a drive from distance.
But the Addicks took the lead on 67 minutes, when Diarra ghosted into the box to flick home Morgan Fox’s cross from the left – the former West Ham midfielder’s first goal for the club.
Millwall hit back and substitute Gueye levelled 11 minutes from time with a low drive from a tight angle.
And Hooiveld stole all three points for the hosts three minutes from the end when he turned home Gueye’s shot.