Rennes took the lead early on in the 12th minute when Sylvain Armand scrambled home in the box.
The visitors were holding on to their advantage well at half time, but they were pegged back moments into the second half when Sebastien Squillaci equalised for Bastia.
Rennes were then reduced to 10 men when Anders Konradsen was shown a second yellow card in the 65th minute.
The hosts' second was an own goal from Romain Danze not long after Konradsen's dismissal and it got worse for Rennes when Ermir Lenjani was shown a straight red for a rash challenge on Guillaume Gillet.
Djibril Cisse put the icing on the cake for Bastia with a cool finish late on as they booked their place in the last four.