我用Django 2(Python 3)实现了一个充满错误的Web应用程序
总结
我创建了一个基于Django 2.0的克隆版本,名为“EasyBuggy Django”,这是一个之前介绍过的充满漏洞的Web应用程序“EasyBuggy”。
可以通过以下命令从下载到启动来完成。
$ git clone https://github.com/k-tamura/easybuggy4django.git
$ cd easybuggy4django/
$ pip install -r requirements.txt
$ python manage.py runserver
起動するにはPython 3が必要です。
python manage.py runserver 9000
とすると9000番ポートで起動します。在执行上述命令之前,建议先构建Python的虚拟环境。
$ python3 -m venv venv
$ source venv/bin/activate
当您看到以下消息时,Web应用程序已成功启动。
System check identified no issues (0 silenced).
May 29, 2018 - 16:50:34
Django version 2.0.4, using settings 'config.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.
当访问 http://localhost:8000 时,将会显示主页面。
这个应用程序的用途
「EasyBuggy」的目的与之类似,都是为了复现和分析各种问题,以加深理解。目前已实现的包括以下错误和漏洞。
-
- デッドロック(Python)
-
- デッドロック(SQL)
-
- 無限ループ
-
- リダイレクトループ
-
- メモリリーク
-
- ネットワークソケットリーク
-
- データベースコネクションリーク
-
- ファイルディスクリプタリーク
-
- スレッドリーク
-
- 文字化け
-
- 整数オーバーフロー
-
- 丸め誤差
-
- 打ち切り誤差
-
- 情報落ち
-
- XSS (クロスサイトスクリプティング)
-
- SQLインジェクション
-
- LDAPインジェクション
-
- コードインジェクション
-
- OSコマンドインジェクション
-
- メールヘッダーインジェクション
-
- サイズ制限の無いファイルアップロード
-
- 拡張子制限の無いファイルアップロード
-
- ブルートフォース攻撃可能なログイン画面
-
- オープンリダイレクト可能なログイン画面
-
- 親切過ぎる認証エラーメッセージ
-
- CSRF (クロスサイトリクエストフォージェリ)
-
- クリックジャッキング
- XXE (XML外部エンティティ)
这一次我用Python进行实现。即使是相同的功能,与之前使用Java时可能会有不同的行为,这让我受益匪浅。
示威
以下是一个演示,通过代码注入来停止EasyBuggy Django。
构成的区别点
我已经创建了“EasyBuggy”的两个克隆版本,分别是“EasyBuggy Boot”(基于Spring Boot)和“EasyBuggy Bootlin”(基于Spring Boot且使用Kotlin实现),它们与原始版本的主要区别如下。
相違点EasyBuggyEasyBuggy BootEasyBuggy BootlinEasyBuggy Django言語JavaJavaKotlinPythonベースとなる技術Servlet 3.0.1Spring Boot 1.5.6 (Servlet 3.0.1)Spring Boot 1.5.7 (Servlet 3.0.1)Django 2.0プレゼンテーション層未使用 (一部 JSP 2.2 + JSTL 1.2)Thymeleaf 2.1.5 (一部 JSP 2.3 + JSTL 1.2)Thymeleaf 2.1.5 (一部 JSP 2.3 + JSTL 1.2)Django 2.0コンテナTomcat 7.0.37Tomcat 8.5.16Tomcat 8.5.20(Django組み込みの開発用Web サーバー)DBクライアント/サーバーJDBC / Derby 10.8.3.0Spring JDBC 4.3.9 / Derby 10.12.1.1 (Java 7の場合)、または10.13.1.1 (Java 8の場合)Spring JDBC 4.3.11 / Derby 10.13.1.1PyMySQL 0.8.0 / MySQLサーバーが必要LDAPクライアント/サーバーApache DS Client API 1.0.0 / Server 1.5.5Spring LDAP 2.3.1 / unboundid-ldapsdk 3.2.1Spring LDAP 2.3.1 / unboundid-ldapsdk 3.2.1LDAP3 2.5 / 任意LDAPサーバーが必要メールJavaMail 1.5.1JavaMail 1.5.1 (Spring Boot Mailで導入されるJavaMail 1.5.6をオーバーライド)JavaMail 1.5.1 (Spring Boot Mailで導入されるJavaMail 1.5.6をオーバーライド)smtplib(標準ライブラリ)開発ツール無しSpring Boot Developer Tools 1.5.6Spring Boot Developer Tools 1.5.7無しビルドツールMavenMavenGradle無し実行環境JRE 6以上をサポートJRE 7以上をサポートJRE 8以上をサポートPython 3
研發方式 de
我在开发EasyBuggy Django时使用Pycharm。只需在”Run/Debug Configurations”中设置带有runserver参数的manage.py启动配置,便可进行调试、修复和即时验证。
最终
虽然还有许多未实现的功能和问题,但我已经发布了。我在工作中几乎没有使用过Python和Django,所以如果你能给出一些建议,我会很高兴。如果你有任何关于“这种实现可能存在问题和漏洞”的信息,请务必告诉我。
请参考
Django 文档的安全问题存档