这是一篇关于将回车符和换行符注入调用内部 API的帖子。一年前我在GitHub上写了这篇文章的关键,但GitHub不是特别合适发布博客文章。你现在所看到的这 篇文章我添加了更多细节,所以它不是是直接复制粘贴的。
我喜爱做白盒测验。我不是一个优异的黑盒测验人员,但我花了十多年的时刻阅览和写PHP代码 – 而且在此过程中犯了许多过错 – 所以我知道要留意些什么。
我阅读了一些源代码发现了一个和这个有点像的函数:
// common.php
function getTrialGroups(){
$trialGroups = 'default';
if (isset($_COOKIE['trialGroups'])){
$trialGroups = $_COOKIE['trialGroups'];
}
return explode(",", $trialGroups);
}
我所看到的体系都有一个“Trial Groups”的概念。 每个用户会话都有一个与之相关的组,在cookie中以逗号分隔的列表存储。 我的主意是,当推出新功用时,能够首先为少量客户启用这些功用,以下降功用发动的危险,或许答应对特性的不同变体进行比较(这种办法称为A /B测验)。 getTrialGroups()函数仅仅读取cookie值,将列表拆开并为用户回来一组 trial groups。
此功用中短少白名单当即引起了我的留意。 我查找了其余部分的代码库来找调用函数的详细位置,这样我就能够看到对其回来值是否有任何不安全的运用。
我不能和你们共享详细的代码,但我把我的发现大致的写了下来:
// server.php
// Include common functions
require __DIR__.'/common.php';
// Using the awesome httpbin.org here to just reflect
// our whole request back at us as JSON