Webセキュリティ対策
日常のWeb開発で発生するいくつかのセキュリティ問題を簡単にまとめ、Flaskフレームワークを例に挙げます.
インジェクション攻撃
注入攻撃は主にシステムコマンド注入、SQL注入、NoSQL注入、ORM注入などが含まれています.ここではSQL注入について簡単に紹介します.
攻撃の原理
SQL文を作成する際に、ユーザーから直接入力された入力をパラメータとして文字列をつなぎ合わせてSQLクエリに挿入すると、攻撃者はSQL文を利用してデータベースの情報を改ざんし、盗むことができます.
攻撃の例
攻撃者が入力した値が「or 1=1--」の場合、studentsテーブルのすべてのデータが返されることを意味します.または「;drop table users;--」と入力するとstudentsテーブルのすべてのデータが削除されます.
主な防犯方法 ORM を使用検証入力タイプ エスケープ特殊文字 XSS攻撃
XSS(Cross-Site Scripting)は、クロスステーションスクリプト攻撃であり、CSS積層スタイルシートとネーミング競合を回避するためにXでCross(クロス)を表す
攻撃の原理
XSSは実は注入攻撃の一種であり,被攻撃者のウェブサイトにコードを注入することで,ユーザがアクセスすると注入された悪意のあるスクリプトを実行する.このうち,XSS攻撃は主に反射型XSS攻撃と記憶型XSS攻撃の2種類に分けられる.
攻撃例
反射型XSS攻撃
反射型XSSは非永続型XSSとも呼ばれ、あるサイトにXSSの脆弱性がある場合、URLから悪意のあるスクリプトを注入することができ、ユーザーがこのURLにアクセスすると攻撃スクリプトを実行する.
ユーザーがjavascriptコードを入力し、
ストレージ型XSS攻撃
ストレージ型XSSは永続型XSSとも呼ばれ、反射型XSSと同様の動作をするが、インプラントされた悪意のあるコードをデータベースに格納し、メッセージエリアにリダイレクトコードを書き込むなど、ユーザーがメッセージエリアページにアクセスする際に悪意のあるサイトにリダイレクトされる.
防犯措置 HTMLエスケープ 認証ユーザ入力 CSRF攻撃
CSRF(Cross Site Request Forgery)とは、ドメイン間で偽造を要求することを指し、近年一般に知られつつある攻撃方式である.
攻撃の原理
攻撃者は,ユーザがブラウザに保存した認証情報を利用して,対応するサイトに偽造要求を送信する.ユーザーがAサイトにログインした場合、認証情報はクッキーに保存され、ユーザーが悪意のあるサイトBにアクセスした場合、攻撃者はBサイトを通じて偽造の要求をAサイトサーバーに提出し、Aサイトが自分のサイトからの要求だと勘違いし、攻撃者に一部の情報の改ざんに成功させることができる.
攻撃例
サーバ側がユーザーアカウントを削除するビュー操作が
ユーザがログインすると、
防犯措置 HTTPメソッド を正しく使用する. CSRFトークン有効 ここで、CSRFトークンは比較的一般的な方法であり、具体的には、フォームのコミットに擬似乱数、すなわちCSRFトークン(token)を追加する方法であり、ここでは詳細に説明しない.
インジェクション攻撃
注入攻撃は主にシステムコマンド注入、SQL注入、NoSQL注入、ORM注入などが含まれています.ここではSQL注入について簡単に紹介します.
攻撃の原理
SQL文を作成する際に、ユーザーから直接入力された入力をパラメータとして文字列をつなぎ合わせてSQLクエリに挿入すると、攻撃者はSQL文を利用してデータベースの情報を改ざんし、盗むことができます.
攻撃の例
@app.route('/student')
def get_table():
password = request.args.get('password')
cur = db.execute('SELECT * FROM students WHERE password='%s;'
% password)
results = cur.fetchall()
return results
攻撃者が入力した値が「or 1=1--」の場合、studentsテーブルのすべてのデータが返されることを意味します.または「;drop table users;--」と入力するとstudentsテーブルのすべてのデータが削除されます.
主な防犯方法
XSS(Cross-Site Scripting)は、クロスステーションスクリプト攻撃であり、CSS積層スタイルシートとネーミング競合を回避するためにXでCross(クロス)を表す
攻撃の原理
XSSは実は注入攻撃の一種であり,被攻撃者のウェブサイトにコードを注入することで,ユーザがアクセスすると注入された悪意のあるスクリプトを実行する.このうち,XSS攻撃は主に反射型XSS攻撃と記憶型XSS攻撃の2種類に分けられる.
攻撃例
反射型XSS攻撃
反射型XSSは非永続型XSSとも呼ばれ、あるサイトにXSSの脆弱性がある場合、URLから悪意のあるスクリプトを注入することができ、ユーザーがこのURLにアクセスすると攻撃スクリプトを実行する.
@app.route('hello')
def hello():
name = request.args.get('name')
response = 'Hello, %s' % name
return response
ユーザーがjavascriptコードを入力し、
http://example.com/hello/alert('hahah');
にアクセスすると、クライアントが応答を紹介すると、ブラウザはこのコードを実行します.もちろん、このサンプルコードは脅威になりませんが、これは任意のjsコードを実行することができ、攻撃者が何をするかを知っていることを意味します.ストレージ型XSS攻撃
ストレージ型XSSは永続型XSSとも呼ばれ、反射型XSSと同様の動作をするが、インプラントされた悪意のあるコードをデータベースに格納し、メッセージエリアにリダイレクトコードを書き込むなど、ユーザーがメッセージエリアページにアクセスする際に悪意のあるサイトにリダイレクトされる.
防犯措置
CSRF(Cross Site Request Forgery)とは、ドメイン間で偽造を要求することを指し、近年一般に知られつつある攻撃方式である.
攻撃の原理
攻撃者は,ユーザがブラウザに保存した認証情報を利用して,対応するサイトに偽造要求を送信する.ユーザーがAサイトにログインした場合、認証情報はクッキーに保存され、ユーザーが悪意のあるサイトBにアクセスした場合、攻撃者はBサイトを通じて偽造の要求をAサイトサーバーに提出し、Aサイトが自分のサイトからの要求だと勘違いし、攻撃者に一部の情報の改ざんに成功させることができる.
攻撃例
サーバ側がユーザーアカウントを削除するビュー操作が
@app.route('/account/delete')
def delete_account():
if not current_user.authenticated:
abort(401)
current_user.delete()
return 'deleted!'
ユーザがログインすると、
https://example.com/account/delete
にアクセスするとアカウントが削除され、攻撃者のウェブサイト上で画像を表示するimgを作成すると、その中のsrcの属性が削除アカウントのURLを加え、ユーザがBサイトにアクセスすると、ブラウザ解析ページが自動的にそのリンクに要求を送信し、このときあなたのログイン情報はブラウザのクッキーに保存されるので、Bサイトにアクセスするだけでアカウントが削除されます.防犯措置