SQLインジェクション対策の勉強のために自らSQLインジェクションが可能な
簡単なwebアプリをローカルに作りたいと考えています.
そこでrailsとMySQLを用いて簡単なユーザのCRUDを行い,
ユーザー一覧を表示するサイトを作りました.
ユーザーモデルが持つカラムは名前と年齢だけであり,テキストボックスにワードを入力して送信すると,
そのワードを含む名前を持つユーザー全てを表示するというアプリです.
このアプリはrails new
をした後にrails generate scaffold user name:string age:integer
をし,rake db:migrate
をしだだけです.
またコードは以下の部分のみ追加・変更をしています.
ruby
1### models/user.rb 2class User < ActiveRecord::Base 3 scope :get_by_name, ->(name) { 4 where("name like '%#{name}%'") 5 } 6end
ruby
1### view/users/index.html.erb 2 <div> 3 <%= form_tag(users_path, method: "get") do %> 4 <%= label_tag :name, "名前" %><%= text_field_tag :name, params[:name] %> 5 <%= submit_tag "検索" %> 6 <% end %> 7 </div>
ruby
1### controllers/users_controllers.rb 2 def index 3 @users = User.all 4 if params[:name].present? 5 @users = @users.get_by_name params[:name] 6 end 7 end
私はこのアプリで
); DELETE * FROM users; --
のコマンドをテキストボックスから投げると全ユーザーを削除するというSQLインジェクションを
発生させたいのですが,
発生しませんでした.
その時のターミナルでの表示は以下のようになっています.
Parameters: {"utf8"=>"✓", "name"=>" ); DELETE * FROM users; -- ", "commit"=>"検索"} Rendering users/index.html.erb within layouts/application User Load (0.1ms) SELECT "users".* FROM "users" WHERE (name like '% ); DELETE * FROM users; -- %')
しかし,
'OR 'A' = 'A
をテキストボックスに入力した場合は,全ユーザーを表示してくれます.
また,その時のターミナルでの表示は以下のようになっています.
Parameters: {"utf8"=>"✓", "name"=>"'OR 'A' = 'A", "commit"=>"検索"} Rendering users/index.html.erb within layouts/application User Load (0.2ms) SELECT "users".* FROM "users" WHERE (name like '%'OR 'A' = 'A%') Rendered users/index.html.erb within layouts/application (3.2ms)
railsのバージョンは5.0.6です.
どのようにすればユーザー全削除のSQLインジェクションが行えるのか教えていただきたいです.
よろしくお願いします.
回答2件
あなたの回答
tips
プレビュー