- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我正在用 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 解析器库(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);
?>
我也尝试了 loadXML($s, LIBXML_NOENT);
。在这两种情况下,我最终都倾倒了 300+ MB。我还缺少什么吗?
最佳答案
Note: If you create test-cases with files that contain the XML chunks in the following, expect that editors might be prone to these attacks as well and might freeze/crash.
<?xml version="1.0"?>
<!DOCTYPE lolz [
<!ENTITY lol "lol">
<!ENTITY lol1 "&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;">
<!ENTITY lol2 "&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;">
<!ENTITY lol3 "&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;">
<!ENTITY lol4 "&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;">
<!ENTITY lol5 "&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;">
<!ENTITY lol6 "&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;">
<!ENTITY lol7 "&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;">
<!ENTITY lol8 "&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;">
<!ENTITY lol9 "&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;">
]>
<lolz>&lol9;</lolz>
加载时:
FATAL: #89: Detected an entity reference loop 1:7
... (plus six times the same = seven times total with above)
FATAL: #89: Detected an entity reference loop 14:13
结果:
<?xml version="1.0"?>
内存使用量很小,DOMDocument
未达到峰值。由于此示例显示了 7 个 fatal error ,因此可以得出结论,确实如此,因此加载时没有错误:
<?xml version="1.0"?>
<!DOCTYPE lolz [
<!ENTITY lol "lol">
<!ENTITY lol1 "&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;">
<!ENTITY lol2 "&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;">
]>
<lolz>&lol2;</lolz>
由于实体替换无效并且这项工作有效,让我们尝试一下
这里就是这个,为了您的观看乐趣而缩短(我的变体大约为 27/11kb):
<?xml version="1.0"?>
<!DOCTYPE kaboom [
<!ENTITY a "aaaaaaaaaaaaaaaaaa...">
]>
<kaboom>&a;&a;&a;&a;&a;&a;&a;&a;&a;...</kaboom>
如果你使用 $doc->loadXML($src, LIBXML_NOENT);
这确实是一种攻击,当我写这个的时候,脚本仍在加载...。所以这实际上需要一些时间来加载和消耗内存。你可以自己玩的东西。没有 LIBXML_NOENT
它可以完美且快速地工作。
但有一点需要注意,例如,如果您获取标签的 nodeValue
,即使您不使用该加载标志,您也会扩展实体。
此问题的解决方法是从文档中删除 DocumentType 节点。请注意以下代码:
$doc = new DOMDocument();
$doc->loadXML($s); // where $s is a Quadratic attack xml string above.
// now remove the doctype node
foreach ($doc->childNodes as $child) {
if ($child->nodeType===XML_DOCUMENT_TYPE_NODE) {
$doc->removeChild($child);
break;
}
}
// Now the following is true:
assert($doc->doctype===NULL);
assert($doc->lastChild->nodeValue==='...');
// Note that entities remain unexpanded in the output XML
// This is not so good since this makes the XML invalid.
// Better is a manual walk through all nodes looking for XML_ENTITY_NODE
assert($doc->saveXML()==="<?xml version="1.0"?>\n<kaboom>&a;&a;&a;&a;&a;&a;&a;&a;&a;...</kaboom>\n");
// however, canonicalization will produce warnings because it must resolve entities
assert($doc->C14N()===False);
// Warning will be like:
// PHP Warning: DOMNode::C14N(): Node XML_ENTITY_REF_NODE is invalid here
因此,虽然此变通办法可以防止 XML 文档在 DoS 中消耗资源,但它很容易生成无效的 XML。
一些数字(我减小了文件大小,否则花费的时间太长)(code):
LIBXML_NOENT disabled LIBXML_NOENT enabled
Mem: 356 184 (Peak: 435 464) Mem: 356 280 (Peak: 435 464)
Loaded file quadratic-blowup-2.xml into string. Loaded file quadratic-blowup-2.xml into string.
Mem: 368 400 (Peak: 435 464) Mem: 368 496 (Peak: 435 464)
DOMDocument loaded XML 11 881 bytes in 0.001368 secs. DOMDocument loaded XML 11 881 bytes in 15.993627 secs.
Mem: 369 088 (Peak: 435 464) Mem: 369 184 (Peak: 435 464)
Removed load string. Removed load string.
Mem: 357 112 (Peak: 435 464) Mem: 357 208 (Peak: 435 464)
Got XML (saveXML()), length: 11 880 Got XML (saveXML()), length: 11 165 132
Got Text (nodeValue), length: 11 160 314; 11.060893 secs. Got Text (nodeValue), length: 11 160 314; 0.025360 secs.
Mem: 11 517 776 (Peak: 11 532 016) Mem: 11 517 872 (Peak: 22 685 360)
到目前为止,我还没有决定保护策略,但现在知道将十亿笑声载入 PHPStorm will freeze it for example后来我停止了测试,因为我不想在写这篇文章时卡住它。
关于php - 我如何使用 PHP 的各种 XML 库来获得类似 DOM 的功能并避免 DoS 漏洞,如 Billion Laughs 或 Quadratic Blowup?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10212752/
Billion Laughs DoS 攻击似乎可以通过简单地阻止扩展 XML 文件中的实体来预防。有没有办法在 Python 的 xlrd 库中执行此操作(即某种标志)?如果没有,是否有推荐的方法来避
我正在开发一个社交 android 应用程序,它具有与 soundcloud 相同的关注者系统。 我知道它可以像这样在 MySQL 中轻松实现,这是一个包含关注者和他关注的人的关注表 follower
我有大约 20 亿个键值对,我想将它们高效地加载到 Redis 中。我目前正在使用 Python 并使用 Pipe,如 redis-py 记录的那样.我怎样才能加快以下方法的速度? import re
... ]> &ha128; 据说这被称为十亿笑声 DoS 攻击。 有人知道它是如何工作的吗? 最佳答案 Billion Laughs 攻击是一种针对 XML 解析器的拒绝
我想知道 InnoDB 是否是格式化表的最佳方式?该表包含一个字段,主键,并且该表每天将获得 816k 行(估计值)。这将很快变得非常大!我正在研究一种文件存储方式(这样会更快吗)?该表将存储已处理的
我正在尝试从 MSDN magazine page 中测试 XML 代码它说以下代码行将导致处理时内存使用量增加高达 3GB。 ]> &lol9;
我想更改 highcharter map 中图例的标签格式。我的值在0到2000亿之间。第一步,即千 (k) 和百万 (M),很好,但我需要更改十亿“G”的缩写。 我不太擅长javascript,因此
这是促销页面: http://www.apple.com/itunes/50-billion-app-countdown/ 它链接一个js: http://www.apple.com.cn/v/itu
我有一个表,我必须从中获取大约 700 万条记录,这也会达到 10 亿条记录(因为每天都会添加数据) 我正在使用 mysql-python 连接到远程 MySQL 数据库 我查询如下 cursor =
XXE安全威胁目前没有。在 OWASP 十大 Web 应用程序安全威胁列表中排名第 4,因此我希望 Java 标准 XML 库能够防止此类攻击。但是,当我以 Sonar 推荐的方式使用 Validat
问题:输入在顺序文件中。该文件最多包含 40 亿个整数。查找缺失的整数。 解决方案据我理解: 制作两个临时文件,一个以0开头,一个以1开头 两个MUST之一(4.3B鸽子洞和4B鸽子)小于2B。选择文
我在 Y 轴上有一些值(看图片)!我希望它们像 100M, 200M,... 我正在使用 MPAndroidchart。有什么解决办法吗? 最佳答案 您可以使用 AxisValueFormatter
我在 Y 轴上有一些值(看图片)!我希望它们像 100M, 200M,... 我正在使用 MPAndroidchart。有什么解决办法吗? 最佳答案 您可以使用 AxisValueFormatter
我想保护我的网站免受 billion laugh 攻击。进行攻击的SVG图片代码为: 我需要找到一个 PHP 或 javascript 解决方案来保护网站不受此影响,而不阻止
我正在用 PHP 编写一个具有 XML API 的 Web 应用程序,我担心三个特定的漏洞,它们都与内联 DOCTYPE 定义有关:本地文件包含、二次实体爆炸和指数实体爆炸。我喜欢使用 PHP (5.
我是一名优秀的程序员,十分优秀!