summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorBen Fuhrmannek2021-11-11 13:32:07 +0100
committerBen Fuhrmannek2021-11-11 13:32:07 +0100
commit0be11fcc6e73f7e35bf2f3b884676413f5522cf1 (patch)
tree50b6d6108e069839f5715228c0b5623648a8514c /src
parent713cb08b58d4e5dd5e7e80b1f82e27cbe52d4381 (diff)
more tests for xxe + optional xml support
Diffstat (limited to 'src')
-rw-r--r--src/sp_disable_xxe.c7
-rw-r--r--src/tests/xxe/disable_xxe_dom_disabled_php8.phpt57
-rw-r--r--src/tests/xxe/disable_xxe_dom_php8.phpt59
3 files changed, 123 insertions, 0 deletions
diff --git a/src/sp_disable_xxe.c b/src/sp_disable_xxe.c
index 7db2451..b6030c6 100644
--- a/src/sp_disable_xxe.c
+++ b/src/sp_disable_xxe.c
@@ -1,5 +1,7 @@
1#include "php_snuffleupagus.h" 1#include "php_snuffleupagus.h"
2 2
3#ifdef HAVE_XML
4
3PHP_FUNCTION(sp_libxml_disable_entity_loader) { 5PHP_FUNCTION(sp_libxml_disable_entity_loader) {
4 sp_log_warn("xxe", 6 sp_log_warn("xxe",
5 "A call to libxml_disable_entity_loader was tried and nopped"); 7 "A call to libxml_disable_entity_loader was tried and nopped");
@@ -39,3 +41,8 @@ int hook_libxml_disable_entity_loader() {
39 41
40 return SUCCESS; 42 return SUCCESS;
41} 43}
44#else
45int hook_libxml_disable_entity_loader() {
46 sp_log_warn("xxe", "Cannot enable XXE protection. XML support is disabled in PHP.");
47}
48#endif \ No newline at end of file
diff --git a/src/tests/xxe/disable_xxe_dom_disabled_php8.phpt b/src/tests/xxe/disable_xxe_dom_disabled_php8.phpt
new file mode 100644
index 0000000..01e3349
--- /dev/null
+++ b/src/tests/xxe/disable_xxe_dom_disabled_php8.phpt
@@ -0,0 +1,57 @@
1--TEST--
2Disable XXE (feature disabled)
3--SKIPIF--
4<?php if (!extension_loaded("snuffleupagus") || !extension_loaded("dom")) print("skip"); ?>
5<?php if (PHP_VERSION_ID < 80000) print "skip"; ?>
6--INI--
7sp.configuration_file={PWD}/config/disable_xxe_disable.ini
8--EXTENSIONS--
9dom
10--FILE--
11<?php
12$dir = __DIR__;
13$content = '<content>WARNING, external entity loaded!</content>';
14file_put_contents($dir . '/content.txt', $content);
15
16$xml = <<<EOD
17<?xml version="1.0"?>
18<!DOCTYPE root
19[
20<!ENTITY foo SYSTEM "file://$dir/content.txt">
21]>
22<test><testing>&foo;</testing></test>
23EOD;
24
25file_put_contents($dir . '/content.xml', $xml);
26
27
28$dom = new DOMDocument('1.0');
29$dom->loadXML($xml, LIBXML_DTDATTR|LIBXML_DTDLOAD|LIBXML_NOENT);
30printf("default setting with LIBXML_NOENT: %s\n", $dom->getElementsByTagName('testing')->item(0)->nodeValue);
31
32$dom = new DOMDocument('1.0');
33$dom->loadXML($xml, LIBXML_DTDATTR|LIBXML_DTDLOAD);
34printf("default setting without LIBXML_NOENT: %s\n", $dom->getElementsByTagName('testing')->item(0)->nodeValue);
35
36libxml_set_external_entity_loader(null);
37
38$dom = new DOMDocument('1.0');
39$dom->loadXML($xml, LIBXML_DTDATTR|LIBXML_DTDLOAD|LIBXML_NOENT);
40printf("disabled entity loader with LIBXML_NOENT: %s\n", $dom->getElementsByTagName('testing')->item(0)->nodeValue);
41
42$dom = new DOMDocument('1.0');
43$dom->loadXML($xml, LIBXML_DTDATTR|LIBXML_DTDLOAD);
44printf("disabled entity loader without LIBXML_NOENT: %s\n", $dom->getElementsByTagName('testing')->item(0)->nodeValue);
45
46?>
47--EXPECTF--
48default setting with LIBXML_NOENT: WARNING, external entity loaded!
49default setting without LIBXML_NOENT:
50disabled entity loader with LIBXML_NOENT: WARNING, external entity loaded!
51disabled entity loader without LIBXML_NOENT:
52--CLEAN--
53<?php
54$dir = __DIR__;
55unlink($dir . "/content.xml");
56unlink($dir . "/content.txt");
57?>
diff --git a/src/tests/xxe/disable_xxe_dom_php8.phpt b/src/tests/xxe/disable_xxe_dom_php8.phpt
new file mode 100644
index 0000000..485828f
--- /dev/null
+++ b/src/tests/xxe/disable_xxe_dom_php8.phpt
@@ -0,0 +1,59 @@
1--TEST--
2Disable XXE (feature enabled)
3--SKIPIF--
4<?php if (!extension_loaded("snuffleupagus") || !extension_loaded("dom")) print("skip"); ?>
5<?php if (PHP_VERSION_ID < 80000) print "skip"; ?>
6--INI--
7sp.configuration_file={PWD}/config/disable_xxe.ini
8--EXTENSIONS--
9dom
10--FILE--
11<?php
12$dir = __DIR__;
13$content = '<content>WARNING, external entity loaded!</content>';
14file_put_contents($dir . '/content.txt', $content);
15
16$xml = <<<EOD
17<?xml version="1.0"?>
18<!DOCTYPE root
19[
20<!ENTITY foo SYSTEM "file://$dir/content.txt">
21]>
22<test><testing>&foo;</testing></test>
23EOD;
24
25file_put_contents($dir . '/content.xml', $xml);
26
27
28$dom = new DOMDocument('1.0');
29$dom->loadXML($xml, LIBXML_DTDATTR|LIBXML_DTDLOAD|LIBXML_NOENT);
30printf("default setting with LIBXML_NOENT: %s\n", $dom->getElementsByTagName('testing')->item(0)->nodeValue);
31
32$dom = new DOMDocument('1.0');
33$dom->loadXML($xml, LIBXML_DTDATTR|LIBXML_DTDLOAD);
34printf("default setting without LIBXML_NOENT: %s\n", $dom->getElementsByTagName('testing')->item(0)->nodeValue);
35
36libxml_set_external_entity_loader(null);
37
38$dom = new DOMDocument('1.0');
39$dom->loadXML($xml, LIBXML_DTDATTR|LIBXML_DTDLOAD|LIBXML_NOENT);
40printf("disabled entity loader with LIBXML_NOENT: %s\n", $dom->getElementsByTagName('testing')->item(0)->nodeValue);
41
42$dom = new DOMDocument('1.0');
43$dom->loadXML($xml, LIBXML_DTDATTR|LIBXML_DTDLOAD);
44printf("disabled entity loader without LIBXML_NOENT: %s\n", $dom->getElementsByTagName('testing')->item(0)->nodeValue);
45
46?>
47--EXPECTF--
48default setting with LIBXML_NOENT: WARNING, external entity loaded!
49default setting without LIBXML_NOENT:
50
51Warning: [snuffleupagus][0.0.0.0][xxe][log] A call to libxml_set_external_entity_loader was tried and nopped in %a.php on line 26
52disabled entity loader with LIBXML_NOENT: WARNING, external entity loaded!
53disabled entity loader without LIBXML_NOENT:
54--CLEAN--
55<?php
56$dir = __DIR__;
57unlink($dir . "/content.xml");
58unlink($dir . "/content.txt");
59?>