The previous answers don't make any sense to me. Both of them confuse $j$ with $j_{max}$ so they find $j=j_1+j_2$, thus, the statement $|j_1-j_2|\le j\le j_1+j_2$ is obviously true but not correctly proven.
The only demonstration I can come up with is by direct computation (and a couple of caveats).
Let's assume $j_{min}\le j \le j_{max}$ and the hypothesised inequalities $$|m_i|\le j_i \\|m|\le j$$ for $i=1,2$.
We want to find $j_{max}$ and $j_{min}$, namely the max and min values of the eigenvalues of the $\hat{J}^2$ operator, which can be conveniently written as
$$\hat{J}^2=(\hat{J}_1+\hat{J}_2)^2=\hat{J}_1^2+\hat{J}_2^2+2\hat{J}_{1_z}\hat{J}_{2_z}+\hat{J}_{1_+}\hat{J}_{2_-}+\hat{J}_{1_-}\hat{J}_{2_+}$$
So, applying the operator to the generic state $\left|j_1 j_2 m_1m_2\right>$ we can get the (awful) analytical form of the generic eigenvalue, and manipulating $m_1$ and $m_2$ one can rigorously get $j_{min}$ and $j_{max}$.
Fortunately, we can choose suitable states such that the computation is reduced to the bare minimum.
For instance, let's look for the $j_{max}$ value.
We are summing two angular momentum vectors; the scenario for which the sum has the maximum possible value is when the twos are parallel to each other (and have the same direction).
Our inequalities allow us to take $m_i=\pm j_i$, that is, when both the vectors are parallel to the $z$ axis; thus, the two states $\left|j_1 j_2 m_1 m_2\right>=\left|j_1 j_2 \pm j_1 \pm j_2\right>$ are the ones for which the total angular momentum is maximum.
Now, applying $\hat{J}^2$ to this state is much easier than the general case, because the operators $\hat{J}_{i_+}$ nullify the maximal states.
So we get
$$\begin{aligned}
\hat{J}^2\left|j_1 j_2 \pm j_1 \pm j_2\right>&=\hbar^2 \left[j_1(j_1+1)+j_2(j_2+1)+2j_1 j_2\right]\left|j_1 j_2 \pm j_1 \pm j_2\right> \\&=\hbar^2 (j_1+j_2)(j_1+j_2+1)\left|j_1 j_2 \pm j_1 \pm j_2\right>
\end{aligned}
$$
Thus, $$j_{max}=(j_1+j_2) \tag{*}$$
To find $j_{min}$ one can reiterate the reasoning in search of the state(s) with the minimum total momentum, i.e, with opposite and maximum $z$ angular momentum, $m_1=\pm j_1$ and $m_2=\mp j_2$. But in this way, one has to deal with the terms given by the construction/annihilation operators.
A more elegant way to find $j_{min}$ (for me) is by looking at the dimension of the Hilbert space in which our eigenstates lives.
We have built states such that
$$\left|j_1 j_2 m_1 m_2\right>=\left|j_1 m_1\right>\otimes\left|j_1 m_1\right> \in \mathcal{H}_1 \otimes \mathcal{H}_2=:\mathcal{H}$$
thus
$$
\dim(\mathcal{H})=\dim(\mathcal{H_1})\dim(\mathcal{H_2})=(2j_1+1)(2j_2+1)=4j_1 j_2+2(j_1+j_2)+1 \tag{1}
$$
but also
$$
\dim(\mathcal{H})=\sum_{j=j_{min}}^{j_{max}}(2j+1)
$$
because for each value of permitted $j$ there are $2j+1$ associated states (all its discrete $z$ projections).
The latter sum can be rewritten as
$$\begin{aligned}
\sum_{j=j_{min}}^{j_{max}}(2j+1)&=j_{max}-j_{min}+1+2\sum_{j=j_{min}}^{j_{max}}j=\\&=
j_{max}-j_{min}+1+2\left( \sum_{j=1}^{j_{max}}j-\sum_{j=1}^{j_{min}-1}j \right)=\\&=
j_{max}-j_{min}+1+2\left( \frac{j_{max}(j_{max}+1)}{2}-\frac{(j_{min}-1)(j_{min}-1+1)}{2} \right)=\\&=
j_{max}^2+2j_{max}-j_{min}^2+1
\end{aligned}\tag{2}$$
Where in the third line we used Gauss' triangular number formula.
Finally, recalling $(*)$ and equating $(1)$ with $(2)$ we obtain
$$
j_{min}^2=(j_1-j_2)^2 \iff j_{min}=|j_1-j_2|
\tag{**}$$
Demonstrating the triangle selection rule.