Aliasing is when there are several names (or expressions) to designate the same object.
Indirection is when there are additional steps to reach the object.
Both are usually present, but not always. As an example of aliasing without indirection
namespace X {
int x;
}
namespace Y {
using namespace X;
}
X::x and Y::x are two different names for the same objects, there are aliases and no indirection is present.
As an example of indirection without aliases
int* p = new int;
To access the allocated object, you have to go through p with *p, the access is indirect and there are no aliases.
But indirection is usually present when there are aliases (visibly with q=p, *p and *q are aliases, or more or less hidden in the implementation or the language rules, see references in C++ or with the fact that a[i] and a[j] which are aliases if i==j.)