Villa defender Enda Stevens appeared to make no contact on Jay Rodriguez before he went to ground inside the box but stand-in referee Mark Halsey - a late replacement for the ill Chris Foy - thought otherwise.
Rickie Lambert made no mistake with his 34th-minute spot-kick to move Nigel Adkins' side above Villa. Villa have now taken only one point from their last five league games and look set for a battle to stay up.
Although the penalty award was highly debatable, Villa were well below par in the opening 45 minutes and looked vulnerable on the counter-attack, although they looked better after the break with Christian Benteke and Andreas Weimann posing a threat.
Southampton bossed much of the first half and Rodriguez glanced a header just wide of the far post from Jason Puncheon's cross.
Saints left-back Luke Shaw ventured forward and his low shot had Brad Guzan scrambling. Then came the hotly-contested spot-kick which put Saints ahead.
Stevens appeared to make no contact on Rodriguez before he went to ground just inside the box. Villa protested in vain and Lambert sent Guzan the wrong way from the spot for his ninth goal of the season.
In the second half, Guzan was relieved when Jason Puncheon crashed a fierce low drive against a post, but the tide then turned as Villa staged a late rally.
Saints goalkeeper Artur Boruc kept out Benteke's header, but he was powerless to stop Nathan Baker's header which crashed against the crossbar from Barry Bannan's corner.
Benteke then shot wide after Boruc had bravely saved at the feet of Gabriel Agbonlahor as Saints survived to seal their second away win of the season.