Son found the net in the 61st and 81st minutes to give Hamburg a 2-0 lead before Shawn Parker made it 2-1 in the dying minutes.
The result ended Hamburg's three-match losing streak, and moved them two points above Mainz in the standings.
The first chance of the match went to the hosts in the 11th minute when Nicolai Muller's pass was deflected to Elkin Soto, whose shot was off target.
Mainz were close again in the 34th minute when Andreas Ivanschitz's blast from 21 yards out came back off the crossbar. Hamburg keeper Rene Adler fended away Muller's rebound attempt.
Hamburg finally had a chance after 41 minutes with Julian Baumgartlinger's clearance attempt going directly to Marcell Jansen, whose header sailed just wide right.
Hamburg took the lead after 61 minutes when Rafael van der Vaart picked out Son and the South Korean hammered his shot off the lower half of the crossbar and in.
Twenty minutes later Son doubled his tally - and Hamburg's lead in - going on a long run, then getting past Adler to stroke it home and make it 2-0.
Mainz pulled a goal back in the 86th as Parker struck in Junior Diaz's cross.
Hamburg nearly finished off the game in the 90th minute but Jansen found only the post.