Slide 17
Slide 17 text
OWASP Night / 2019-03-11 #owaspjapan
t
prototype汚染
オブジェクトリテラルの__proto__が
Object.prototypeを指しているため、
攻撃者が__proto__に書き込みできる
場合、グローバルのObject.prototype
が汚染される
valueOf()やtoString()などの既存プロパ
ティも書き換えられ、最悪の場合は任意
コード実行となる
function isObject(obj) {
return obj !== null && typeof obj === 'object';
}
function merge(a, b) {
for (const key in b) {
if (isObject(a[key]) && isObject(b[key])) {
merge(a[key], b[key]);
} else {
a[key] = b[key];
}
}
return a;
}
function clone(obj) {
return merge({}, obj);
}
app.post('/', (req, res) => {
const obj = clone(req.body);
const r = {};
const status = r.status ? r.status: 'NG';
res.send(status)
});
% curl -H 'Content-Type:application/json' -d '{"__proto__":{"status":"polluted"}}' http://example.jp/
https://jovi0608.hatenablog.com/entry/2018/10/19/083725 より
攻撃者の作成したJSONをそのままコピー
しているため __proto__ もコピーされる
攻撃者が送信するJSON。
レスポンスは "polluted" になる
Object.prototypeが汚染されているので、無関係なオ
ブジェクト r の status プロパティが意図しない値となる