Jak mogę używać różnych bibliotek XML PHP, aby uzyskać funkcjonalność podobną do DOM i uniknąć luk w DoS, takich jak miliardy śmiechów czy kwadratowe rozdmuchiwanie?
Piszę aplikację internetową, która ma API XML w PHP, i martwię się o trzy specyficzne luki, wszystkie związane z wbudowanymi definicjami DOCTYPE: dołączanie plików lokalnych, zdmuchiwanie jednostki kwadratowej i eksplozyjne rozszerzanie encji. Bardzo chciałbym używać wbudowanych w biblioteki PHP (5.3), ale chcę się upewnić, że nie jestem na nie podatny.
Znalazłem, że mogę wyeliminować LFI za pomocą libxml_disable_entity_loader, ale to nie pomaga w deklaracjach INTITY wbudowanych, w tym encji odnoszących się do innych podmiotów.
Biblioteka SimpleXML (SimpleXMLElement, simplexml_load_string itp.) Jest świetna, ponieważ jest to parser DOM i wszystkie moje dane wejściowe są dość małe; pozwala mi na łatwe używanie xpath i manipulowanie DOMem. Nie potrafię zrozumieć, jak zatrzymać deklaracje ENTITY. (Z przyjemnością wyłączyłbym wszystkie możliwe definicje DOCTYPE, jeśli to możliwe.)
Biblioteka XML Parser (xml_parser_create, xml_set_element_handler, itp.) Pozwala mi ustawić domyślny program obsługi, który zawiera encje, za pomocą xml_set_default_handler. Mogę go zhakować, więc dla nierozpoznanych bytów po prostu zwraca oryginalny ciąg (tj. „& Ent;”). Ta biblioteka jest jednak frustrująca: ponieważ jest to parser SAX, muszę napisać kilka procedur obsługi (aż 9 ..).
Czy można więc korzystać z wbudowanych bibliotek, usuwać obiekty podobne do DOM i chronić się przed różnymi lukami w DoS? dzięki
Ta strona opisuje trzy luki i dostarcza rozwiązania ... jeśli tylko korzystałem z .NET:http://msdn.microsoft.com/en-us/magazine/ee335713.aspx
AKTUALIZACJA:
<code><?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); ?> </code>
próbowałemloadXML($s, LIBXML_NOENT);
także. W obu przypadkach kończę na dumpingu ponad 300 MB. Czy czegoś jeszcze brakuje?