Mario Martinez gave Honduras the lead in the 12th minute, but Wilmer Crisanto's two yellow cards a minute apart midway through the first half energized Brazil, who got two goals by Leandro Damiao. Brazil will face the winner of Saturday's remaining quarterfinal between Britain and South Korea.
Roger Espinoza, who eventually was ejected in injury time with a second yellow to reduce Honduras to nine men, put the Catrachos ahead 2-1 in the 48th. But Jose Velasquez gave away a penalty in the 51st on a foul on Damiao, who later added the eventual winner in the 60th.
Honduras, which scored in the seventh minute in its 1-0 victory over Spain earlier in the tournament, surprised Brazil early too. Espinoza worked free on the left side and crossed into the box where Maynor Figueroa was able to get a touch that looped the ball high.
Martinez, who last month it was announced was transferring on loan from Real Espana to the Seattle Sounders FC, volleyed the ball as it fell and arced into the far side of the goal.
Brazil, who didn't get a second shot on goal until the 26th minute, found new life after Cristanto was sent off.
Crisanto was yellow carded by German referee Felix Brych first in the 32nd minute for a lunging right leg that tripped Hulk, and then again for another extended foot that brought down Neymar.
Almost immediately Brazil's attack came to life with Honduran goalkeeper Jose Mendoza diving to thwart Damiao in the 36th, and then racing off his line to grab a through ball off the feet of Oscar a minute later.
But Brazil equalized in the 38th when Hulk worked free on the right and sent a ball into the six-yard box past an aggressive Mendoza. Honduran defender Arnold Peralta was able to block the ball, but Damiao was able to poke it over the line around Velasquez.
Espinoza restored Honduras' lead in the second half, exploiting a lax defensive effort from Brazilian defenders Juan and Romulo to find space along the 18 and drive a low skipping effort inside the left post.
However, a minute and a half later, Velasquez stepped on the foot of Damiao as he tried to sprint forward on the right side of the area, and Brych whistled for the penalty.
After Neymar converted for a 2-2 score in the 51st, he turned provider for Damiao nine minutes later sending a ball into the Internacional forward who had his back to goal. Damiao took a touch to turn on Johnny Leveron and Figueroa arrived too late to block the shot that beat Mendoza inside the left post.
Honduras finished with nine men after Espinoza was ejected in the 91st minute, the seventh yellow issued to the Catrachos and 11th in the game by Brych.