Backpropagation is literally the chain rule of derivatives.
Imagine you have a black box, such that when it produces an output, you can compare it against a target. The black box has a ton of little dials (weights) you can turn up or down, which affect what the output will be.
Say the output of the box was too small relative to the target. Now you want to know how to tweak each of the dials (weights) to increase the output a little, so that next time the output will be closer to the target.
How do you do that? You could do it by trial and error, changing one dial at a time to see how it affects the output (find the derivative of the output relative to the weight). That works but it is very inefficient.
So, what if it was not a black box? What if you could peek into some of the circuitry right before the output is produced? There are fewer knobs there to tweak. More efficient!
You could then figure out how sensitive the output is to each of those end-knobs (weight gradients), and even to the inputs to those end-knobs (activation gradients). Your life is getting easier.
But wait, why stop there? Now that you know how the circuitry close to the end output works, you can repeat the same process iteratively working backwards towards the inputs of the black box (chain rule). In the process, you will know exactly how much each dial affects the final output.
Instead of doing all this numerically by playing with the dials, you can do the same analytically if you know the (derivable) functions that compose this big box of dials.
That's how it's done, basically.