Sha256: 57eb501f6205d44f8e1c9ec15560e627cada7bd34d2a763ffdb68483eb48bb9d

Contents?: true

Size: 1.94 KB

Versions: 2

Compression:

Stored size: 1.94 KB

Contents

require "injection_vulnerability_library"

module ApiTester
  module InjectionModule
    def self.go contract
      reports = []
      contract.endpoints.each do |endpoint|
        endpoint.methods.each do |method|
          reports.concat inject_payload endpoint, method
        end
      end
      reports
    end

    def self.inject_payload endpoint, method
      reports = []
      sql_injections = InjectionVulnerabilityLibrary.sql_vulnerabilities

      method.request.fields.each do |field|
        sql_injections.each do |injection|
          injection_value = "#{field.default_value}#{injection}"
          payload = method.request.altered_payload(field.name, injection_value)
          response = endpoint.call method, payload, method.request.default_headers          
          if(!check_response(response, endpoint)) then
            reports << InjectionReport.new("sql", endpoint.url, payload, response)
          end
        end
      end

      reports
    end

    def self.check_response(response, endpoint)
      response.code == 200 || check_error(response, endpoint)
    end

    def self.check_error response, endpoint
      evaluator = ApiTester::ResponseEvaluator.new response.body, endpoint.bad_request_response
      missing_fields = evaluator.missing_fields
      extra_fields = evaluator.extra_fields
      response.code == endpoint.bad_request_response.code && missing_fields.size == 0 && extra_fields.size == 0
    end
  end
end

class InjectionReport
  attr_accessor :injection_type
  attr_accessor :url
  attr_accessor :payload
  attr_accessor :response

  def initialize injection_type, url, payload, response
    self.injection_type = injection_type
    self.url = url
    self.payload = payload
    self.response = response
  end

  def print
    puts "Found potential #{self.injection_type}: "
    puts "   Requested #{self.url} with payload:"
    puts "      #{self.payload}"
    puts '   Received: '
    puts "      #{self.response}"
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
api-tester-1.0.0 lib/api-tester/modules/injection_module.rb
api-tester-0.3.1 lib/api-tester/modules/injection_module.rb