We can use setdiff to find out columns which are not present in df2 and assign the value 0 to those columns.
df2[setdiff(names(df1), names(df2))] <- 0
# a c b d
#1 5 6 0 0
If we want to maintain the same order of columns as in df1 we can later do
df2[names(df1)]
# a b c d
#1 5 0 6 0