Um, no.
The reason not to use * is that you're using GROUP BY. The only valid column to return is p2.product_uid, along with the COUNT().
And there's nothing wrong with short aliases -- that's the whole point. Though, as suggested earlier, p and p2 really aren't descriptive enough.
And there's no harm is getting to count for the original product uid either.
So:
SELECT `pr`.`product_id` , COUNT(*) as num
FROM `orders` AS `o`
INNER JOIN `orders_products` AS `po` ON ( o.order_id = po.order_id )
INNER JOIN `orders_products` AS `pr` ON ( o.order_id = pr.order_id )
WHERE po.product_id = '020577'
GROUP BY `pr`.`product_id`
ORDER BY num DESC
LIMIT 3