主にプログラミングに関して。Python, .NET Framework(C#), JavaScript, その他いくらか。
記事にあるサンプルやコードは要検証。使用に際しては責任を負いかねます

DockerでSQLインジェクションを試せるイメージを用意する

                
 今となってはいろいろ対策の手が打たれているが、それでも知識もなくWebアプリを作るとうっかりできてしまうことがあるSQLインジェクション。どんな立場からどんな攻撃ができうるかを示すために、脆弱性を持ったWebアプリを作ってみようと考えた。
 それを使って脆弱性をつついてもらうデモにしたい。つついてもらったらデータベースに変更が入る。そうしたら別の人に試してもらうにはリセットが必要となる。もろもろの環境リセットが簡単にできるとデモとして最高。そういうわけでDockerイメージとして脆弱性を持ったWebアプリをすぐ実行できるものを用意する。


 Webアプリ部分はどんなものにするか。とりあえずすごく簡単なものにしておく。アクセスしてきたクライアントにフォームを返す。フォームに名前を入力してPostする。フォームに入力された名前がデータベースにあれば、実行されたクエリ文とその名前が表示される。入力された名前がデータベースになければエラー文が表示される。以上のものをPythonで書いた。
1601241839287.jpg
1601241839493.jpg
1601241840245.jpg
 「John」とポストするだけなら問題ない。「John"; SELECT * FROM employees;DROP TABLE employees;"」などとポストされるとJohnの登録されていたテーブルが落ち、以降はJohnと入力してもデータベースにそもそもテーブルがないためエラーとなる。


Dockerfileは以下。
FROM ubuntu

RUN apt-get update && apt-get -y install nginx && \
apt-get install -y supervisor && \
apt-get install -y python3-pip && \
pip3 install gunicorn && \
pip3 install tornado

RUN apt-get install -y mysql-server

RUN echo "daemon off;" >> /etc/nginx/nginx.conf
RUN rm /etc/nginx/sites-enabled/default
ADD hello.conf /etc/nginx/conf.d/
RUN /etc/init.d/nginx reload

ADD * /usr/
WORKDIR /usr/
RUN dpkg -i mysql-connector-python-py3_2.1.3-1ubuntu14.04_all.deb
RUN /etc/init.d/mysql start && \
mysql < init.sql

EXPOSE 80
CMD /usr/bin/supervisord -c supervisord.conf

 Python製Webアプリ、MySQL、NginXはsupervisordでコントロールにした。PythonのMySQLConnectorはpipインストール設定が手間だったのでdebパッケージを落としてきてdpkgコマンドインストールにした。

 その他ファイルの設定はGithubにて公開中。
https://github.com/hMatoba/SQLInjection-DockerSample

 上記のDockerfileがあるディレクトリでビルドを実行する。
> docker build -t matoba/sql_injection ./
 
 ついでにどこからでもダウンロードできるようにプッシュしておく。
> docker push matoba/sql_injection

 イメージをダウンロードし、そこからコンテナを立ち上げて試してみる。
> docker pull matoba/sql_injection
> docker run -d -p 80:80 --name sql_inj matoba/sql_injection
1601241927297.jpg


 動いているので問題なし。あとはデータベースを含めたWebアプリ部分をもうちょっとまともにする。今のままでも試すことはできるが、かなり最低限に絞っているので試した人のインパクトは小さいだろう。
 Dockerのおかげで、いつでも使い捨てができる手軽なSQLインジェクションの脆弱性を持ったWebアプリデモが簡単に用意できるようになった。
 
スポンサーサイト



HTTP Strict Transport SecurityがIEにやっと実装されたようなので試してみる

                
 Win8.1とWin7のIE11にHTTP Strict Transport Security(HSTS)が実装されたそうなので試してみる。
https://developer.mozilla.org/ja/docs/Security/HTTP_Strict_Transport_Security
 参考は上記リンク。HTTP Strict Transport Securityとはサーバ側からクライアントに「これ以降HTTPSでアクセスしてこいや」という命令があったときにそれに従う機能である。命令を受け入れるとそれ以降はHTTPでアクセスしようとしてもHTTPSアクセスが強制されるようになる。

 今回はいわゆるオレオレ証明書を使ってHTTPSサーバを立てる。言語はPythonでフレームワークはTornadoを使う。ページは"/"のみ存在しており、"/"へアクセスすると現在時間をヘッダにHSTSセットした状態で返す(ただしHTTPS強制が有効な時間は一分間に設定)。つまり一度"/"にアクセスすると、以降は有効期間が一分間のHSTSがセットされるというサイト。
 このサイトはHTTPSでのみ公開される。HTTPでアクセスしても返すものがないのでエラーとなる。そんなものが下記のPythonスクリプト。

import os
import datetime

import tornado.wsgi
import tornado.httpserver


HTML = """<!DOCTYPE html>
<html>
<head>
<meta>
<title>hello</title>
</head>
<body>
{0}
</body>
</html>
"""


class MainHandler(tornado.web.RequestHandler):
def get(self):
self.add_header("Strict-Transport-Security", "max-age=60; includeSubdomains")
self.write(HTML.format(datetime.datetime.now()))


if __name__ == "__main__":
application = tornado.wsgi.WSGIApplication([
("/", MainHandler),
])
ssl_settings = {
"ssl_options": {"certfile": os.path.join("crt/tor.crt"),
"keyfile": os.path.join("crt/tor.key")}
}
container = tornado.wsgi.WSGIContainer(application)
http_server = tornado.httpserver.HTTPServer(container, **ssl_settings)
http_server.listen(8888)
tornado.ioloop.IOLoop.current().start()


 上記スクリプトを走らせて、https://localhost:8888/へアクセスしてみる。ブラウザはWin7で最新アップデートを適用したIE11。
 サーバからのレスポンスとして現在時間が取得できている。
1506130030218.jpg

 レスポンスヘッダを見てみるとStrict-Transport-Securityが設定されている。
1506130031186.jpg

 Strict-Transport-Securityが設定された状態でURLのhttpsをhttpにしてアクセスしてみる。httpでアクセスしてもサーバからはエラーが返されるはずなのに、現在時間がbodyとして書かれたHTMLがサーバから返ってきている。これはHTTPSでリクエストが送られたということだろう。開発者ツールのほうではプロトコルはHTTPのままになっているが……
1506130032271.jpg

 ただのhttpアクセスではエラーが出るのを確認するため、Strict-Transport-Securityの有効期間である一分待ったのちにhttpアクセスをもう一度かけてみた。結果は下記のようにエラー。
1506130034215.jpg



 念のため仮想マシンでサーバを立て、FiddlerでキャプチャすることでHTTPアクセスをしていないか改めて確認してみた。
 SSL通信でしかコンテンツを配信してないサーバにまずHTTPSアクセスしてHTTPS強制命令を取得。後にコンテンツのあるパスを打ち込んでHTTPアクセスするとアドレスバー内のアドレスがhttpsに書き換えられた状態でページが表示された。コンテンツのないパスを打ち込んでHTTPアクセスするとアドレスはhttpのまんまでNot Foundエラー表示。 両方の場合ともFiddlerでプロトコルを確認するとHTTPSアクセスしか行っていなかった。HTTPでのアクセスは一切なし。正しい。
 さらに同じドメインへのリンクをhttp://始まりで置いてこれを踏んでみたところ、これもまたHTTPSでアクセスが行われた。HTTPS強制できている。
1506131412235.jpg
 アドレスが手打ちだろうとリンク踏みだろうと、HTTPSの強制化が確認できた。



 IE11に実装されたHSTSを試してみた。Strict-Transport-Securityをレスポンスヘッダにセットすることで以降のアクセスはHTTPSに強制されたようだ。だが一方で、Strict-Transport-Security有効状態でHTTPでアクセスしたときに、開発者ツールにはプロトコルがHTTPのままで表示された。ちょっと紛らわしい状態。

http://blogs.windows.com/msedgedev/2015/06/09/http-strict-transport-security-comes-to-internet-explorer-11-on-windows-8-1-and-windows-7/


 ちなみにSSLを使うハードルの一つにSSL証明書が有料ということがある。これが無償配布される話が出ていてとても気になる。
http://itpro.nikkeibp.co.jp/atcl/column/14/346926/121500129/
プロフィール

h

Author:h

最新記事
リンク
作ったものなど
月別アーカイブ
カテゴリ
タグリスト

検索フォーム
Amazon