Arturo Vidal gave Leverkusen a 21st-minute lead with Simon Rolfes adding the second goal three minutes before the interval as Ballack, who had been sidelined with a leg injury since September, injected a little life back into the title race.
Dortmund has the opportunity to restore the 11-point lead at the top when they face Wolfsburg on Saturday.
Ballack picked up his injury in the first fixture between the two teams in September and the man responsible for the crunching challenge, Portugal's Sergio Pinto, faced him again on Friday.
"I'm pretty satisfied with my form even if I a missing a few things," said Ballack, who came off the bench in the win against Mönchengladbach last weekend.
"I need matches, but I am not an exception. Everybody is the same. I am not going to think about what happened; it's in the past. There was no intention to hurt me.
"The win tonight was difficult to go out and search for, but it was deserved. We need to improve if we are going to finish second, that's our objective."
Despite his return to the starting side, Ballack still faces a battle to convince Germany coach Joachim Löw to recall him for the friendly international against Italy on February 9.