Most of the above examples work but if you are using multiple categories NONE *(as of writing, WP version 3.6)* of the other methods work to get all the categories that have been passed to either "cat" or "category_name".

This is the kind of archive URL with multiple categories:
https://yoursite.com/cateogry/blue+yellow/
(yeah this kind of URL works every wordpress site but its not used much)

The only way I have found is to pull the data from:

    $wp_query->query['category_name']

For some reason this returns a different value to `get_query_var( 'category_name' )` which only returns the first category.

When using multiple categories you will have to use some function like `explode` to get an array of category slugs, then loop through that to grab all the IDs:

    <?php
    global $wp_query;
    
    //grab all categories from query string (if using `category_name`)
    $category_slugs_array = explode("+",esc_attr($wp_query->query['category_name']));
    
    $categories = array();
    $category_ids = array();

    //loop through all the slugs
    foreach($category_slugs_array as $category_slug)
    {
        //get category object using slug
        $category = get_category_by_slug( $category_slug );

        //check to make sure a matching category has been found
        if(isset($category->cat_ID))
        {
            $categories[] = $category;
            $category_ids[] = $category->cat_ID;
        }
    }

    var_dump($categories); //array of categories
    var_dump($category_ids); //array of category IDs
    
    ?>


Obviously there needs to be some considerations when using AND (+) or OR (,) operators.