When used with things, बुरा is 'bad' and खराब is 'spoilt'. So, 'दूध बुरा है' means that you should probably buy a different brand next time and 'दूध खराब है' means that you left the milk in the refrigerator long after its expiration date.
When used with people, they can both mean 'bad'. However, खराब is not commonly used as a predicative adjective when used with people. This means that you would say 'राज बहुत ख़राब आदमी है' (Raj is a very bad man) instead of 'राज बहुत ख़राब है' (Raj is very bad). बुरा can be used both ways.