osCommerce MS1Jのオープンリダイレクト脆弱性
なんか前回からすげぇ間が開きました。まさか1年以上も放置することになるとは(^_^;)
とりあえず、ワタシの方は元気にやっております。自転車通勤も相変わらずで、自転車用ドライブレコーダーが2回変わったり、遠出用にロードバイクを買い足したり、ネタはいろいろあるのですが、書く暇がない。
書いて残しときたいとは思ってるのですが…。
が、今回某方面から相談され発覚した内容がちょっとヤバく、報告しようにも古いプロジェクトで実質死んでるっぽい→とりあえず解ったことを検索にかかるところに書いときます。この情報が必要な人に届くことを願う。
相談された内容。
「なんかWEBショップのログに変なのあるんだけど、これって大丈夫なの?」
ログ。
2016/02/21,05:55:21,206.55.232.202,"deneb.taygeta.com","-",GET,"/catalog/redirect.php","action=url&goto=https://oswiataberlin.de/info.php/pics/marzanna2011_program_de.pdf?a[]=<a href=https://www.fws.gov/pacific/script/exit.cfm?link=//7ba.ru%2Fout.php%3Furl%3Dhttp%3A%2F%2Ffxforex-trading.com%2F>forex signals free signals live</a>","1.1",302,5,"","","Mozilla/5.0 (Windows NT 6.3; WOW64; rv:35.0) Gecko/20100101 Firefox/35.0"
2016/02/21,07:50:50,161.139.152.3,"","-",GET,"/catalog/redirect.php","action=url&goto=www.equipmentlocator.com","1.1",302,5,"","",""
2016/02/21,07:52:11,112.26.204.74,"","-",GET,"/catalog/redirect.php","action=url&goto=blog.masterpoolsguild.com","1.1",302,5,"","","Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36"
2016/02/21,08:22:05,112.16.87.157,"","-",GET,"/catalog/redirect.php","action=url&goto=tiermedium.com","1.1",302,5,"","","Mozilla/5.0 (Windows NT 6.3; WOW64; rv:35.0) Gecko/20100101 Firefox/35.0"
↑こんなのいっぱい。
「これはあきまへん。オープンリダイレクト脆弱性。」
osCommerceというのはPHPで書かれたWEBショッププログラムで、MS1Jというのはその古〜いバージョンを元にした日本語版らしいのですが、商品説明リンクを以下のように生成してます。
product_info.php
「データベースから引っ張ってきたURLをURLエンコードし、goto引数としてリダイレクトスクリプトに引き渡す」
そして、リダイレクトスクリプトはこれをノーチェックで使ってる→引数として任意のURLを引き渡せる「オープンリダイレクト脆弱性」になっちゃってます。
新しいバージョンを見ると
「リダイレクトスクリプト側で、渡されたURLがDBに存在するかどうかチェックする」
処理が足されてるようなのですが、どうもこの「url+goto」でリダイレクトスクリプトを使うのはこの商品説明リンクだけっぽいので、
として「商品IDを引数として渡す」ようにし、
redirect.php
$url_query = tep_db_query("SELECT products_url FROM " . TABLE_PRODUCTS_DESCRIPTION . " WHERE products_id = " . (int)$HTTP_GET_VARS['goto']);
$url_info = tep_db_fetch_array($url_query);
tep_redirect('https://' . $url_info['products_url']);
と、リダイレクトスクリプト側で「商品IDをURLに変換する」ようにしたほうが良いと思います。
「チェックして403を返せ」とのご指摘。誠にその通りで、ワタシもそうしときました。
//tep_redirect(tep_href_link(FILENAME_DEFAULT));
header('HTTP/1.1 403 Forbidden');
exit;
}
break;