Pipes:
A$ tar c thefile anotherfile | ssh B "ssh C \"cd destination && tar xv\""
(Sometimes tar cf - or tar cf /dev/stdout has to be used instead of tar c. Similar for the receiving end.)
single-file:
A$ cat < thefile | ssh B "ssh C \"cd destination && cat > thefile\""
Tunnel through B:
A$ ssh -fN -L 4567:C:22 B
(all TCP connections to localhost:4567 now are forwarded through B to C:22)
A$ scp -P 4567 thefile localhost:destination
When you're done, don't forget to kill the previously started ssh process (which has dropped to background due to -fN).
ProxyCommand, assuming either socat or nc is installed on B:
A$ scp -oProxyCommand="ssh B socat stdio tcp:%h:%p" thefile C:destination
or
A$ scp -oProxyCommand="ssh B nc -v %h %p" thefile C:destination
Reverse tunnel through B to A; doesn't always work
A$ ssh -fN -R 4567:localhost:22 B
(now you can reach A from B, by using localhost:4567)
B$ scp -P 4567 localhost:thefile C:destination