It works if you assume $f(x)$ is continuous.
Claim:
Suppose $f(x)$ is continuous and $f(f(x)) = x + f(x)$ for all $x \in \mathbb{R}$. Then $f(\mathbb{R})=\mathbb{R}$.
Proof:
We already know that $f(0)=0$ and $f(x)$ is injective. It follows that $f(1)\neq 0$.
-Case 1: Suppose $f(1)>0$. Then (by the intermediate value theorem) we must have:
\begin{align}
&f(x) > 0 \: \: \mbox{ if $x >0$} \\
&f(x) < 0 \: \: \mbox{ if $x<0$}
\end{align}
For all positive integers $n$ we have:
\begin{align*}
&f(f(n)) = n + f(n) \geq n\\
&f(f(-n)) = -n + f(-n) \leq -n
\end{align*}
and so $f$ takes arbitrarily large values and arbitrarily small values. By the intermediate value theorem, it must take all values in $\mathbb{R}$.
-Case 2: Suppose $f(1)<0$. Then we must have:
\begin{align}
&f(x) < 0 \quad \mbox{ whenever $x >0$} \\
&f(x) > 0 \quad \mbox{ whenever $x<0$}
\end{align}
Suppose there is a finite constant $-M$ such that $f(x) \in [-M,0]$ for all $x\geq 0$ (we reach a contradiction). Then the infinite sequence $\{f(n)\}_{n=1}^{\infty}$ is in the compact interval $[-M,0]$, so the Bolzano-Wierstrass theorem ensures there is a subsequence $n_k$ such that $n_k\rightarrow\infty$ and $f(n_k) \rightarrow x^*$ for some $x^* \in [-M,0]$. But for all $k$ we have:
$$ f(f(n_k)) = n_k + f(n_k) $$
and taking a limit as $k\rightarrow \infty$ gives $f(x^*) = \infty + x^*$, a contradiction. Thus, $f(x)$ takes arbitrarily small values over $x\geq 0$.
A similar argument shows $f(x)$ takes arbitrarily large values over $x \leq 0$. Hence, by continuity, $f(\mathbb{R}) = \mathbb{R}$.