A second-half penalty from Luis Muriel was enough to inflict upon Milan a third Serie A loss in as many games and extend their winless run to five in all competitions.
Vincenzo Montella’s side controlled the majority of the play but looked like a team bereft of confidence, as a consistent lack of composure in attack saw opportunities go begging.
Gerard Deulofeu hit the post with their best opening but Emiliano Viviano’s goal was largely untroubled after a busy first half in which he made good saves to deny Andrea Bertolacci.
Milan were punished as they continued to push forward, with Muriel converting from the spot after Fabio Quagliarella had been fouled following a counterattack, and Gianluca Lapadula missed a glorious late chance to equalise as Samp followed up an impressive win over Roma with another valuable victory.
Milan - who lost Jose Sosa to a late red card - stay 10 points behind Luciano Spalletti’s side in the final Champions League spot, leaving them with a huge task in their bid to return to Europe’s top competition.
Deulofeu was handed his first start for the club, while Juraj Kucka and Alessio Romagnoli lined up as full-backs in a makeshift defence as Milan’s injury problems continued.
It was down the Milan right that Sampdoria carved out the best chance of the first half after 24 minutes, with Gianluigi Donnarumma reacting well to claw away Karol Linetty’s strike from just inside the area after Kucka failed to track his run.
Bertolacci stung the palms of Viviano with two good efforts from 20 yards and Deulofeu was inches from turning Suso’s cross into an empty net, as Milan stepped up the urgency in their play in the closing stages of the half.
Deulofeu spurned a glorious chance to open his account two minutes after the restart, the winger placing the ball onto the base of Viviano’s left-hand post after being given time and space to steady himself when Suso’s cross was parried into his path.
Mario Pasalic steered a shot inches wide from the lively Deulofeu’s pass as Samp continued to invite pressure, but frustrations were growing around San Siro as persistent poor play in the final third halted Milan’s attacks.
And the home fans were positively irate when Muriel broke the deadlock against the run of play with 20 minutes to go. Cristian Zapata lost the ball near the halfway line and, after Gabriel Paletta bundled Quagliarella to ground inside the area from the resulting break, Muriel confidently swept home the penalty.
Milan turned up the pressure again but Viviano’s low stop from Deulofeu’s mishit cross summed up their lack of quality in attack, while substitute Filip Djuricic dragged a shot wide of Donnarumma’s right-hand psot when he should have made it 2-0.
Lapadula shot straight at Viviano when played clean through on goal by Suso in the dying minutes, and Deulofeu’s follow-up effort was blocked by his team-mate’s ankle, with Sosa’s second yellow card moments later compounding another disappointing day.