spec/integration/sitemap_xxe_spec.rb (69 lines of code) (raw):

# # Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one # or more contributor license agreements. Licensed under the Elastic License 2.0; # you may not use this file except in compliance with the Elastic License 2.0. # # frozen_string_literal: true # rubocop:disable Lint/ConstantDefinitionInBlock RSpec.describe 'Sitemap XXE vulnerability specs' do DO_NOT_VISIT_TXT_PATH = File.expand_path(File.join(FIXTURES_HOME, 'do-not-visit.txt')) SITEMAP_XML = <<~XML.freeze <?xml version="1.0" encoding="utf-8"?> <!DOCTYPE urlset [ <!ENTITY test SYSTEM "file:///#{DO_NOT_VISIT_TXT_PATH}"> ]> <urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.sitemaps.org/schemas/sitemap/0.9 http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd"> <url> <loc>http://127.0.0.1:9393/</loc> <lastmod>2019-06-19</lastmod> <changefreq>daily</changefreq> </url> <url> <loc>http://127.0.0.1:9393/visit-here</loc> <lastmod>2019-06-19</lastmod> <changefreq>daily</changefreq> </url> <url> <loc>&test;</loc> <lastmod>2019-06-19</lastmod> <changefreq>daily</changefreq> </url> </urlset> XML let(:results) { FauxCrawl.run(site) } context 'sitemap' do let(:site) do Faux.site do robots do user_agent '*' sitemap '/sitemap.xml' end sitemap '/sitemap.xml' do def response_body [SITEMAP_XML] end end page '/visit-here' end end it 'extracts links but does not look up files' do expect(results).to have_only_these_results [ mock_response(url: 'http://127.0.0.1:9393/visit-here', status_code: 200) ] end end context 'gzipped sitemap' do let(:site) do Faux.site do robots do user_agent '*' sitemap '/sitemap.xml' end sitemap '/sitemap.xml' do def response_body [gzip(SITEMAP_XML)] end end page '/visit-here' end end it 'extracts links but does not look up files' do expect(results).to have_only_these_results [ mock_response(url: 'http://127.0.0.1:9393/visit-here', status_code: 200) ] end end end # rubocop:enable Lint/ConstantDefinitionInBlock