Salem Al Dawsari gave underdogs Al Hilal the lead in the 18th minute before Uruguay’s Giorgian de Arrascaeta equalised just after the break.
Bruno Henrique headed the Copa Libertadores winners ahead and then turned provider as Ali Albulayhi inadvertently turned into his own net.
They will face Liverpool or Monterrey in the final on Saturday (17:30 GMT).
- Club World Cup: Five reasons why it matters to Liverpool
- Wijnaldum out of Liverpool’s game with Monterrey
Former Watford loanee Andre Carrillo saw red in the 83rd minute for a wild swipe but at that point the game was beyond Al Hilal.
Flamengo were well below par in the first half, leaving manager Jorge Jesus exasperated on the touchline, but were much improved after the break.
https://www.bbc.com/sport/football/50827689Watch Monterrey v Liverpool in the Club World Cup semi-finals on BBC Two, BBC iPlayer and the BBC Sport website, with full coverage of the third-place play-off and final too.