小编lor*_*ron的帖子

如何使用PHP的各种XML库来获取类似DOM的功能并避免DoS漏洞,比如Billion Laughs或Quadratic Blowup?

我正在编写一个在PHP中使用XML API的Web应用程序,我担心三个特定的漏洞,都与内联DOCTYPE定义有关:本地文件包含,二次实体爆炸和指数实体爆炸.我喜欢使用PHP的(5.3)内置库,但我想确保我不会受这些影响.

我发现我可以使用libxml_disable_entity_loader消除LFI,但这对内联ENTITY声明没有帮助,包括引用其他实体的实体.

SimpleXML库(SimpleXMLElement,simplexml_load_string等)很棒,因为它是一个DOM解析器,我的所有输入都很小; 它允许我使用xpath并非常容易地操作DOM.我无法想象如何停止ENTITY声明.(如果可能,我很乐意禁用所有内联DOCTYPE定义.)

XML Parser库(xml_parser_create,xml_set_element_handler等)允许我使用xml_set_default_handler设置包含实体的默认处理程序.我可以破解它,因此对于无法识别的实体,它只返回原始字符串(即"&ent;").这个库令人沮丧:因为它是一个SAX解析器,我必须编写一堆处理程序(多达9 ..).

那么是否可以使用内置库,获取类似DOM的对象,并保护自己免受这些各种DoS漏洞的影响?谢谢

这个页面描述了三个漏洞,并提供了一个解决方案...如果我只使用.NET:http://msdn.microsoft.com/en-us/magazine/ee335713.aspx

更新:

<?php
$s = <<<EOF
<?xml version="1.0?>
<!DOCTYPE data [
<!ENTITY en "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa....">
]>
<data>&en;&en;&en;&en;&en;&en;&en;&en;&en;&en;&en;&en;.....</data>
EOF;
$doc = new DOMDocument();
$doc->loadXML($s);
var_dump($d->lastChild->nodeValue);
?>
Run Code Online (Sandbox Code Playgroud)

我也试过loadXML($s, LIBXML_NOENT);了.在这两种情况下,我最终倾销300多MB.有什么东西我还在遗失吗?

php security doctype denial-of-service xml-parsing

11
推荐指数
2
解决办法
2575
查看次数

Lambda函数返回了对CloudFront的无效请求或响应

我试图按照这里的说明https://medium.com/@tom.cook/edge-lambda-cloudfront-custom-headers-3d134a2c18a2

我让CloudFront成功地坐在静态S3"hello world"HTML文件前面,我想使用lambda edge设置其他标头,但是我收到错误.真正令人沮丧的是,我找不到任何错误日志来调试出错的地方.这是浏览器显示的内容.

ERROR

The request could not be satisfied.

The Lambda function returned an invalid request or response to CloudFront. 
Generated by cloudfront (CloudFront)
Request ID: 2Cqex7euzH0Iigps58i9tMVxdqAaLznL2ZjwqR1sW1AZHz6x2EwfMA==
Run Code Online (Sandbox Code Playgroud)

这是我的简单lambda的代码:

exports.handler = (event, context, callback) => {
    console.log(event)
    callback(null, 'Hello from Lambda');
};
Run Code Online (Sandbox Code Playgroud)

触发器类型是viewer-response并且附加到我的CloudFront分配(Cache Behavior: *如果这很重要的话).lambda具有AWSLambdaBasicExecutionRole与之对应的角色,从而为Cloudwatch提供写入权限.

一旦启用触发器,对Web请求的响应就会从我的"Hello world"HTML变为上面的错误,所以我知道它正在触发lambda.但是在lambda仪表板中,它没有显示任何调用或错误.Cloudwatch中不显示任何日志.CloudFront仪表板显示errors(5xx),但没有lambda.

如果我然后通过单击已部署的函数在lambda控制台中测试我的函数,将测试事件配置为"CloudFront Modify Response Header"并按下Test,则表示该函数成功.Cloudwatch显示测试的日志和控制台输出!但是在实时调用的日志中仍然没有任何内容.

我唯一的理论是权限有问题,CloudFront实际上无法调用lambda(解释为什么lambda仪表板中没有任何内容).最后一件事是CloudFront日志(在S3中)显示带有502错误的Web请求LambdaValidationError,但我无法弄清楚这是否有帮助.

amazon-cloudfront amazon-cloudwatch aws-lambda

10
推荐指数
2
解决办法
5970
查看次数

在响应非HTML请求时设置内容安全策略是什么意思?

我了解我可能会在网站主页上设置CSP标头https://example.com,以限制从何处加载脚本和其他资源。但是,如果主页上没有CSP,浏览器将如何处理后续请求的策略?

这是两个示例合二为一:

  1. 我浏览https://example.com并获取一些HTML(没有CSP标头)
  2. HTML包含https://example.com/script.js[*]中的脚本
  3. 该脚本通过向https://api.example.com[*] 发出GET来从API请求一些数据
  4. 然后,相同的脚本将Websocket打开到相同的域, https://api.example.com
  5. 然后,同一脚本发出另一个请求,从外部发布到 https://api.analytics.com

[*]在步骤2和3中,如果script.js或JSON响应返回了带有限制的CSP,会发生什么Content-Security-Policy: default-src 'none'?下游要求会改变吗?浏览器是否采取任何措施来阻止脚本的任何请求?还是因为原始页面加载不包含任何CSP而被允许?

谢谢!

html javascript ajax content-security-policy

5
推荐指数
1
解决办法
411
查看次数