Emanuele Calaio converted a penalty early in the second half after Simon Kjaer brought down Mattia Destro to settle the game.
The win at the Artemio Franchi stadium was Siena's first since January 4 and lifted the Tuscan outfit into 16th place.
For Roma it was a seventh defeat of the campaign and saw them miss the chance to leapfrog Inter Milan into fifth in the standings.
The visitors dominated possession, but Siena looked more dangerous and almost went in front in the ninth minute.
Luca Rossetini fed Destro in the box and his right-footed shot went over the bar.
Siena missed another good chance when Franco Brienza found Calaio in the heart of the area and his effort went wide.
Roma almost made Siena pay for their misses in the 20th minute when Erik Lamela's goal-bound volley from outside the area forced Siena goalkeeper Gianluca Pegolo into a diving save.
Midway through the first half Destro sent his right-footed attempt over the bar as another opportunity went begging for the hosts.
Roma goalkeeper Maarten Stekelenburg then came off his line to clear a dangerous ball with an unmarked Calaio in pursuit and early in the second half denied Destro from 10 yards.
The referee then pointed to the spot after Destro went down under Kjaer's challenge.
Calaio sent his penalty towards the left corner and, even though Stekelenburg guessed correctly he could not get a touch to keep the ball out.
Roma coach Luis Enrique brought on his team's leading scorer Daniel Osvaldo on the hour mark for his first appearance of the year after injury.
However, Siena defended deeply and the closest the visitors got to equalising was eight minutes from time when Fabio Borini's volley from 12 yards was kept out by Pegolo.