├── VERSION ├── public ├── favicon.ico ├── robots.txt ├── .htaccess ├── web.config └── index.php ├── database ├── .gitignore ├── factories │ └── .gitignore └── seeds │ └── DatabaseSeeder.php ├── bootstrap ├── cache │ └── .gitignore └── app.php ├── storage ├── logs │ └── .gitignore ├── app │ ├── public │ │ └── .gitignore │ └── .gitignore └── framework │ ├── testing │ └── .gitignore │ ├── views │ └── .gitignore │ ├── cache │ ├── data │ │ └── .gitignore │ └── .gitignore │ ├── sessions │ └── .gitignore │ └── .gitignore ├── app ├── Libs │ ├── wordfiles │ │ ├── Plugins │ │ │ └── WPvulnDB │ │ │ │ ├── postie.conf │ │ │ │ ├── commentluv.conf │ │ │ │ ├── store-locator-le.conf │ │ │ │ ├── wp-print.conf │ │ │ │ ├── wp-spamfree.conf │ │ │ │ ├── flare.conf │ │ │ │ ├── formget-contact-form.conf │ │ │ │ ├── sexybookmarks.conf │ │ │ │ ├── starbox.conf │ │ │ │ ├── white-label-cms.conf │ │ │ │ ├── wp-postviews.conf │ │ │ │ ├── wp-super-cache.conf │ │ │ │ ├── clicky.conf │ │ │ │ ├── cloudflare.conf │ │ │ │ ├── code-snippets.conf │ │ │ │ ├── image-widget.conf │ │ │ │ ├── portfolio-slideshow.conf │ │ │ │ ├── wordpress-seo.conf │ │ │ │ ├── facebook-members.conf │ │ │ │ ├── nofollow.conf │ │ │ │ ├── polylang.conf │ │ │ │ ├── wp-dbmanager.conf │ │ │ │ ├── wp125.conf │ │ │ │ ├── yop-poll.conf │ │ │ │ ├── shareaholic.conf │ │ │ │ ├── wp-ban.conf │ │ │ │ ├── adminimize.conf │ │ │ │ ├── coming-soon.conf │ │ │ │ ├── crayon-syntax-highlighter.conf │ │ │ │ ├── html-sitemap.conf │ │ │ │ ├── optinmonster.conf │ │ │ │ ├── photo-gallery.conf │ │ │ │ ├── wp-useronline.conf │ │ │ │ ├── akismet.conf │ │ │ │ ├── easy-coming-soon.conf │ │ │ │ ├── wp-clone-by-wp-academy.conf │ │ │ │ ├── wp-mobile-detect.conf │ │ │ │ ├── 404-to-301.conf │ │ │ │ ├── anti-spam.conf │ │ │ │ ├── gallery-bank.conf │ │ │ │ ├── meta-box.conf │ │ │ │ ├── wp-copyprotect.conf │ │ │ │ ├── custom-login.conf │ │ │ │ ├── duplicate-post.conf │ │ │ │ ├── printfriendly.conf │ │ │ │ ├── related-posts.conf │ │ │ │ ├── search-everything.conf │ │ │ │ ├── wp-photo-album-plus.conf │ │ │ │ ├── contextual-related-posts.conf │ │ │ │ ├── wp-email.conf │ │ │ │ ├── erident-custom-login-and-dashboard.conf │ │ │ │ ├── antivirus.conf │ │ │ │ ├── groups.conf │ │ │ │ ├── wassup.conf │ │ │ │ ├── feedwordpress.conf │ │ │ │ ├── gtranslate.conf │ │ │ │ ├── styles.conf │ │ │ │ ├── maxbuttons.conf │ │ │ │ ├── wp-piwik.conf │ │ │ │ ├── updraftplus.conf │ │ │ │ ├── wangguard.conf │ │ │ │ ├── addthis.conf │ │ │ │ ├── wp-stats.conf │ │ │ │ ├── wp-members.conf │ │ │ │ ├── cta.conf │ │ │ │ ├── adrotate.conf │ │ │ │ ├── syntaxhighlighter.conf │ │ │ │ ├── gallery-plugin.conf │ │ │ │ ├── backwpup.conf │ │ │ │ ├── gigpress.conf │ │ │ │ ├── wp-polls.conf │ │ │ │ ├── wp-slimstat.conf │ │ │ │ ├── formidable.conf │ │ │ │ ├── powerpress.conf │ │ │ │ ├── mp3-jplayer.conf │ │ │ │ ├── relevanssi.conf │ │ │ │ ├── sitemap.conf │ │ │ │ ├── link-library.conf │ │ │ │ ├── newstatpress.conf │ │ │ │ ├── sharebar.conf │ │ │ │ ├── formbuilder.conf │ │ │ │ ├── polldaddy.conf │ │ │ │ ├── maintenance.conf │ │ │ │ ├── duplicator.conf │ │ │ │ ├── attachments.conf │ │ │ │ ├── bbpress.conf │ │ │ │ ├── wptouch.conf │ │ │ │ ├── jetpack.conf │ │ │ │ ├── buddypress.conf │ │ │ │ ├── wordfence.conf │ │ │ │ ├── redirection.conf │ │ │ │ ├── captcha.conf │ │ │ │ ├── woocommerce.conf │ │ │ │ └── player.conf │ │ ├── CMS.conf │ │ ├── metas.conf │ │ ├── JSLibs.conf │ │ ├── keywords.conf │ │ └── comments.conf │ ├── TranslateableMessage.php │ ├── Searcher.php │ ├── Remover.php │ ├── js_analysis_config.json │ └── cms_analysis_config.json ├── Http │ ├── Middleware │ │ ├── EncryptCookies.php │ │ ├── CheckForMaintenanceMode.php │ │ ├── TrimStrings.php │ │ ├── TrustProxies.php │ │ ├── Authenticate.php │ │ ├── VerifyCsrfToken.php │ │ └── RedirectIfAuthenticated.php │ ├── Controllers │ │ ├── Controller.php │ │ ├── Auth │ │ │ ├── ForgotPasswordController.php │ │ │ ├── LoginController.php │ │ │ ├── ResetPasswordController.php │ │ │ ├── VerificationController.php │ │ │ └── RegisterController.php │ │ └── ScanController.php │ ├── Requests │ │ └── ScanStartRequest.php │ └── Kernel.php ├── Providers │ ├── BroadcastServiceProvider.php │ ├── AppServiceProvider.php │ ├── AuthServiceProvider.php │ ├── EventServiceProvider.php │ └── RouteServiceProvider.php ├── User.php ├── Console │ └── Kernel.php ├── Exceptions │ └── Handler.php ├── Jobs │ └── LeakJob.php └── InfoLeakScan.php ├── tests ├── TestCase.php ├── Unit │ ├── ExampleTest.php │ ├── HTTPTest.php │ └── ScannerTest.php ├── Feature │ └── ExampleTest.php └── CreatesApplication.php ├── .env.example ├── resources ├── sass │ ├── app.scss │ └── _variables.scss ├── lang │ └── en │ │ ├── pagination.php │ │ ├── auth.php │ │ ├── passwords.php │ │ └── validation.php ├── js │ ├── components │ │ └── ExampleComponent.vue │ ├── app.js │ └── bootstrap.js └── views │ └── welcome.blade.php ├── Dockerfile ├── config ├── scanner.php ├── view.php ├── services.php ├── hashing.php ├── broadcasting.php ├── filesystems.php ├── queue.php ├── logging.php ├── cache.php ├── auth.php ├── database.php ├── mail.php ├── session.php └── app.php ├── routes ├── channels.php ├── api.php ├── console.php └── web.php ├── server.php ├── LICENSE ├── .travis.yml ├── package.json ├── phpunit.xml ├── artisan ├── composer.json └── .gitignore /VERSION: -------------------------------------------------------------------------------- 1 | 2.0.10 2 | -------------------------------------------------------------------------------- /public/favicon.ico: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /database/.gitignore: -------------------------------------------------------------------------------- 1 | *.sqlite 2 | -------------------------------------------------------------------------------- /bootstrap/cache/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !.gitignore 3 | -------------------------------------------------------------------------------- /storage/logs/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !.gitignore 3 | -------------------------------------------------------------------------------- /public/robots.txt: -------------------------------------------------------------------------------- 1 | User-agent: * 2 | Disallow: 3 | -------------------------------------------------------------------------------- /storage/app/public/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !.gitignore 3 | -------------------------------------------------------------------------------- /storage/app/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !public/ 3 | !.gitignore 4 | -------------------------------------------------------------------------------- /storage/framework/testing/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !.gitignore 3 | -------------------------------------------------------------------------------- /storage/framework/views/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !.gitignore 3 | -------------------------------------------------------------------------------- /storage/framework/cache/data/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !.gitignore 3 | -------------------------------------------------------------------------------- /storage/framework/sessions/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !.gitignore 3 | -------------------------------------------------------------------------------- /storage/framework/cache/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !data/ 3 | !.gitignore 4 | -------------------------------------------------------------------------------- /app/Libs/wordfiles/Plugins/WPvulnDB/postie.conf: -------------------------------------------------------------------------------- 1 | Postie 1.4.3 - Stored XSS 2 | -------------------------------------------------------------------------------- /app/Libs/wordfiles/Plugins/WPvulnDB/commentluv.conf: -------------------------------------------------------------------------------- 1 | CommentLuv 2.92.3 - Cross Site Scripting 2 | -------------------------------------------------------------------------------- /app/Libs/wordfiles/Plugins/WPvulnDB/store-locator-le.conf: -------------------------------------------------------------------------------- 1 | store-locator-le - SQL Injection 2 | -------------------------------------------------------------------------------- /app/Libs/wordfiles/Plugins/WPvulnDB/wp-print.conf: -------------------------------------------------------------------------------- 1 | WP-Print 2.51 - Setting Manipulation CSRF 2 | -------------------------------------------------------------------------------- /app/Libs/wordfiles/Plugins/WPvulnDB/wp-spamfree.conf: -------------------------------------------------------------------------------- 1 | WP-SpamFree 3.2.1 - Spam SQL Injection 2 | -------------------------------------------------------------------------------- /app/Libs/wordfiles/Plugins/WPvulnDB/flare.conf: -------------------------------------------------------------------------------- 1 | CloudFlare <= 1.3.20 - Cross-Site Scripting (XSS) 2 | -------------------------------------------------------------------------------- /app/Libs/wordfiles/Plugins/WPvulnDB/formget-contact-form.conf: -------------------------------------------------------------------------------- 1 | FormGet Contact Form 5.3 - Stored XSS 2 | -------------------------------------------------------------------------------- /app/Libs/wordfiles/Plugins/WPvulnDB/sexybookmarks.conf: -------------------------------------------------------------------------------- 1 | SexyBookmarks - Setting Manipulation CSRF 2 | -------------------------------------------------------------------------------- /app/Libs/wordfiles/Plugins/WPvulnDB/starbox.conf: -------------------------------------------------------------------------------- 1 | Starbox Voting - ajax.php Full Path Disclosure 2 | -------------------------------------------------------------------------------- /app/Libs/wordfiles/Plugins/WPvulnDB/white-label-cms.conf: -------------------------------------------------------------------------------- 1 | White Label CMS <= 1.5.2 - Stored XSS 2 | -------------------------------------------------------------------------------- /app/Libs/wordfiles/Plugins/WPvulnDB/wp-postviews.conf: -------------------------------------------------------------------------------- 1 | WP-PostViews 1.62 - Setting Manipulation CSRF 2 | -------------------------------------------------------------------------------- /app/Libs/wordfiles/Plugins/WPvulnDB/wp-super-cache.conf: -------------------------------------------------------------------------------- 1 | WP-Super-Cache 1.3 - Remote Code Execution 2 | -------------------------------------------------------------------------------- /app/Libs/wordfiles/Plugins/WPvulnDB/clicky.conf: -------------------------------------------------------------------------------- 1 | Clicky by Yoast <= 1.5 - Minor Security Improvements 2 | -------------------------------------------------------------------------------- /app/Libs/wordfiles/Plugins/WPvulnDB/cloudflare.conf: -------------------------------------------------------------------------------- 1 | CloudFlare <= 1.3.20 - Cross-Site Scripting (XSS) 2 | -------------------------------------------------------------------------------- /app/Libs/wordfiles/Plugins/WPvulnDB/code-snippets.conf: -------------------------------------------------------------------------------- 1 | bp-code-snippets <= 2.0 - XSS in ZeroClipboard 2 | -------------------------------------------------------------------------------- /app/Libs/wordfiles/Plugins/WPvulnDB/image-widget.conf: -------------------------------------------------------------------------------- 1 | grou-r&om-image-widget - Full Path Disclosure 2 | -------------------------------------------------------------------------------- /app/Libs/wordfiles/Plugins/WPvulnDB/portfolio-slideshow.conf: -------------------------------------------------------------------------------- 1 | portfolio-slideshow-pro v3 - SQL Injection 2 | -------------------------------------------------------------------------------- /app/Libs/wordfiles/Plugins/WPvulnDB/wordpress-seo.conf: -------------------------------------------------------------------------------- 1 | Yoast SEO <= 1.7.3.3 - Blind SQL Injection 2 | -------------------------------------------------------------------------------- /app/Libs/wordfiles/Plugins/WPvulnDB/facebook-members.conf: -------------------------------------------------------------------------------- 1 | facebook-members 5.0.4 - Setting Manipulation CSRF 2 | -------------------------------------------------------------------------------- /app/Libs/wordfiles/Plugins/WPvulnDB/nofollow.conf: -------------------------------------------------------------------------------- 1 | Nofollow Links <= 1.0.10 - Cross-Site Scripting (XSS) 2 | -------------------------------------------------------------------------------- /app/Libs/wordfiles/Plugins/WPvulnDB/polylang.conf: -------------------------------------------------------------------------------- 1 | Polylang 1.5.1 - User Description H&ling Stored XSS 2 | -------------------------------------------------------------------------------- /app/Libs/wordfiles/Plugins/WPvulnDB/wp-dbmanager.conf: -------------------------------------------------------------------------------- 1 | WP-DBManager 2.7.1 Authenticated Comm& Injection 2 | -------------------------------------------------------------------------------- /app/Libs/wordfiles/Plugins/WPvulnDB/wp125.conf: -------------------------------------------------------------------------------- 1 | WP125 <= 1.4.4 - Multiple XSS 2 | WP125 <= 1.4.9 - CSRF 3 | -------------------------------------------------------------------------------- /app/Libs/wordfiles/Plugins/WPvulnDB/yop-poll.conf: -------------------------------------------------------------------------------- 1 | YOP Poll <= 5.7.3 - Reflected Cross-Site Scripting (XSS) 2 | -------------------------------------------------------------------------------- /database/factories/.gitignore: -------------------------------------------------------------------------------- 1 | # Ignore everything in this directory 2 | * 3 | # Except this file 4 | !.gitignore -------------------------------------------------------------------------------- /app/Libs/wordfiles/Plugins/WPvulnDB/shareaholic.conf: -------------------------------------------------------------------------------- 1 | Shareaholic 7.6.0.3 - XSS 2 | Shareaholic - Unspecified CSRF 3 | -------------------------------------------------------------------------------- /app/Libs/wordfiles/Plugins/WPvulnDB/wp-ban.conf: -------------------------------------------------------------------------------- 1 | WP-Ban < 1.64 BlackList Bypass 2 | WP-Banners-Lite 1.4.0 - XSS 3 | -------------------------------------------------------------------------------- /app/Libs/wordfiles/Plugins/WPvulnDB/adminimize.conf: -------------------------------------------------------------------------------- 1 | adminimize 1.7.21 - 'page' Parameter Cross Site Scripting 2 | -------------------------------------------------------------------------------- /app/Libs/wordfiles/Plugins/WPvulnDB/coming-soon.conf: -------------------------------------------------------------------------------- 1 | Easy Coming Soon <= 1.6.1 - Stored Cross-Site Scripting (XSS) 2 | -------------------------------------------------------------------------------- /app/Libs/wordfiles/Plugins/WPvulnDB/crayon-syntax-highlighter.conf: -------------------------------------------------------------------------------- 1 | Crayon Syntax Highlighter 2.0 - 2.6.10 - Defacement 2 | -------------------------------------------------------------------------------- /app/Libs/wordfiles/Plugins/WPvulnDB/html-sitemap.conf: -------------------------------------------------------------------------------- 1 | WP HTML Sitemap 1.2 - wp-html-sitemap.html Sitemap Deletion CSRF 2 | -------------------------------------------------------------------------------- /app/Libs/wordfiles/Plugins/WPvulnDB/optinmonster.conf: -------------------------------------------------------------------------------- 1 | OptinMonster <= 1.1.4.5 - Execution of Arbitrary Shortcodes 2 | -------------------------------------------------------------------------------- /app/Libs/wordfiles/Plugins/WPvulnDB/photo-gallery.conf: -------------------------------------------------------------------------------- 1 | Photo-Gallery <= 1.2.41 - UploadHandler.php File Upload CSRF 2 | -------------------------------------------------------------------------------- /app/Libs/wordfiles/Plugins/WPvulnDB/wp-useronline.conf: -------------------------------------------------------------------------------- 1 | Wp-UserOnline <= 2.62 - Stored Cross-Site Scripting (XSS) 2 | -------------------------------------------------------------------------------- /app/Libs/wordfiles/Plugins/WPvulnDB/akismet.conf: -------------------------------------------------------------------------------- 1 | Akismet 2.5.0-3.1.4 - Unauthenticated Stored Cross-Site Scripting (XSS) 2 | -------------------------------------------------------------------------------- /app/Libs/wordfiles/Plugins/WPvulnDB/easy-coming-soon.conf: -------------------------------------------------------------------------------- 1 | Easy Coming Soon <= 1.6.1 - Stored Cross-Site Scripting (XSS) 2 | -------------------------------------------------------------------------------- /app/Libs/wordfiles/Plugins/WPvulnDB/wp-clone-by-wp-academy.conf: -------------------------------------------------------------------------------- 1 | wp-clone-by-wp-academy <= 2.1.1 - XSS in ZeroClipboard 2 | -------------------------------------------------------------------------------- /app/Libs/wordfiles/Plugins/WPvulnDB/wp-mobile-detect.conf: -------------------------------------------------------------------------------- 1 | WP Mobile Detector <= 3.2 - Stored Cross-Site Scripting (XSS) 2 | -------------------------------------------------------------------------------- /app/Libs/wordfiles/Plugins/WPvulnDB/404-to-301.conf: -------------------------------------------------------------------------------- 1 | 404 to 301 <= 2.3.0 - Unauthenticated Stored Cross-Site Scripting (XSS) 2 | -------------------------------------------------------------------------------- /app/Libs/wordfiles/Plugins/WPvulnDB/anti-spam.conf: -------------------------------------------------------------------------------- 1 | Anti-Spam by CleanTalk <= 5.21 - Unauthenticated Reflected Cross-Site Sc... 2 | -------------------------------------------------------------------------------- /app/Libs/wordfiles/Plugins/WPvulnDB/gallery-bank.conf: -------------------------------------------------------------------------------- 1 | Gallery Bank 2.0.19 - album-gallery-bank-class.php recordsArray Paramete... 2 | -------------------------------------------------------------------------------- /app/Libs/wordfiles/Plugins/WPvulnDB/meta-box.conf: -------------------------------------------------------------------------------- 1 | Delightful Downloads 1.3.1.1 - meta-boxes.php dedo_meta_boxes_save Funct... 2 | -------------------------------------------------------------------------------- /app/Libs/wordfiles/Plugins/WPvulnDB/wp-copyprotect.conf: -------------------------------------------------------------------------------- 1 | WP-CopyProtect <= 3.0.0 - CSRF & Stored Cross-Site Scripting (XSS) 2 | -------------------------------------------------------------------------------- /app/Libs/wordfiles/Plugins/WPvulnDB/custom-login.conf: -------------------------------------------------------------------------------- 1 | Erident Custom Login & Dashboard 3.4-3.4.1 - Stored Cross-Site Scripting... 2 | -------------------------------------------------------------------------------- /app/Libs/wordfiles/Plugins/WPvulnDB/duplicate-post.conf: -------------------------------------------------------------------------------- 1 | Duplicate Post 2.5 - duplicate-post-admin.php User Login Cookie Value SQ... 2 | -------------------------------------------------------------------------------- /app/Libs/wordfiles/Plugins/WPvulnDB/printfriendly.conf: -------------------------------------------------------------------------------- 1 | WP Print Friendly 3.3.7 - wp-admin/options.php printfriendly_option cust... 2 | -------------------------------------------------------------------------------- /app/Libs/wordfiles/Plugins/WPvulnDB/related-posts.conf: -------------------------------------------------------------------------------- 1 | Contextual Related Posts 1.8.10.1 - contextual-related-posts.php Multipl... 2 | -------------------------------------------------------------------------------- /app/Libs/wordfiles/Plugins/WPvulnDB/search-everything.conf: -------------------------------------------------------------------------------- 1 | Search Everything 7.0.2 - search-everything.php s Parameter SQL Injection 2 | -------------------------------------------------------------------------------- /app/Libs/wordfiles/Plugins/WPvulnDB/wp-photo-album-plus.conf: -------------------------------------------------------------------------------- 1 | WP Photo Album Plus < 4.8.12 - wp-photo-album-plus.php wppa-searchstring... 2 | -------------------------------------------------------------------------------- /app/Libs/wordfiles/Plugins/WPvulnDB/contextual-related-posts.conf: -------------------------------------------------------------------------------- 1 | Contextual Related Posts 1.8.10.1 - contextual-related-posts.php Multipl... 2 | -------------------------------------------------------------------------------- /app/Libs/wordfiles/Plugins/WPvulnDB/wp-email.conf: -------------------------------------------------------------------------------- 1 | WP-EMail <= 2.67.1 - SQL Injection 2 | WP-EMail <= 2.67.2 - Cross-Site Scripting (XSS) 3 | -------------------------------------------------------------------------------- /app/Libs/wordfiles/CMS.conf: -------------------------------------------------------------------------------- 1 | drupal 2 | joomla 3 | vbulletin 4 | veyton 5 | webspell 6 | wordpress 7 | wp-content 8 | xt-commerce 9 | xt:Commerce 10 | -------------------------------------------------------------------------------- /app/Libs/wordfiles/Plugins/WPvulnDB/erident-custom-login-and-dashboard.conf: -------------------------------------------------------------------------------- 1 | Erident Custom Login & Dashboard 3.4-3.4.1 - Stored Cross-Site Scripting... 2 | -------------------------------------------------------------------------------- /storage/framework/.gitignore: -------------------------------------------------------------------------------- 1 | config.php 2 | routes.php 3 | schedule-* 4 | compiled.php 5 | services.json 6 | events.scanned.php 7 | routes.scanned.php 8 | down 9 | -------------------------------------------------------------------------------- /app/Libs/wordfiles/Plugins/WPvulnDB/antivirus.conf: -------------------------------------------------------------------------------- 1 | AntiVirus 1.0 - PHP Backdoor Detection Bypass 2 | AntiVirus 1.0 - uninstall.php Direct Request Path Disclosure 3 | -------------------------------------------------------------------------------- /app/Libs/wordfiles/Plugins/WPvulnDB/groups.conf: -------------------------------------------------------------------------------- 1 | Groups 1.4.5 - Negated Role Capability H&ling Elevated Privilege Issue 2 | File Groups <= 1.1.2 - SQL Injection 3 | -------------------------------------------------------------------------------- /app/Libs/wordfiles/Plugins/WPvulnDB/wassup.conf: -------------------------------------------------------------------------------- 1 | WassUp Real Time Analytics <= 1.9 - Cross Site Scripting 2 | WassUp 1.4.3 - (spy.php to_date) SQL Injection Exploit 3 | -------------------------------------------------------------------------------- /app/Libs/wordfiles/Plugins/WPvulnDB/feedwordpress.conf: -------------------------------------------------------------------------------- 1 | FeedWordPress <= 2015.0426 - XSS & SQL-Injection 2 | FeedWordPress <= 2015.0426 - Cross-Site Scripting (XSS) 3 | -------------------------------------------------------------------------------- /app/Libs/wordfiles/Plugins/WPvulnDB/gtranslate.conf: -------------------------------------------------------------------------------- 1 | GTranslate <= 2.8.10 - Unauthenticated Open Redirect 2 | GTranslate 1.0.12 - gtranslate.php Widget Code Editing CSRF 3 | -------------------------------------------------------------------------------- /app/Libs/wordfiles/Plugins/WPvulnDB/styles.conf: -------------------------------------------------------------------------------- 1 | Slideshow 2.2.8-2.2.21 - Option Value Disclosure 2 | bib2html 0.9.3 - /OSBiB/create/index.php styleShortName Parameter XSS 3 | -------------------------------------------------------------------------------- /app/Libs/wordfiles/Plugins/WPvulnDB/maxbuttons.conf: -------------------------------------------------------------------------------- 1 | MaxButtons 1.26.0 - Cross Site Scripting (XSS) 2 | MaxButtons 1.19.0 - includes/maxbuttons-button-css.php Authentication By... 3 | -------------------------------------------------------------------------------- /app/Libs/wordfiles/Plugins/WPvulnDB/wp-piwik.conf: -------------------------------------------------------------------------------- 1 | WP-Piwik <= 1.0.10 - Unauthenticated Stored Cross-Site Scripting (XSS) 2 | WP-Piwik <= 1.0.4 - Cross-Site Scripting (XSS) 3 | -------------------------------------------------------------------------------- /app/Libs/wordfiles/Plugins/WPvulnDB/updraftplus.conf: -------------------------------------------------------------------------------- 1 | UpdraftPlus Backup & Restoration <= 1.9.6.3 - Cross-Site Scripting (XSS) 2 | UpdraftPlus <= 1.9.50 - Privilege Escalation 3 | -------------------------------------------------------------------------------- /app/Libs/wordfiles/Plugins/WPvulnDB/wangguard.conf: -------------------------------------------------------------------------------- 1 | WangGuard <= 1.7.2 - Authenticated Reflected Cross-Site Scripting (XSS) 2 | WangGuard <= 1.7.1 - Cross-Site Scripting (XSS) 3 | -------------------------------------------------------------------------------- /app/Libs/wordfiles/Plugins/WPvulnDB/addthis.conf: -------------------------------------------------------------------------------- 1 | AddThis Sharing Buttons <= 5.0.12 - Authenticated Cross-Site Scripting (... 2 | Smart Website Tools by AddThis 4.0.6-5.0.2 - Stored XSS 3 | -------------------------------------------------------------------------------- /app/Libs/wordfiles/Plugins/WPvulnDB/wp-stats.conf: -------------------------------------------------------------------------------- 1 | WP-Stats-Dashboard <= 2.9.4 - Authenticated Blind SQL Injection 2 | WP-Stats <= 2.51 - CSRF & Stored Cross-Site Scripting (XSS) 3 | -------------------------------------------------------------------------------- /app/Libs/wordfiles/Plugins/WPvulnDB/wp-members.conf: -------------------------------------------------------------------------------- 1 | WP-Members 2.8.9 - profile.php Multiple Parameter Stored XSS 2 | WP-Members 2.8.9 - wp-login.php register Action Multiple Parameter Refle... 3 | -------------------------------------------------------------------------------- /app/Libs/wordfiles/Plugins/WPvulnDB/cta.conf: -------------------------------------------------------------------------------- 1 | WordPress <= 4.4.2 - SSRF Bypass using Octal & Hexedecimal IP addresses 2 | Ajax Load More <= 2.8.1.1 - Authenticated File Upload & Deletion 3 | -------------------------------------------------------------------------------- /app/Libs/wordfiles/Plugins/WPvulnDB/adrotate.conf: -------------------------------------------------------------------------------- 1 | AdRotate <= 3.9.4 - clicktracker.php track Parameter SQL Injection 2 | AdRotate <= 3.6.6 - SQL Injection 3 | AdRotate <= 3.6.5 - SQL Injection 4 | -------------------------------------------------------------------------------- /app/Libs/wordfiles/Plugins/WPvulnDB/syntaxhighlighter.conf: -------------------------------------------------------------------------------- 1 | SyntaxHighlighter Evolved <= 3.1.9 - Unspecified Cross-Site Scripting (XSS) 2 | SyntaxHighlighter Evolved 3.1.5 - clipboard.swf Unspecified XSS 3 | -------------------------------------------------------------------------------- /app/Libs/wordfiles/Plugins/WPvulnDB/gallery-plugin.conf: -------------------------------------------------------------------------------- 1 | Gallery 3.06 - gallery-plugin/upload/php.php File Upload PHP Code Execution 2 | Gallery Plugin 3.8.3 - gallery-plugin.php filename_1 Parameter Arbitrary... 3 | -------------------------------------------------------------------------------- /app/Libs/wordfiles/Plugins/WPvulnDB/backwpup.conf: -------------------------------------------------------------------------------- 1 | BackWPUp 2.1.4 - Code Execution 2 | plugin BackWPup 1.5.2, 1.6.1, 1.7.1 - Remote & Local Code Execution 3 | BackWPup 3.0.12 - wp-admin/admin.php tab Parameter XSS 4 | -------------------------------------------------------------------------------- /app/Libs/wordfiles/Plugins/WPvulnDB/gigpress.conf: -------------------------------------------------------------------------------- 1 | GigPress <= 2.3.10 - Authenticated XSS & Blind SQLi 2 | GigPress <= 2.3.8 - Authenticated SQL Injection 3 | GigPress 2.1.10 - Stored Cross-Site Scripting (XSS) 4 | -------------------------------------------------------------------------------- /app/Libs/wordfiles/metas.conf: -------------------------------------------------------------------------------- 1 | author 2 | autor 3 | Cache-Control 4 | company 5 | dns-prefetch 6 | Expires 7 | generator 8 | publisher 9 | Refresh 10 | reply-to 11 | robots 12 | utf8 13 | x-dns-prefetch-control 14 | -------------------------------------------------------------------------------- /tests/TestCase.php: -------------------------------------------------------------------------------- 1 | call(UsersTableSeeder::class); 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /app/Libs/wordfiles/Plugins/WPvulnDB/polldaddy.conf: -------------------------------------------------------------------------------- 1 | Polldaddy Polls & Ratings <= 2.0.31 - Shortcode Stored Cross-Site Script... 2 | Polldaddy Polls & Rating 2.0.24 - polldaddy-org.php unique_id Ratings Sh... 3 | Polldaddy Polls & Rating 2.0.23 - polldaddy-org.php polldaddy-ratings-ti... 4 | Polldaddy Polls & Ratings 2.0.20 - Cross-Site Request Forgery 5 | -------------------------------------------------------------------------------- /app/Http/Middleware/EncryptCookies.php: -------------------------------------------------------------------------------- 1 | assertTrue(true); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /resources/sass/_variables.scss: -------------------------------------------------------------------------------- 1 | 2 | // Body 3 | $body-bg: #f8fafc; 4 | 5 | // Typography 6 | $font-family-sans-serif: "Nunito", sans-serif; 7 | $font-size-base: 0.9rem; 8 | $line-height-base: 1.6; 9 | 10 | // Colors 11 | $blue: #3490dc; 12 | $indigo: #6574cd; 13 | $purple: #9561e2; 14 | $pink: #f66D9b; 15 | $red: #e3342f; 16 | $orange: #f6993f; 17 | $yellow: #ffed4a; 18 | $green: #38c172; 19 | $teal: #4dc0b5; 20 | $cyan: #6cb2eb; 21 | -------------------------------------------------------------------------------- /app/Http/Controllers/Controller.php: -------------------------------------------------------------------------------- 1 | get('/'); 18 | 19 | $response->assertStatus(302); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /app/Libs/wordfiles/Plugins/WPvulnDB/duplicator.conf: -------------------------------------------------------------------------------- 1 | Multisite Post Duplicator <= 0.9.5.1 - Cross-Site Request Forgery (CSRF) 2 | Post Duplicator <= 2.16 - Cross-Site Scripting (XSS) 3 | Duplicator <= 1.1.3 - Cross-Site Request Forgery (CSRF) 4 | Duplicator <= 0.5.26 - Authenticated Cross-Site Scripting (XSS) 5 | Duplicator <= 0.5.14 - SQL Injection & CSRF 6 | Duplicator 0.5.8 - Privilege Escalation 7 | Duplicator - installer.cleanup.php package Parameter XSS 8 | -------------------------------------------------------------------------------- /app/Libs/wordfiles/Plugins/WPvulnDB/attachments.conf: -------------------------------------------------------------------------------- 1 | W3 Total Cache <= 0.9.4.1 – Authenticated Arbitrary File Download 2 | W3 Total Cache <= 0.9.4.1 – Authenticated Arbitrary File Upload 3 | GD bbPress Attachments <= 2.2 - Authenticated Reflected Cross-Site Scrip... 4 | GD bbPress Attachments <= 2.2 - Local File Inclusion 5 | Download Zip Attachments <= 1.0 - Arbitrary File Download 6 | Zip Attachments <= 1.1.4 - Arbitrary File Download 7 | Auto Attachments 0.2.9 - Shell Upload 8 | -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | FROM siwecos/dockered-laravel:7.2 2 | 3 | LABEL maintainer="Sascha Brendel " 4 | 5 | # Settings [Further information: https://github.com/SIWECOS/dockered-laravel#env-options] 6 | 7 | 8 | # Copy application 9 | COPY . . 10 | COPY .env.example .env 11 | 12 | # Install all PHP dependencies and change ownership of our applications 13 | RUN composer install --optimize-autoloader --no-dev --no-interaction \ 14 | && chown -R www-data:www-data . 15 | 16 | EXPOSE 80 17 | -------------------------------------------------------------------------------- /tests/CreatesApplication.php: -------------------------------------------------------------------------------- 1 | make(Kernel::class)->bootstrap(); 19 | 20 | return $app; 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /app/Libs/wordfiles/Plugins/WPvulnDB/bbpress.conf: -------------------------------------------------------------------------------- 1 | bbPress <= 2.5.9 - Display Name & Avatar Potential Cross-Site Scripting ... 2 | bbPress <= 2.5.8 - Stored Cross-Site Scripting (XSS) 3 | GD bbPress Attachments <= 2.2 - Authenticated Reflected Cross-Site Scrip... 4 | GD bbPress Attachments <= 2.2 - Local File Inclusion 5 | rtMedia for WordPress, BuddyPress & bbPress 3.7.39 - SQL Injection 6 | bbPress - Multiple Script Malformed Input Path Disclosure 7 | bbPress - forum.php page Parameter SQL Injection 8 | -------------------------------------------------------------------------------- /app/Providers/BroadcastServiceProvider.php: -------------------------------------------------------------------------------- 1 | env('USER_AGENT', 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.113 Safari/537.36'), 14 | 15 | ]; 16 | -------------------------------------------------------------------------------- /app/Libs/wordfiles/Plugins/WPvulnDB/wptouch.conf: -------------------------------------------------------------------------------- 1 | WPtouch Mobile Plugin <= 3.7.5.3 - Cross-Site Scripting (XSS) 2 | WPtouch <= 3.6.6 - Unvalidated Open Redirect 3 | WPtouch 3.x - Insecure Nonce Generation 4 | WPtouch 1.9.27 - 'wptouch_redirect' Parameter URI Redirection 5 | WPtouch 1.9.19.4 - Cross-Site Scripting (XSS) 6 | WPtouch 1.9.8 - ajax/file_upload.php Crafted Content-Type File Upload Re... 7 | WPtouch 1.9.8 - include/submit.php Multiple Parameter SQL Injection 8 | WP Super Cache 1.3 - trunk/plugins/wptouch.php URI XSS 9 | -------------------------------------------------------------------------------- /app/Http/Middleware/TrustProxies.php: -------------------------------------------------------------------------------- 1 | $translationStringId, 17 | 'placeholders' => $placeholders, 18 | ]; 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /app/Libs/wordfiles/keywords.conf: -------------------------------------------------------------------------------- 1 | attack 2 | cookie 3 | database error 4 | data-info 5 | detect 6 | exec 7 | googleoff 8 | googleon 9 | host 10 | include 11 | include_path 12 | Index of 13 | mysql error 14 | mysql error with query 15 | ogp 16 | optimizely 17 | Parent Directory 18 | Permission denied 19 | plugin 20 | regex 21 | RegExp 22 | remote 23 | requestId 24 | ServerInfo 25 | server-info 26 | session 27 | signatureToken 28 | SSI 29 | SSO 30 | test 31 | token 32 | twofactorauth 33 | unexpected error 34 | version 35 | virtual 36 | You have an error in your SQL syntax near 37 | -------------------------------------------------------------------------------- /app/Http/Middleware/Authenticate.php: -------------------------------------------------------------------------------- 1 | expectsJson()) { 18 | return route('login'); 19 | } 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /routes/channels.php: -------------------------------------------------------------------------------- 1 | id === (int) $id; 16 | }); 17 | -------------------------------------------------------------------------------- /app/Libs/wordfiles/Plugins/WPvulnDB/jetpack.conf: -------------------------------------------------------------------------------- 1 | Jetpack <= 4.0.3 - Multiple Vulnerabilities 2 | Polldaddy Polls & Ratings <= 2.0.31 - Shortcode Stored Cross-Site Script... 3 | Jetpack 2.0-4.0.2 - Shortcode Stored Cross-Site Scripting (XSS) 4 | Jetpack <= 3.9.1 - LaTeX HTML Element XSS 5 | Jetpack <= 3.7.0 - Information Disclosure 6 | Jetpack <= 3.7.0 - Stored Cross-Site Scripting (XSS) 7 | Jetpack <= 3.5.2 - Unauthenticated DOM Cross-Site Scripting (XSS) 8 | Jetpack 3.0-3.4.2 - Cross-Site Scripting (XSS) 9 | Jetpack <= 2.9.2 - class.jetpack.php XML-RPC Access Control Bypass 10 | -------------------------------------------------------------------------------- /app/Libs/wordfiles/comments.conf: -------------------------------------------------------------------------------- 1 | admin 2 | assumption 3 | backdoor 4 | broke 5 | broken 6 | bug 7 | bypass 8 | created 9 | credentials 10 | dangerous 11 | development 12 | edited 13 | error 14 | file 15 | fix 16 | fixme 17 | fraud 18 | generated 19 | hack 20 | hacks 21 | hidden 22 | key 23 | local 24 | logged 25 | modified 26 | oops 27 | pass 28 | passwd 29 | password 30 | passwort 31 | patched 32 | prevention 33 | problem 34 | pwd 35 | root 36 | secret 37 | server 38 | steal 39 | stolen 40 | task 41 | TODO 42 | trick 43 | user 44 | username 45 | usr 46 | warning 47 | warning 48 | wp-content 49 | wp-info 50 | -------------------------------------------------------------------------------- /app/Libs/wordfiles/Plugins/WPvulnDB/buddypress.conf: -------------------------------------------------------------------------------- 1 | BuddyPress 2.0-2.7.3 - Arbitrary File Deletion 2 | BuddyPress <= 2.3.4 - Authenticated Privilege Escalation 3 | BuddyPress Activity Plus <= 1.5 - Cross-Site Request Forgery (CSRF) 4 | rtMedia for WordPress, BuddyPress & bbPress 3.7.39 - SQL Injection 5 | BuddyPress Extended Friendship Request - wp-admin/admin-ajax.php friends... 6 | Buddypress <= 1.9.1 - Crafted bp_new_group_id Cookie Arbitrary Group Man... 7 | Buddypress <= 1.9.1 - Stored Cross-Site Scripting (XSS) 8 | Buddypress <= 1.5.4 - SQL Injection 9 | BuddyPress 1.2.9 - SQL Injection 10 | -------------------------------------------------------------------------------- /app/Http/Middleware/VerifyCsrfToken.php: -------------------------------------------------------------------------------- 1 | '« Previous', 17 | 'next' => 'Next »', 18 | 19 | ]; 20 | -------------------------------------------------------------------------------- /routes/api.php: -------------------------------------------------------------------------------- 1 | 'v2'], function () { 17 | Route::match(['get', 'post'], '/start', "ScanController@start"); 18 | }); 19 | -------------------------------------------------------------------------------- /routes/console.php: -------------------------------------------------------------------------------- 1 | comment(Inspiring::quote()); 18 | })->describe('Display an inspiring quote'); 19 | -------------------------------------------------------------------------------- /app/Libs/wordfiles/Plugins/WPvulnDB/redirection.conf: -------------------------------------------------------------------------------- 1 | 404 Redirection Manager 1.0 - SQL Injection 2 | 404 to 301 <= 2.3.0 - Unauthenticated Stored Cross-Site Scripting (XSS) 3 | SEO Redirection Plugin <= 2.8 - Authenticated Reflected Cross-Site Scrip... 4 | Redirection Page <= 1.2 - CSRF/XSS 5 | SEO Redirection <= 2.2 - Unauthenticated Stored Cross-Site Scripting (XSS) 6 | WPtouch 1.9.27 - 'wptouch_redirect' Parameter URI Redirection 7 | Redirection 2.3.3 - view/admin/item.php URL H&ling Reflected XSS 8 | Redirection - view/admin/log_item.php Non-existent Posts Referer HTTP He... 9 | Redirection - wp-admin/tools.php id Parameter XSS 10 | -------------------------------------------------------------------------------- /server.php: -------------------------------------------------------------------------------- 1 | 8 | */ 9 | 10 | $uri = urldecode( 11 | parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH) 12 | ); 13 | 14 | // This file allows us to emulate Apache's "mod_rewrite" functionality from the 15 | // built-in PHP web server. This provides a convenient way to test a Laravel 16 | // application without having installed a "real" web server software here. 17 | if ($uri !== '/' && file_exists(__DIR__.'/public'.$uri)) { 18 | return false; 19 | } 20 | 21 | require_once __DIR__.'/public/index.php'; 22 | -------------------------------------------------------------------------------- /app/Http/Middleware/RedirectIfAuthenticated.php: -------------------------------------------------------------------------------- 1 | check()) { 21 | return redirect('/home'); 22 | } 23 | 24 | return $next($request); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /resources/js/components/ExampleComponent.vue: -------------------------------------------------------------------------------- 1 | 16 | 17 | 24 | -------------------------------------------------------------------------------- /public/.htaccess: -------------------------------------------------------------------------------- 1 | 2 | 3 | Options -MultiViews -Indexes 4 | 5 | 6 | RewriteEngine On 7 | 8 | # Handle Authorization Header 9 | RewriteCond %{HTTP:Authorization} . 10 | RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}] 11 | 12 | # Redirect Trailing Slashes If Not A Folder... 13 | RewriteCond %{REQUEST_FILENAME} !-d 14 | RewriteCond %{REQUEST_URI} (.+)/$ 15 | RewriteRule ^ %1 [L,R=301] 16 | 17 | # Handle Front Controller... 18 | RewriteCond %{REQUEST_FILENAME} !-d 19 | RewriteCond %{REQUEST_FILENAME} !-f 20 | RewriteRule ^ index.php [L] 21 | 22 | -------------------------------------------------------------------------------- /resources/lang/en/auth.php: -------------------------------------------------------------------------------- 1 | 'These credentials do not match our records.', 17 | 'throttle' => 'Too many login attempts. Please try again in :seconds seconds.', 18 | 19 | ]; 20 | -------------------------------------------------------------------------------- /app/Libs/wordfiles/Plugins/WPvulnDB/captcha.conf: -------------------------------------------------------------------------------- 1 | All In One WP Security & Firewall <= 4.1.2 - Multiple vulnerabilities in... 2 | PlusCaptcha Plugin <= 2.0.14 - Cross-Site Request Forgery (CSRF) 3 | Google Captcha <= 1.12 - Authentication Bypass 4 | Captcha <= 4.0.6 - Captcha Bypass 5 | SI CAPTCHA 2.7.4 - Cross-Site Scripting (XSS) 6 | Conditional CAPTCHA 3.6 - wp-conditional-captcha.php Settings Page CSRF 7 | Captcha 2.12-3.8.1 - Captcha Bypass 8 | IndiaNIC FAQs Manager 1.0 - CAPTCHA Value Disclosure 9 | FunCaptcha 0.3.2- Setting Manipulation CSRF 10 | FunCaptcha 0.4.3 - wp_funcaptcha_admin_activate.php URI XSS 11 | Super CAPTCHA <= 2.2.4 - SQL Injection 12 | Google reCAPTCHA <= 3.1.3 - Reflected XSS 13 | -------------------------------------------------------------------------------- /routes/web.php: -------------------------------------------------------------------------------- 1 | 'App\Policies\ModelPolicy', 17 | ]; 18 | 19 | /** 20 | * Register any authentication / authorization services. 21 | * 22 | * @return void 23 | */ 24 | public function boot() 25 | { 26 | $this->registerPolicies(); 27 | 28 | // 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /app/Providers/EventServiceProvider.php: -------------------------------------------------------------------------------- 1 | [ 19 | SendEmailVerificationNotification::class, 20 | ], 21 | ]; 22 | 23 | /** 24 | * Register any events for your application. 25 | * 26 | * @return void 27 | */ 28 | public function boot() 29 | { 30 | parent::boot(); 31 | 32 | // 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /resources/lang/en/passwords.php: -------------------------------------------------------------------------------- 1 | 'Passwords must be at least eight characters and match the confirmation.', 17 | 'reset' => 'Your password has been reset!', 18 | 'sent' => 'We have e-mailed your password reset link!', 19 | 'token' => 'This password reset token is invalid.', 20 | 'user' => "We can't find a user with that e-mail address.", 21 | 22 | ]; 23 | -------------------------------------------------------------------------------- /app/User.php: -------------------------------------------------------------------------------- 1 | 'datetime', 38 | ]; 39 | } 40 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | /** 2 | * Automatic Detection of Information Leakage Vulnerabilities in 3 | * Web Applications. 4 | * 5 | * Copyright (C) 2015-2019 Ruhr University Bochum 6 | * 7 | * @author Yakup Ates . 21 | */ 22 | -------------------------------------------------------------------------------- /app/Http/Controllers/Auth/ForgotPasswordController.php: -------------------------------------------------------------------------------- 1 | middleware('guest'); 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /app/Console/Kernel.php: -------------------------------------------------------------------------------- 1 | command('inspire') 28 | // ->hourly(); 29 | } 30 | 31 | /** 32 | * Register the commands for the application. 33 | * 34 | * @return void 35 | */ 36 | protected function commands() 37 | { 38 | $this->load(__DIR__.'/Commands'); 39 | 40 | require base_path('routes/console.php'); 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: php 2 | 3 | php: 4 | - "7.2" 5 | 6 | cache: 7 | directories: 8 | - "./vendor" 9 | 10 | dist: trusty 11 | 12 | before_script: 13 | - composer install --no-interaction 14 | 15 | script: 16 | - vendor/bin/phpunit 17 | - docker build -t infoleak-scanner . 18 | 19 | before_deploy: 20 | - echo "$DOCKER_PASSWORD" | docker login -u "$DOCKER_USERNAME" --password-stdin 21 | 22 | deploy: 23 | - provider: script 24 | skip_cleanup: true 25 | on: 26 | branch: develop 27 | script: >- 28 | docker tag infoleak-scanner siwecos/infoleak-scanner:develop && 29 | docker push siwecos/infoleak-scanner:develop 30 | - provider: script 31 | skip_cleanup: true 32 | on: 33 | branch: master 34 | script: >- 35 | docker tag infoleak-scanner siwecos/infoleak-scanner:latest && 36 | docker push siwecos/infoleak-scanner:latest 37 | - provider: script 38 | skip_cleanup: true 39 | on: 40 | tags: true 41 | script: >- 42 | docker tag infoleak-scanner siwecos/infoleak-scanner:$TRAVIS_TAG && 43 | docker push siwecos/infoleak-scanner:$TRAVIS_TAG 44 | -------------------------------------------------------------------------------- /app/Http/Requests/ScanStartRequest.php: -------------------------------------------------------------------------------- 1 | 'required|string', 28 | 'dangerLevel' => 'integer|min:0|max:10', 29 | 'callbackurls' => 'array', 30 | "callbackurls.*" => 'url', 31 | 'userAgent' => 'string' 32 | ]; 33 | } 34 | 35 | /** 36 | * Custom message for validation 37 | * 38 | * @return array 39 | */ 40 | public function messages() 41 | { 42 | return [ 43 | 'url.required' => 'URL is required!' 44 | ]; 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /app/Http/Controllers/Auth/LoginController.php: -------------------------------------------------------------------------------- 1 | middleware('guest')->except('logout'); 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /app/Http/Controllers/Auth/ResetPasswordController.php: -------------------------------------------------------------------------------- 1 | middleware('guest'); 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /app/Http/Controllers/ScanController.php: -------------------------------------------------------------------------------- 1 | get('callbackurls')) { 14 | LeakJob::dispatch($request->validated()); 15 | 16 | return "OK"; 17 | } 18 | 19 | $scan = new InfoLeakScan( 20 | $request->get('url'), 21 | 0, 22 | $request->get('callbackurls', []), 23 | $request->get('userAgent', config('scanner.user_agent')) 24 | ); 25 | 26 | return response($scan->scan(), 200) 27 | ->header('Content-Type', 'application/json; charset=utf-8') 28 | ->header('User-Agent', $request->get('userAgent', config('scanner.user_agent'))); 29 | } 30 | 31 | public function reflect(ScanStartRequest $request) { 32 | if (count($request->json()->all())) { 33 | return $request->json()->all(); 34 | } 35 | return "[-] Could not reflect"; 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /config/view.php: -------------------------------------------------------------------------------- 1 | [ 17 | resource_path('views'), 18 | ], 19 | 20 | /* 21 | |-------------------------------------------------------------------------- 22 | | Compiled View Path 23 | |-------------------------------------------------------------------------- 24 | | 25 | | This option determines where all the compiled Blade templates will be 26 | | stored for your application. Typically, this is within the storage 27 | | directory. However, as usual, you are free to change this value. 28 | | 29 | */ 30 | 31 | 'compiled' => env( 32 | 'VIEW_COMPILED_PATH', 33 | realpath(storage_path('framework/views')) 34 | ), 35 | 36 | ]; 37 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "private": true, 3 | "scripts": { 4 | "dev": "npm run development", 5 | "development": "cross-env NODE_ENV=development node_modules/webpack/bin/webpack.js --progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js", 6 | "watch": "npm run development -- --watch", 7 | "watch-poll": "npm run watch -- --watch-poll", 8 | "hot": "cross-env NODE_ENV=development node_modules/webpack-dev-server/bin/webpack-dev-server.js --inline --hot --config=node_modules/laravel-mix/setup/webpack.config.js", 9 | "prod": "npm run production", 10 | "production": "cross-env NODE_ENV=production node_modules/webpack/bin/webpack.js --no-progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js" 11 | }, 12 | "devDependencies": { 13 | "axios": "^0.18", 14 | "bootstrap": "^4.0.0", 15 | "cross-env": "^5.1", 16 | "jquery": "^3.2", 17 | "laravel-mix": "^4.0.7", 18 | "lodash": "^4.17.5", 19 | "popper.js": "^1.12", 20 | "resolve-url-loader": "^2.3.1", 21 | "sass": "^1.15.2", 22 | "sass-loader": "^7.1.0", 23 | "vue": "^2.5.17" 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /resources/js/app.js: -------------------------------------------------------------------------------- 1 | 2 | /** 3 | * First we will load all of this project's JavaScript dependencies which 4 | * includes Vue and other libraries. It is a great starting point when 5 | * building robust, powerful web applications using Vue and Laravel. 6 | */ 7 | 8 | require('./bootstrap'); 9 | 10 | window.Vue = require('vue'); 11 | 12 | /** 13 | * The following block of code may be used to automatically register your 14 | * Vue components. It will recursively scan this directory for the Vue 15 | * components and automatically register them with their "basename". 16 | * 17 | * Eg. ./components/ExampleComponent.vue -> 18 | */ 19 | 20 | // const files = require.context('./', true, /\.vue$/i); 21 | // files.keys().map(key => Vue.component(key.split('/').pop().split('.')[0], files(key).default)); 22 | 23 | Vue.component('example-component', require('./components/ExampleComponent.vue').default); 24 | 25 | /** 26 | * Next, we will create a fresh Vue application instance and attach it to 27 | * the page. Then, you may begin adding components to this application 28 | * or customize the JavaScript scaffolding to fit your unique needs. 29 | */ 30 | 31 | const app = new Vue({ 32 | el: '#app' 33 | }); 34 | -------------------------------------------------------------------------------- /app/Http/Controllers/Auth/VerificationController.php: -------------------------------------------------------------------------------- 1 | middleware('auth'); 38 | $this->middleware('signed')->only('verify'); 39 | $this->middleware('throttle:6,1')->only('verify', 'resend'); 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /app/Exceptions/Handler.php: -------------------------------------------------------------------------------- 1 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | -------------------------------------------------------------------------------- /phpunit.xml: -------------------------------------------------------------------------------- 1 | 2 | 11 | 12 | 13 | ./tests/Unit 14 | 15 | 16 | 17 | ./tests/Feature 18 | 19 | 20 | 21 | 22 | ./app 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | -------------------------------------------------------------------------------- /config/services.php: -------------------------------------------------------------------------------- 1 | [ 18 | 'domain' => env('MAILGUN_DOMAIN'), 19 | 'secret' => env('MAILGUN_SECRET'), 20 | 'endpoint' => env('MAILGUN_ENDPOINT', 'api.mailgun.net'), 21 | ], 22 | 23 | 'postmark' => [ 24 | 'token' => env('POSTMARK_TOKEN'), 25 | ], 26 | 27 | 'ses' => [ 28 | 'key' => env('AWS_ACCESS_KEY_ID'), 29 | 'secret' => env('AWS_SECRET_ACCESS_KEY'), 30 | 'region' => env('AWS_DEFAULT_REGION', 'us-east-1'), 31 | ], 32 | 33 | 'sparkpost' => [ 34 | 'secret' => env('SPARKPOST_SECRET'), 35 | ], 36 | 37 | 'stripe' => [ 38 | 'model' => App\User::class, 39 | 'key' => env('STRIPE_KEY'), 40 | 'secret' => env('STRIPE_SECRET'), 41 | 'webhook' => [ 42 | 'secret' => env('STRIPE_WEBHOOK_SECRET'), 43 | 'tolerance' => env('STRIPE_WEBHOOK_TOLERANCE', 300), 44 | ], 45 | ], 46 | 47 | ]; 48 | -------------------------------------------------------------------------------- /config/hashing.php: -------------------------------------------------------------------------------- 1 | 'bcrypt', 19 | 20 | /* 21 | |-------------------------------------------------------------------------- 22 | | Bcrypt Options 23 | |-------------------------------------------------------------------------- 24 | | 25 | | Here you may specify the configuration options that should be used when 26 | | passwords are hashed using the Bcrypt algorithm. This will allow you 27 | | to control the amount of time it takes to hash the given password. 28 | | 29 | */ 30 | 31 | 'bcrypt' => [ 32 | 'rounds' => env('BCRYPT_ROUNDS', 10), 33 | ], 34 | 35 | /* 36 | |-------------------------------------------------------------------------- 37 | | Argon Options 38 | |-------------------------------------------------------------------------- 39 | | 40 | | Here you may specify the configuration options that should be used when 41 | | passwords are hashed using the Argon algorithm. These will allow you 42 | | to control the amount of time it takes to hash the given password. 43 | | 44 | */ 45 | 46 | 'argon' => [ 47 | 'memory' => 1024, 48 | 'threads' => 2, 49 | 'time' => 2, 50 | ], 51 | 52 | ]; 53 | -------------------------------------------------------------------------------- /bootstrap/app.php: -------------------------------------------------------------------------------- 1 | singleton( 30 | Illuminate\Contracts\Http\Kernel::class, 31 | App\Http\Kernel::class 32 | ); 33 | 34 | $app->singleton( 35 | Illuminate\Contracts\Console\Kernel::class, 36 | App\Console\Kernel::class 37 | ); 38 | 39 | $app->singleton( 40 | Illuminate\Contracts\Debug\ExceptionHandler::class, 41 | App\Exceptions\Handler::class 42 | ); 43 | 44 | /* 45 | |-------------------------------------------------------------------------- 46 | | Return The Application 47 | |-------------------------------------------------------------------------- 48 | | 49 | | This script returns the application instance. The instance is given to 50 | | the calling script so we can separate the building of the instances 51 | | from the actual running of the application and sending responses. 52 | | 53 | */ 54 | 55 | return $app; 56 | -------------------------------------------------------------------------------- /config/broadcasting.php: -------------------------------------------------------------------------------- 1 | env('BROADCAST_DRIVER', 'null'), 19 | 20 | /* 21 | |-------------------------------------------------------------------------- 22 | | Broadcast Connections 23 | |-------------------------------------------------------------------------- 24 | | 25 | | Here you may define all of the broadcast connections that will be used 26 | | to broadcast events to other systems or over websockets. Samples of 27 | | each available type of connection are provided inside this array. 28 | | 29 | */ 30 | 31 | 'connections' => [ 32 | 33 | 'pusher' => [ 34 | 'driver' => 'pusher', 35 | 'key' => env('PUSHER_APP_KEY'), 36 | 'secret' => env('PUSHER_APP_SECRET'), 37 | 'app_id' => env('PUSHER_APP_ID'), 38 | 'options' => [ 39 | 'cluster' => env('PUSHER_APP_CLUSTER'), 40 | 'encrypted' => true, 41 | ], 42 | ], 43 | 44 | 'redis' => [ 45 | 'driver' => 'redis', 46 | 'connection' => 'default', 47 | ], 48 | 49 | 'log' => [ 50 | 'driver' => 'log', 51 | ], 52 | 53 | 'null' => [ 54 | 'driver' => 'null', 55 | ], 56 | 57 | ], 58 | 59 | ]; 60 | -------------------------------------------------------------------------------- /app/Providers/RouteServiceProvider.php: -------------------------------------------------------------------------------- 1 | mapApiRoutes(); 39 | 40 | $this->mapWebRoutes(); 41 | 42 | // 43 | } 44 | 45 | /** 46 | * Define the "web" routes for the application. 47 | * 48 | * These routes all receive session state, CSRF protection, etc. 49 | * 50 | * @return void 51 | */ 52 | protected function mapWebRoutes() 53 | { 54 | Route::middleware('web') 55 | ->namespace($this->namespace) 56 | ->group(base_path('routes/web.php')); 57 | } 58 | 59 | /** 60 | * Define the "api" routes for the application. 61 | * 62 | * These routes are typically stateless. 63 | * 64 | * @return void 65 | */ 66 | protected function mapApiRoutes() 67 | { 68 | Route::prefix('api') 69 | ->middleware('api') 70 | ->namespace($this->namespace) 71 | ->group(base_path('routes/api.php')); 72 | } 73 | } 74 | -------------------------------------------------------------------------------- /artisan: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env php 2 | make(Illuminate\Contracts\Console\Kernel::class); 34 | 35 | $status = $kernel->handle( 36 | $input = new Symfony\Component\Console\Input\ArgvInput, 37 | new Symfony\Component\Console\Output\ConsoleOutput 38 | ); 39 | 40 | /* 41 | |-------------------------------------------------------------------------- 42 | | Shutdown The Application 43 | |-------------------------------------------------------------------------- 44 | | 45 | | Once Artisan has finished running, we will fire off the shutdown events 46 | | so that any final work may be done by the application before we shut 47 | | down the process. This is the last thing to happen to the request. 48 | | 49 | */ 50 | 51 | $kernel->terminate($input, $status); 52 | 53 | exit($status); 54 | -------------------------------------------------------------------------------- /composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "laravel/laravel", 3 | "type": "project", 4 | "description": "The Laravel Framework.", 5 | "keywords": [ 6 | "framework", 7 | "laravel" 8 | ], 9 | "license": "MIT", 10 | "require": { 11 | "php": "^7.1.3", 12 | "fideloper/proxy": "^4.0", 13 | "giggsey/libphonenumber-for-php": "^8.10", 14 | "guzzlehttp/guzzle": "^6.3", 15 | "laravel/framework": "5.8.*", 16 | "laravel/tinker": "^1.0", 17 | "predis/predis": "^1.1" 18 | }, 19 | "require-dev": { 20 | "beyondcode/laravel-dump-server": "^1.0", 21 | "filp/whoops": "^2.0", 22 | "fzaninotto/faker": "^1.4", 23 | "mockery/mockery": "^1.0", 24 | "nunomaduro/collision": "^2.0", 25 | "phpunit/phpunit": "^7.5" 26 | }, 27 | "config": { 28 | "optimize-autoloader": true, 29 | "preferred-install": "dist", 30 | "sort-packages": true 31 | }, 32 | "extra": { 33 | "laravel": { 34 | "dont-discover": [] 35 | } 36 | }, 37 | "autoload": { 38 | "psr-4": { 39 | "App\\": "app/" 40 | }, 41 | "classmap": [ 42 | "database/seeds", 43 | "database/factories" 44 | ] 45 | }, 46 | "autoload-dev": { 47 | "psr-4": { 48 | "Tests\\": "tests/" 49 | } 50 | }, 51 | "minimum-stability": "dev", 52 | "prefer-stable": true, 53 | "scripts": { 54 | "post-autoload-dump": [ 55 | "Illuminate\\Foundation\\ComposerScripts::postAutoloadDump", 56 | "@php artisan package:discover --ansi" 57 | ], 58 | "post-root-package-install": [ 59 | "@php -r \"file_exists('.env') || copy('.env.example', '.env');\"" 60 | ], 61 | "post-create-project-cmd": [ 62 | "@php artisan key:generate --ansi" 63 | ] 64 | } 65 | } 66 | -------------------------------------------------------------------------------- /resources/js/bootstrap.js: -------------------------------------------------------------------------------- 1 | 2 | window._ = require('lodash'); 3 | 4 | /** 5 | * We'll load jQuery and the Bootstrap jQuery plugin which provides support 6 | * for JavaScript based Bootstrap features such as modals and tabs. This 7 | * code may be modified to fit the specific needs of your application. 8 | */ 9 | 10 | try { 11 | window.Popper = require('popper.js').default; 12 | window.$ = window.jQuery = require('jquery'); 13 | 14 | require('bootstrap'); 15 | } catch (e) {} 16 | 17 | /** 18 | * We'll load the axios HTTP library which allows us to easily issue requests 19 | * to our Laravel back-end. This library automatically handles sending the 20 | * CSRF token as a header based on the value of the "XSRF" token cookie. 21 | */ 22 | 23 | window.axios = require('axios'); 24 | 25 | window.axios.defaults.headers.common['X-Requested-With'] = 'XMLHttpRequest'; 26 | 27 | /** 28 | * Next we will register the CSRF Token as a common header with Axios so that 29 | * all outgoing HTTP requests automatically have it attached. This is just 30 | * a simple convenience so we don't have to attach every token manually. 31 | */ 32 | 33 | let token = document.head.querySelector('meta[name="csrf-token"]'); 34 | 35 | if (token) { 36 | window.axios.defaults.headers.common['X-CSRF-TOKEN'] = token.content; 37 | } else { 38 | console.error('CSRF token not found: https://laravel.com/docs/csrf#csrf-x-csrf-token'); 39 | } 40 | 41 | /** 42 | * Echo exposes an expressive API for subscribing to channels and listening 43 | * for events that are broadcast by Laravel. Echo and event broadcasting 44 | * allows your team to easily build robust real-time web applications. 45 | */ 46 | 47 | // import Echo from 'laravel-echo' 48 | 49 | // window.Pusher = require('pusher-js'); 50 | 51 | // window.Echo = new Echo({ 52 | // broadcaster: 'pusher', 53 | // key: process.env.MIX_PUSHER_APP_KEY, 54 | // cluster: process.env.MIX_PUSHER_APP_CLUSTER, 55 | // encrypted: true 56 | // }); 57 | -------------------------------------------------------------------------------- /app/Libs/wordfiles/Plugins/WPvulnDB/woocommerce.conf: -------------------------------------------------------------------------------- 1 | Direct Download for WooCommerce <= 1.15 - Unauthenticated LFI 2 | WooCommerce <= 2.6.8 - Authenticated Tax-Rate CSV XSS 3 | WooCommerce Email Test 1.5 - Order Information Disclosure 4 | YITH WooCommerce Compare <= 2.0.9 - Unauthenticated PHP Object injection 5 | WooCommerce Product Addons <= 1.1 - Arbitrary File Upload 6 | Order Export Import for WooCommerce 1.0.8 - Order Information Disclosure 7 | WooCommerce <= 2.6.3 - Stored Cross Site Scripting (XSS) via REST API 8 | WooCommerce <= 2.6.2 - Authenticated Cross-Site Scripting (XSS) 9 | Persian Woocommerce SMS <= 3.3.3 - Reflected Cross-Site Scripting (XSS) 10 | Import Woocommerce <= 1.0.1 - Reflected Cross-Site Scripting (XSS) 11 | WooCommerce - Store Toolkit Plugin <= 1.5.6 - Privilege Escalation 12 | Woocommerce Ab&oned Cart Lite <= 1.8 - Authenticated Blind SQL Injection 13 | Smart Manager for WooCommerce & WPeC <= 3.9.6 - Unauthenticated SQL Inje... 14 | WooCommerce <= 2.4.8 - Authenticated Cross-Site Scripting (XSS) 15 | Paypal Currencucy Converter Basic For Woocommerce <= 1.3 - File Read 16 | WooCommerce 2.0.20-2.3.10 - Object Injection / XXE 17 | WooCommerce Amazon Affiliates - Arbitrary File Upload 18 | WooCommerce 2.3 - 2.3.5 - SQL Injection 19 | Quasar Theme Rock Form Builder plugin - Privilege Escalation 20 | WooCommerce <= 2.2.10 - Cross-Site Scripting (XSS) 21 | WooCommerce <= 2.2.2 - Reflected Cross-Site Scripting (XSS) 22 | WooCommerce Store Exporter 1.7.5 - Cross Site Scripting (XSS) 23 | WooCommerce <= 2.1.12 - Reflected Cross-Site Scripting (XSS) 24 | WooCommerce SagePay Direct Payment Gateway 0.1.6.6 - pages/3DRedirect.ph... 25 | WooCommerce SagePay Direct Payment Gateway 0.1.6.6 - pages/3DCallBack.ph... 26 | WooCommerce SagePay Direct Payment Gateway 0.1.6.6 - pages/3DComplete.ph... 27 | WooCommerce Predictive Search - index.php rs Parameter XSS 28 | WooCommerce 2.0.17 - hide-wc-extensions-message Parameter Reflected XSS 29 | WooCommerce 2.0.12 - index.php calc_shipping_state Parameter XSS 30 | -------------------------------------------------------------------------------- /app/Libs/wordfiles/Plugins/WPvulnDB/player.conf: -------------------------------------------------------------------------------- 1 | Wordpress CodeArt Google MP3 Player - File Disclosure 2 | WordPress Video Player <= 1.5.16 - Multiple Authenticated Blind SQL Inje... 3 | Post video players <= 1.136 - Authenticated Stored Cross-Site Scripting ... 4 | FV WordPress Flowplayer <= 6.0.3.3 - Authenticated Stored Cross-Site Scr... 5 | JW Player 6 Plugin for Wordpress <= 2.1.14 - Authenticated Cross-Site Sc... 6 | MP3-jPlayer <= 2.3.3 - Full Path Disclosure 7 | Flash Player Plugin <= 1.3 - Multiple Cross-Site Scripting (XSS) 8 | SE HTML5 Album Audio Player <= 1.1.0 - Local File Include 9 | MP3-jPlayer <= 2.3 - Local File Disclosure 10 | WonderPlugin Audio Player 2.0 Blind SQL Injection & XSS 11 | WordPress Video Player <= 1.5.4 - Reflected Cross-Site Scripting (XSS) 12 | HTML5 MP3 Player with Playlist 2.7.0 - Full Path Disclosure (FPD) 13 | WordPress Video Player < 1.5.2 - Multiple Cross-Site Scripting (XSS) 14 | HDW Player 2.4.2 - wp-admin/admin.php videos Page id Parameter SQL Inje... 15 | Blooog 1.1 - jplayer.swf Cross Site Scripting 16 | Imperial Fairytale - jPlayer Cross-Site Scripting 17 | dt-chocolate - jPlayer XSS 18 | WP Silverlight Media Player < 0.8 - Cross-Site Scripting (XSS) 19 | JW Player 2.1.2 - wp-admin/admin.php Player Deletion CSRF 20 | Cool Video Gallery 1.8 - admin/player-settings.php Player Settings Manip... 21 | HTML5 jQuery Audio Player 2.3 - playlist/add_playlist.php Multiple Param... 22 | HTML5 jQuery Audio Player 2.3 - playlist/add_playlist.php id Parameter S... 23 | MP3-jPlayer <= 1.8.7 - Cross-Site Scripting (XSS) 24 | MP3-jPlayer 1.8.3 - jPlayer.swf Cross-Site Scripting (XSS) 25 | Repagent - dewplayer-vinyl.swf xml Parameter XML File H&ling XSS 26 | Repagent - dewplayer-vinyl-en.swf xml Parameter XML File H&ling XSS 27 | Flash Player Widget - dewplayer.swf Content Spoofing 28 | GRAND FlAGallery Skins - compact_music_player/gallery.php playlist Param... 29 | Dewplayer - dewplayer-vinyl.swf xml Parameter XML File H&ling XSS 30 | Dewplayer - dewplayer-vinyl-en.swf xml Parameter XML File H&ling XSS 31 | -------------------------------------------------------------------------------- /public/index.php: -------------------------------------------------------------------------------- 1 | 8 | */ 9 | 10 | define('LARAVEL_START', microtime(true)); 11 | 12 | /* 13 | |-------------------------------------------------------------------------- 14 | | Register The Auto Loader 15 | |-------------------------------------------------------------------------- 16 | | 17 | | Composer provides a convenient, automatically generated class loader for 18 | | our application. We just need to utilize it! We'll simply require it 19 | | into the script here so that we don't have to worry about manual 20 | | loading any of our classes later on. It feels great to relax. 21 | | 22 | */ 23 | 24 | require __DIR__.'/../vendor/autoload.php'; 25 | 26 | /* 27 | |-------------------------------------------------------------------------- 28 | | Turn On The Lights 29 | |-------------------------------------------------------------------------- 30 | | 31 | | We need to illuminate PHP development, so let us turn on the lights. 32 | | This bootstraps the framework and gets it ready for use, then it 33 | | will load up this application so that we can run it and send 34 | | the responses back to the browser and delight our users. 35 | | 36 | */ 37 | 38 | $app = require_once __DIR__.'/../bootstrap/app.php'; 39 | 40 | /* 41 | |-------------------------------------------------------------------------- 42 | | Run The Application 43 | |-------------------------------------------------------------------------- 44 | | 45 | | Once we have the application, we can handle the incoming request 46 | | through the kernel, and send the associated response back to 47 | | the client's browser allowing them to enjoy the creative 48 | | and wonderful application we have prepared for them. 49 | | 50 | */ 51 | 52 | $kernel = $app->make(Illuminate\Contracts\Http\Kernel::class); 53 | 54 | $response = $kernel->handle( 55 | $request = Illuminate\Http\Request::capture() 56 | ); 57 | 58 | $response->send(); 59 | 60 | $kernel->terminate($request, $response); 61 | -------------------------------------------------------------------------------- /app/Http/Controllers/Auth/RegisterController.php: -------------------------------------------------------------------------------- 1 | middleware('guest'); 41 | } 42 | 43 | /** 44 | * Get a validator for an incoming registration request. 45 | * 46 | * @param array $data 47 | * @return \Illuminate\Contracts\Validation\Validator 48 | */ 49 | protected function validator(array $data) 50 | { 51 | return Validator::make($data, [ 52 | 'name' => ['required', 'string', 'max:255'], 53 | 'email' => ['required', 'string', 'email', 'max:255', 'unique:users'], 54 | 'password' => ['required', 'string', 'min:8', 'confirmed'], 55 | ]); 56 | } 57 | 58 | /** 59 | * Create a new user instance after a valid registration. 60 | * 61 | * @param array $data 62 | * @return \App\User 63 | */ 64 | protected function create(array $data) 65 | { 66 | return User::create([ 67 | 'name' => $data['name'], 68 | 'email' => $data['email'], 69 | 'password' => Hash::make($data['password']), 70 | ]); 71 | } 72 | } 73 | -------------------------------------------------------------------------------- /config/filesystems.php: -------------------------------------------------------------------------------- 1 | env('FILESYSTEM_DRIVER', 'local'), 17 | 18 | /* 19 | |-------------------------------------------------------------------------- 20 | | Default Cloud Filesystem Disk 21 | |-------------------------------------------------------------------------- 22 | | 23 | | Many applications store files both locally and in the cloud. For this 24 | | reason, you may specify a default "cloud" driver here. This driver 25 | | will be bound as the Cloud disk implementation in the container. 26 | | 27 | */ 28 | 29 | 'cloud' => env('FILESYSTEM_CLOUD', 's3'), 30 | 31 | /* 32 | |-------------------------------------------------------------------------- 33 | | Filesystem Disks 34 | |-------------------------------------------------------------------------- 35 | | 36 | | Here you may configure as many filesystem "disks" as you wish, and you 37 | | may even configure multiple disks of the same driver. Defaults have 38 | | been setup for each driver as an example of the required options. 39 | | 40 | | Supported Drivers: "local", "ftp", "sftp", "s3", "rackspace" 41 | | 42 | */ 43 | 44 | 'disks' => [ 45 | 46 | 'local' => [ 47 | 'driver' => 'local', 48 | 'root' => storage_path('app'), 49 | ], 50 | 51 | 'public' => [ 52 | 'driver' => 'local', 53 | 'root' => storage_path('app/public'), 54 | 'url' => env('APP_URL').'/storage', 55 | 'visibility' => 'public', 56 | ], 57 | 58 | 's3' => [ 59 | 'driver' => 's3', 60 | 'key' => env('AWS_ACCESS_KEY_ID'), 61 | 'secret' => env('AWS_SECRET_ACCESS_KEY'), 62 | 'region' => env('AWS_DEFAULT_REGION'), 63 | 'bucket' => env('AWS_BUCKET'), 64 | 'url' => env('AWS_URL'), 65 | ], 66 | 67 | ], 68 | 69 | ]; 70 | -------------------------------------------------------------------------------- /app/Jobs/LeakJob.php: -------------------------------------------------------------------------------- 1 | request = new ScanStartRequest($request); 31 | } 32 | 33 | /** 34 | * Execute the job. 35 | * 36 | * @return void 37 | */ 38 | public function handle() 39 | { 40 | Log::info('Starting Scan Job for ' . $this->request->get('url')); 41 | Log::info('Queue jobs remaining ' . Queue::size($this->queue)); 42 | 43 | $scan = new InfoLeakScan( 44 | $this->request->get('url'), 45 | 0, 46 | $this->request->get('callbackurls', []), 47 | $this->request->get('userAgent', config('scanner.user_agent')) 48 | ); 49 | 50 | $scan->scan(); 51 | } 52 | 53 | /** 54 | * The job failed to process. 55 | * This will never be called - for now 56 | * 57 | * @param \Exception $exception 58 | * @return void 59 | */ 60 | public function failed(\Exception $exception) 61 | { 62 | foreach ($this->request->get('callbackurls', []) as $url) { 63 | Log::info( 64 | 'Job failed: ' . $url . ', error code: ' . json_encode($exception->getMessage()) 65 | ); 66 | try { 67 | $client = new Client; 68 | $view = new View(file_get_contents(base_path('VERSION'))); 69 | $view = $view->printError($exception->getMessage(), get_class($exception)); 70 | $result = json_encode($view, 71 | JSON_PRETTY_PRINT | 72 | JSON_UNESCAPED_UNICODE | 73 | JSON_UNESCAPED_SLASHES); 74 | 75 | $client->post( 76 | $url, 77 | [ 78 | 'http_errors' => false, 79 | 'timeout' => 60, 80 | 'json' => $result, 81 | ] 82 | ); 83 | } catch (\Exception $e) { 84 | Log::warning('Could not send the failed report to the following callback url: ' . $url); 85 | } 86 | } 87 | } 88 | } 89 | -------------------------------------------------------------------------------- /config/queue.php: -------------------------------------------------------------------------------- 1 | env('QUEUE_CONNECTION', 'sync'), 17 | 18 | /* 19 | |-------------------------------------------------------------------------- 20 | | Queue Connections 21 | |-------------------------------------------------------------------------- 22 | | 23 | | Here you may configure the connection information for each server that 24 | | is used by your application. A default configuration has been added 25 | | for each back-end shipped with Laravel. You are free to add more. 26 | | 27 | | Drivers: "sync", "database", "beanstalkd", "sqs", "redis", "null" 28 | | 29 | */ 30 | 31 | 'connections' => [ 32 | 33 | 'sync' => [ 34 | 'driver' => 'sync', 35 | ], 36 | 37 | 'database' => [ 38 | 'driver' => 'database', 39 | 'table' => 'jobs', 40 | 'queue' => 'default', 41 | 'retry_after' => 90, 42 | ], 43 | 44 | 'beanstalkd' => [ 45 | 'driver' => 'beanstalkd', 46 | 'host' => 'localhost', 47 | 'queue' => 'default', 48 | 'retry_after' => 90, 49 | 'block_for' => 0, 50 | ], 51 | 52 | 'sqs' => [ 53 | 'driver' => 'sqs', 54 | 'key' => env('AWS_ACCESS_KEY_ID'), 55 | 'secret' => env('AWS_SECRET_ACCESS_KEY'), 56 | 'prefix' => env('SQS_PREFIX', 'https://sqs.us-east-1.amazonaws.com/your-account-id'), 57 | 'queue' => env('SQS_QUEUE', 'your-queue-name'), 58 | 'region' => env('AWS_DEFAULT_REGION', 'us-east-1'), 59 | ], 60 | 61 | 'redis' => [ 62 | 'driver' => 'redis', 63 | 'connection' => 'default', 64 | 'queue' => 'default', 65 | 'retry_after' => 120, 66 | 'block_for' => null, 67 | ], 68 | 69 | ], 70 | 71 | /* 72 | |-------------------------------------------------------------------------- 73 | | Failed Queue Jobs 74 | |-------------------------------------------------------------------------- 75 | | 76 | | These options configure the behavior of failed queue job logging so you 77 | | can control which database and table are used to store the jobs that 78 | | have failed. You may change them to any database / table you wish. 79 | | 80 | */ 81 | 82 | 'failed' => [ 83 | 'database' => env('DB_CONNECTION', 'mysql'), 84 | 'table' => 'failed_jobs', 85 | ], 86 | 87 | ]; 88 | -------------------------------------------------------------------------------- /app/Http/Kernel.php: -------------------------------------------------------------------------------- 1 | [ 31 | \App\Http\Middleware\EncryptCookies::class, 32 | \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class, 33 | \Illuminate\Session\Middleware\StartSession::class, 34 | // \Illuminate\Session\Middleware\AuthenticateSession::class, 35 | \Illuminate\View\Middleware\ShareErrorsFromSession::class, 36 | \App\Http\Middleware\VerifyCsrfToken::class, 37 | \Illuminate\Routing\Middleware\SubstituteBindings::class, 38 | ], 39 | 40 | 'api' => [ 41 | 'bindings', 42 | ], 43 | ]; 44 | 45 | /** 46 | * The application's route middleware. 47 | * 48 | * These middleware may be assigned to groups or used individually. 49 | * 50 | * @var array 51 | */ 52 | protected $routeMiddleware = [ 53 | 'auth' => \App\Http\Middleware\Authenticate::class, 54 | 'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class, 55 | 'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class, 56 | 'cache.headers' => \Illuminate\Http\Middleware\SetCacheHeaders::class, 57 | 'can' => \Illuminate\Auth\Middleware\Authorize::class, 58 | 'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class, 59 | 'signed' => \Illuminate\Routing\Middleware\ValidateSignature::class, 60 | 'verified' => \Illuminate\Auth\Middleware\EnsureEmailIsVerified::class, 61 | ]; 62 | 63 | /** 64 | * The priority-sorted list of middleware. 65 | * 66 | * This forces non-global middleware to always be in the given order. 67 | * 68 | * @var array 69 | */ 70 | protected $middlewarePriority = [ 71 | \Illuminate\Session\Middleware\StartSession::class, 72 | \Illuminate\View\Middleware\ShareErrorsFromSession::class, 73 | \App\Http\Middleware\Authenticate::class, 74 | \Illuminate\Session\Middleware\AuthenticateSession::class, 75 | \Illuminate\Routing\Middleware\SubstituteBindings::class, 76 | \Illuminate\Auth\Middleware\Authorize::class, 77 | ]; 78 | } 79 | -------------------------------------------------------------------------------- /config/logging.php: -------------------------------------------------------------------------------- 1 | env('LOG_CHANNEL', 'stack'), 20 | 21 | /* 22 | |-------------------------------------------------------------------------- 23 | | Log Channels 24 | |-------------------------------------------------------------------------- 25 | | 26 | | Here you may configure the log channels for your application. Out of 27 | | the box, Laravel uses the Monolog PHP logging library. This gives 28 | | you a variety of powerful log handlers / formatters to utilize. 29 | | 30 | | Available Drivers: "single", "daily", "slack", "syslog", 31 | | "errorlog", "monolog", 32 | | "custom", "stack" 33 | | 34 | */ 35 | 36 | 'channels' => [ 37 | 'stack' => [ 38 | 'driver' => 'stack', 39 | 'channels' => ['daily'], 40 | 'ignore_exceptions' => false, 41 | ], 42 | 43 | 'single' => [ 44 | 'driver' => 'single', 45 | 'path' => storage_path('logs/laravel.log'), 46 | 'level' => 'debug', 47 | ], 48 | 49 | 'daily' => [ 50 | 'driver' => 'daily', 51 | 'path' => storage_path('logs/laravel.log'), 52 | 'level' => 'debug', 53 | 'days' => 14, 54 | ], 55 | 56 | 'slack' => [ 57 | 'driver' => 'slack', 58 | 'url' => env('LOG_SLACK_WEBHOOK_URL'), 59 | 'username' => 'Laravel Log', 60 | 'emoji' => ':boom:', 61 | 'level' => 'critical', 62 | ], 63 | 64 | 'papertrail' => [ 65 | 'driver' => 'monolog', 66 | 'level' => 'debug', 67 | 'handler' => SyslogUdpHandler::class, 68 | 'handler_with' => [ 69 | 'host' => env('PAPERTRAIL_URL'), 70 | 'port' => env('PAPERTRAIL_PORT'), 71 | ], 72 | ], 73 | 74 | 'stderr' => [ 75 | 'driver' => 'monolog', 76 | 'handler' => StreamHandler::class, 77 | 'formatter' => env('LOG_STDERR_FORMATTER'), 78 | 'with' => [ 79 | 'stream' => 'php://stderr', 80 | ], 81 | ], 82 | 83 | 'syslog' => [ 84 | 'driver' => 'syslog', 85 | 'level' => 'debug', 86 | ], 87 | 88 | 'errorlog' => [ 89 | 'driver' => 'errorlog', 90 | 'level' => 'debug', 91 | ], 92 | ], 93 | 94 | ]; 95 | -------------------------------------------------------------------------------- /resources/views/welcome.blade.php: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Laravel 8 | 9 | 10 | 11 | 12 | 13 | 65 | 66 | 67 |
68 | @if (Route::has('login')) 69 | 80 | @endif 81 | 82 |
83 |
84 | Laravel 85 |
86 | 87 | 96 |
97 |
98 | 99 | 100 | -------------------------------------------------------------------------------- /config/cache.php: -------------------------------------------------------------------------------- 1 | env('CACHE_DRIVER', 'file'), 22 | 23 | /* 24 | |-------------------------------------------------------------------------- 25 | | Cache Stores 26 | |-------------------------------------------------------------------------- 27 | | 28 | | Here you may define all of the cache "stores" for your application as 29 | | well as their drivers. You may even define multiple stores for the 30 | | same cache driver to group types of items stored in your caches. 31 | | 32 | */ 33 | 34 | 'stores' => [ 35 | 36 | 'apc' => [ 37 | 'driver' => 'apc', 38 | ], 39 | 40 | 'array' => [ 41 | 'driver' => 'array', 42 | ], 43 | 44 | 'database' => [ 45 | 'driver' => 'database', 46 | 'table' => 'cache', 47 | 'connection' => null, 48 | ], 49 | 50 | 'file' => [ 51 | 'driver' => 'file', 52 | 'path' => storage_path('framework/cache/data'), 53 | ], 54 | 55 | 'memcached' => [ 56 | 'driver' => 'memcached', 57 | 'persistent_id' => env('MEMCACHED_PERSISTENT_ID'), 58 | 'sasl' => [ 59 | env('MEMCACHED_USERNAME'), 60 | env('MEMCACHED_PASSWORD'), 61 | ], 62 | 'options' => [ 63 | // Memcached::OPT_CONNECT_TIMEOUT => 2000, 64 | ], 65 | 'servers' => [ 66 | [ 67 | 'host' => env('MEMCACHED_HOST', '127.0.0.1'), 68 | 'port' => env('MEMCACHED_PORT', 11211), 69 | 'weight' => 100, 70 | ], 71 | ], 72 | ], 73 | 74 | 'redis' => [ 75 | 'driver' => 'redis', 76 | 'connection' => 'cache', 77 | ], 78 | 79 | 'dynamodb' => [ 80 | 'driver' => 'dynamodb', 81 | 'key' => env('AWS_ACCESS_KEY_ID'), 82 | 'secret' => env('AWS_SECRET_ACCESS_KEY'), 83 | 'region' => env('AWS_DEFAULT_REGION', 'us-east-1'), 84 | 'table' => env('DYNAMODB_CACHE_TABLE', 'cache'), 85 | ], 86 | 87 | ], 88 | 89 | /* 90 | |-------------------------------------------------------------------------- 91 | | Cache Key Prefix 92 | |-------------------------------------------------------------------------- 93 | | 94 | | When utilizing a RAM based store such as APC or Memcached, there might 95 | | be other applications utilizing the same cache. So, we'll specify a 96 | | value to get prefixed to all our keys so we can avoid collisions. 97 | | 98 | */ 99 | 100 | 'prefix' => env('CACHE_PREFIX', Str::slug(env('APP_NAME', 'laravel'), '_').'_cache'), 101 | 102 | ]; 103 | -------------------------------------------------------------------------------- /config/auth.php: -------------------------------------------------------------------------------- 1 | [ 17 | 'guard' => 'web', 18 | 'passwords' => 'users', 19 | ], 20 | 21 | /* 22 | |-------------------------------------------------------------------------- 23 | | Authentication Guards 24 | |-------------------------------------------------------------------------- 25 | | 26 | | Next, you may define every authentication guard for your application. 27 | | Of course, a great default configuration has been defined for you 28 | | here which uses session storage and the Eloquent user provider. 29 | | 30 | | All authentication drivers have a user provider. This defines how the 31 | | users are actually retrieved out of your database or other storage 32 | | mechanisms used by this application to persist your user's data. 33 | | 34 | | Supported: "session", "token" 35 | | 36 | */ 37 | 38 | 'guards' => [ 39 | 'web' => [ 40 | 'driver' => 'session', 41 | 'provider' => 'users', 42 | ], 43 | 44 | 'api' => [ 45 | 'driver' => 'token', 46 | 'provider' => 'users', 47 | 'hash' => false, 48 | ], 49 | ], 50 | 51 | /* 52 | |-------------------------------------------------------------------------- 53 | | User Providers 54 | |-------------------------------------------------------------------------- 55 | | 56 | | All authentication drivers have a user provider. This defines how the 57 | | users are actually retrieved out of your database or other storage 58 | | mechanisms used by this application to persist your user's data. 59 | | 60 | | If you have multiple user tables or models you may configure multiple 61 | | sources which represent each model / table. These sources may then 62 | | be assigned to any extra authentication guards you have defined. 63 | | 64 | | Supported: "database", "eloquent" 65 | | 66 | */ 67 | 68 | 'providers' => [ 69 | 'users' => [ 70 | 'driver' => 'eloquent', 71 | 'model' => App\User::class, 72 | ], 73 | 74 | // 'users' => [ 75 | // 'driver' => 'database', 76 | // 'table' => 'users', 77 | // ], 78 | ], 79 | 80 | /* 81 | |-------------------------------------------------------------------------- 82 | | Resetting Passwords 83 | |-------------------------------------------------------------------------- 84 | | 85 | | You may specify multiple password reset configurations if you have more 86 | | than one user table or model in the application and you want to have 87 | | separate password reset settings based on the specific user types. 88 | | 89 | | The expire time is the number of minutes that the reset token should be 90 | | considered valid. This security feature keeps tokens short-lived so 91 | | they have less time to be guessed. You may change this as needed. 92 | | 93 | */ 94 | 95 | 'passwords' => [ 96 | 'users' => [ 97 | 'provider' => 'users', 98 | 'table' => 'password_resets', 99 | 'expire' => 60, 100 | ], 101 | ], 102 | 103 | ]; 104 | -------------------------------------------------------------------------------- /tests/Unit/HTTPTest.php: -------------------------------------------------------------------------------- 1 | punycode_url, 0, [], "Testing_Punycode"); 31 | $encoded = $scanner->punycodeUrl($this->punycode_url); 32 | 33 | $this->assertEquals($encoded, "http://xn--4ca2c.de"); 34 | } 35 | 36 | /** 37 | * This tests whether the user agent gets set. 38 | * 39 | * @return void 40 | */ 41 | public function testUA() 42 | { 43 | // Testing User-Agent set by a GET request 44 | $ua = "TESTING_USER_AGENT"; 45 | $response = $this->get('/?url=http://not-existing-1337.com&userAgent=' . $ua); 46 | 47 | $this->assertEquals($response->headers->get('User-Agent'), $ua); 48 | } 49 | 50 | /** 51 | === POST Tests === 52 | **/ 53 | 54 | 55 | /** 56 | * This tests whether response is valid JSON. 57 | * 58 | * @return void 59 | */ 60 | public function testPOST() 61 | { 62 | $response = $this->withHeaders([ 63 | 'Content-Type' => 'application/json', 64 | ])->json('POST', '/start', [ 65 | "url" => 'eco.de', 66 | "dangerLevel" => 0, 67 | "callbackurls" => ["http://localhost:8000/testing?url=test"], 68 | "userAgent" => "TESTING_USER_AGENT" 69 | ]); 70 | 71 | $response->assertStatus(200); 72 | $this->assertEquals('OK', $response->getContent()); 73 | } 74 | 75 | /** 76 | * This tests whether the request is getting dispatched. 77 | * 78 | * @return void 79 | */ 80 | public function testDispatch_POST() 81 | { 82 | // LeakJob.php 83 | Queue::fake(); 84 | 85 | $response = $this->withHeaders([ 86 | 'Content-Type' => 'application/json', 87 | ])->json('POST', '/start', [ 88 | "url" => 'eco.de', 89 | "dangerLevel" => 0, 90 | "callbackurls" => ["http://localhost:8000/testing?url=test"], 91 | "userAgent" => "TESTING_USER_AGENT" 92 | ]); 93 | 94 | Queue::assertPushed(LeakJob::class, 1); 95 | } 96 | 97 | 98 | /** 99 | === GET Tests === 100 | **/ 101 | 102 | /** 103 | * This test should redirect, as the request is invalid (no URL). 104 | * 105 | * @return void 106 | */ 107 | public function testShouldRedirect_GET() 108 | { 109 | $response = $this->get('/'); 110 | 111 | $response->assertStatus(302); 112 | } 113 | 114 | /** 115 | * This test should analyze google (GET). 116 | * 117 | * @return void 118 | */ 119 | public function testConnecting_GET() 120 | { 121 | $response = $this->get('/?url=' . $this->test_url); 122 | 123 | $response->assertStatus(200); 124 | } 125 | 126 | /** 127 | * This tests whether response is valid JSON. 128 | * 129 | * @return void 130 | */ 131 | public function testJSON_GET() 132 | { 133 | $response = $this->get('/?url=' . $this->test_url)->getContent(); 134 | 135 | $data = json_decode($response, true); 136 | 137 | $this->assertInternalType('array', $data); 138 | } 139 | } 140 | -------------------------------------------------------------------------------- /app/Libs/Searcher.php: -------------------------------------------------------------------------------- 1 | loadHTML($source); 16 | } catch(\Exception $e) { 17 | if ($this->verbose) { 18 | \Log::info("Searcher was provided with a empty DOM"); 19 | \Log::warning("Exception: " . e); 20 | } 21 | 22 | $source = ""; 23 | 24 | $doc = new \DOMDocument(); 25 | $doc->loadHTML($source); 26 | } finally { 27 | /* SETUP XPath Object */ 28 | $this->xpath = new \DOMXPath($doc); 29 | } 30 | } 31 | 32 | 33 | /** 34 | * @short Search $word attribute containing $content in the given DOM (case sensitive). 35 | * @return node 36 | */ 37 | public function in_attr_contains($word, $content){ 38 | $nodes = $this->xpath_search("//*[@" . $word . "[contains(.," . $content . ")]]"); 39 | 40 | return $nodes; 41 | } 42 | 43 | /** 44 | * @short Search $word attribute in the given DOM (case sensitive). 45 | * @return node 46 | */ 47 | public function in_attr($word){ 48 | $nodes = $this->xpath_search("//*[@" . $word . "]"); 49 | 50 | return $nodes; 51 | } 52 | 53 | public function in_node_with_attr($node, $attr){ 54 | $nodes = $this->xpath_search("//" . $node . "[@" . $attr . "]"); 55 | 56 | return $nodes; 57 | } 58 | 59 | /** 60 | * @short Search $word in all attributes of the given DOM (case insensitive). 61 | * @return node 62 | */ 63 | public function in_all_caseInsensitive($word){ 64 | $nodes = $this->xpath_search("//*[@*[contains(., '" . $word . "')]]"); 65 | 66 | return $nodes; 67 | } 68 | 69 | /** 70 | * @return node 71 | */ 72 | public function in_all($word){ 73 | //$nodes = $this->xpath_search("//*[@*[contains(., '" . $word . "')]]"); 74 | $nodes = $this->xpath_search("//*[@*[contains(translate(., 'ABCDEFGHJIKLMNOPQRSTUVWXYZ', 'abcdefghjiklmnopqrstuvwxyz'), '" . $word . "')]]"); 75 | 76 | return $nodes; 77 | } 78 | 79 | /** 80 | * @return node 81 | */ 82 | public function in_script($word){ 83 | $nodes = $this->xpath_search("//script[@*[contains(., '" . $word . "')]]"); 84 | 85 | return $nodes; 86 | } 87 | 88 | /** 89 | * @return node 90 | */ 91 | public function in_input($word){ 92 | $nodes = $this->xpath_search("//input[@*[contains(., '" . $word . "')]]"); 93 | 94 | return $nodes; 95 | } 96 | 97 | /** 98 | * @short Search $word in all meta tags of the given DOM 99 | * @return node 100 | */ 101 | public function in_meta($word){ 102 | $nodes = $this->xpath_search("//meta[@*[contains(., '" . $word . "')]]"); 103 | 104 | return $nodes; 105 | } 106 | 107 | /** 108 | * @short Search $word in all meta tags of the given DOM 109 | * @return node 110 | */ 111 | public function in_meta_with_name($name){ 112 | $nodes = $this->xpath_search("//meta[@name='" . $name . "']"); 113 | 114 | return $nodes; 115 | } 116 | 117 | /** 118 | * @short Search $word in all a-tags of the given DOM 119 | * @return node 120 | */ 121 | public function in_a($word){ 122 | $nodes = $this->xpath_search("//a[@*[contains(., '" . $word . "')]]"); 123 | 124 | return $nodes; 125 | } 126 | 127 | /** 128 | * @short Search $word in all comments 129 | * @return node 130 | */ 131 | public function in_comment($word){ 132 | $nodes = $this->xpath_search("//comment()[contains(., '" . $word . "')]"); 133 | 134 | return $nodes; 135 | } 136 | 137 | /** 138 | * @short Search via XPath through the DOM with the given $query 139 | * @var xpath DOMXPath Object 140 | * @var query XPath query, which will be used for the DOMXPath Object 141 | * @return node 142 | */ 143 | public function xpath_search($query){ 144 | $xpath = $this->xpath; 145 | $nodes = $xpath->query($query); 146 | 147 | if($nodes->length) 148 | return $nodes; 149 | else 150 | return NULL; /* Query result is empty */ 151 | } 152 | } 153 | 154 | ?> 155 | -------------------------------------------------------------------------------- /app/Libs/Remover.php: -------------------------------------------------------------------------------- 1 | source = $source; 15 | $this->resetXPath(); 16 | } 17 | 18 | 19 | /** 20 | * Create new DOMXPath with $this->source 21 | */ 22 | public function resetXPath() { 23 | 24 | try { 25 | /* SETUP DOM */ 26 | $doc = new \DOMDocument(); 27 | $doc->loadHTML($this->source); 28 | 29 | $this->DOM = $doc; 30 | } catch(\Exception $e) { 31 | if ($this->verbose) { 32 | \Log::info("Remove was provided with a empty DOM"); 33 | \Log::warning("Exception: " . e); 34 | } 35 | 36 | $this->source = ""; 37 | 38 | $doc = new \DOMDocument(); 39 | $doc->loadHTML($this->source); 40 | 41 | $this->DOM = $doc; 42 | } finally { 43 | /* SETUP XPath Object */ 44 | $this->xpath = new \DOMXPath($doc); 45 | } 46 | } 47 | 48 | 49 | /** 50 | * Remove all occurences of a node in the given DOM ($source) 51 | */ 52 | public function removeNode($source, $nodeName) { 53 | $query = $this->xpath->query('//' . $nodeName); 54 | 55 | foreach ($query as $node) { 56 | $node->parentNode->removeChild($node); 57 | } 58 | 59 | $this->source = $this->DOM->saveHTML(); 60 | //$this->resetXPath(); 61 | return $this->source; 62 | } 63 | 64 | /** 65 | * Remove global data attribute (data-*) 66 | */ 67 | public function removeData($source) { 68 | $query = $this->xpath->query("//*[@*[starts-with(name(), 'data-')]]"); 69 | 70 | foreach ($query as $node) { 71 | $node->parentNode->removeChild($node); 72 | } 73 | 74 | $this->source = $this->DOM->saveHTML(); 75 | 76 | return $this->source; 77 | } 78 | 79 | /** 80 | * TODO: Not working correctly yet 81 | */ 82 | public function removeKISSY($source) { 83 | $query = $this->xpath->query("//div/@id[starts-with(name(), 'J_')]"); 84 | 85 | foreach ($query as $node) { 86 | $node->parentNode->removeChild($node); 87 | } 88 | 89 | $this->source = $this->DOM->saveHTML(); 90 | 91 | return $this->source; 92 | } 93 | 94 | /** 95 | * Remove all events in the given DOM ($source) 96 | */ 97 | public function removeEvents($source) { 98 | $query = $this->xpath->query("//*/@*[starts-with(name(), 'on')]"); 99 | 100 | foreach ($query as $node) { 101 | $node->ownerElement->removeAttributeNode($node); 102 | } 103 | 104 | $this->source = $this->DOM->saveHTML(); 105 | //$this->resetXPath(); 106 | return $this->source; 107 | } 108 | 109 | 110 | /** 111 | * Remove all occurences of an attribute in the given DOM ($source) 112 | */ 113 | public function removeAttribute($source, $attributeName) { 114 | $query = $this->xpath->query('//*[@' . $attributeName . ']'); 115 | 116 | foreach ($query as $node) { 117 | $node->removeAttribute($attributeName); 118 | } 119 | 120 | $this->source = $this->DOM->saveHTML(); 121 | //$this->resetXPath(); 122 | return $this->source; 123 | } 124 | 125 | /** 126 | * Remove all attributes in the given DOM ($source) 127 | */ 128 | public function removeAllAttribute($source, $nodeName) { 129 | $query = $this->xpath->query('//' . $nodeName); 130 | 131 | foreach ($query as $node) { 132 | foreach ($node->attributes as $a) { 133 | //$node->removeAttribute($a->name); 134 | } 135 | } 136 | 137 | $this->source = $this->DOM->saveHTML(); 138 | 139 | return $this->source; 140 | } 141 | 142 | 143 | /** 144 | * Remove all comments in the given DOM ($source) 145 | */ 146 | public function removeComments($source) { 147 | $query = $this->xpath->query('//comment()'); 148 | 149 | foreach ($query as $node) { 150 | $node->parentNode->removeChild($node); 151 | } 152 | 153 | $this->source = $this->DOM->saveHTML(); 154 | //$this->resetXPath(); 155 | return $this->source; 156 | } 157 | } 158 | 159 | ?> 160 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | *~ 2 | 3 | # Created by https://www.gitignore.io/api/code,macos,linux,windows,phpstorm,composer,sublimetext,visualstudiocode 4 | 5 | ### Code ### 6 | # Visual Studio Code - https://code.visualstudio.com/ 7 | .settings/ 8 | .vscode/ 9 | tsconfig.json 10 | jsconfig.json 11 | 12 | ### Composer ### 13 | composer.phar 14 | /vendor/ 15 | 16 | # Commit your application's lock file http://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file 17 | # You may choose to ignore a library lock file http://getcomposer.org/doc/02-libraries.md#lock-file 18 | # composer.lock 19 | 20 | ### Linux ### 21 | *~ 22 | 23 | # temporary files which can be created if a process still has a handle open of a deleted file 24 | .fuse_hidden* 25 | 26 | # KDE directory preferences 27 | .directory 28 | 29 | # Linux trash folder which might appear on any partition or disk 30 | .Trash-* 31 | 32 | # .nfs files are created when an open file is removed but is still being accessed 33 | .nfs* 34 | 35 | ### macOS ### 36 | *.DS_Store 37 | .AppleDouble 38 | .LSOverride 39 | 40 | # Icon must end with two \r 41 | Icon 42 | 43 | # Thumbnails 44 | ._* 45 | 46 | # Files that might appear in the root of a volume 47 | .DocumentRevisions-V100 48 | .fseventsd 49 | .Spotlight-V100 50 | .TemporaryItems 51 | .Trashes 52 | .VolumeIcon.icns 53 | .com.apple.timemachine.donotpresent 54 | 55 | # Directories potentially created on remote AFP share 56 | .AppleDB 57 | .AppleDesktop 58 | Network Trash Folder 59 | Temporary Items 60 | .apdisk 61 | 62 | ### PhpStorm ### 63 | # Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio and Webstorm 64 | # Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839 65 | 66 | .idea/ 67 | 68 | # User-specific stuff: 69 | .idea/**/workspace.xml 70 | .idea/**/tasks.xml 71 | .idea/dictionaries 72 | 73 | # Sensitive or high-churn files: 74 | .idea/**/dataSources/ 75 | .idea/**/dataSources.ids 76 | .idea/**/dataSources.xml 77 | .idea/**/dataSources.local.xml 78 | .idea/**/sqlDataSources.xml 79 | .idea/**/dynamic.xml 80 | .idea/**/uiDesigner.xml 81 | 82 | # Gradle: 83 | .idea/**/gradle.xml 84 | .idea/**/libraries 85 | 86 | # CMake 87 | cmake-build-debug/ 88 | 89 | # Mongo Explorer plugin: 90 | .idea/**/mongoSettings.xml 91 | 92 | ## File-based project format: 93 | *.iws 94 | 95 | ## Plugin-specific files: 96 | 97 | # IntelliJ 98 | /out/ 99 | 100 | # mpeltonen/sbt-idea plugin 101 | .idea_modules/ 102 | 103 | # JIRA plugin 104 | atlassian-ide-plugin.xml 105 | 106 | # Cursive Clojure plugin 107 | .idea/replstate.xml 108 | 109 | # Ruby plugin and RubyMine 110 | /.rakeTasks 111 | 112 | # Crashlytics plugin (for Android Studio and IntelliJ) 113 | com_crashlytics_export_strings.xml 114 | crashlytics.properties 115 | crashlytics-build.properties 116 | fabric.properties 117 | 118 | ### PhpStorm Patch ### 119 | # Comment Reason: https://github.com/joeblau/gitignore.io/issues/186#issuecomment-215987721 120 | 121 | # *.iml 122 | # modules.xml 123 | # .idea/misc.xml 124 | # *.ipr 125 | 126 | # Sonarlint plugin 127 | .idea/sonarlint 128 | 129 | ### SublimeText ### 130 | # cache files for sublime text 131 | *.tmlanguage.cache 132 | *.tmPreferences.cache 133 | *.stTheme.cache 134 | 135 | # workspace files are user-specific 136 | *.sublime-workspace 137 | 138 | # project files should be checked into the repository, unless a significant 139 | # proportion of contributors will probably not be using SublimeText 140 | # *.sublime-project 141 | 142 | # sftp configuration file 143 | sftp-config.json 144 | 145 | # Package control specific files 146 | Package Control.last-run 147 | Package Control.ca-list 148 | Package Control.ca-bundle 149 | Package Control.system-ca-bundle 150 | Package Control.cache/ 151 | Package Control.ca-certs/ 152 | Package Control.merged-ca-bundle 153 | Package Control.user-ca-bundle 154 | oscrypto-ca-bundle.crt 155 | bh_unicode_properties.cache 156 | 157 | # Sublime-github package stores a github token in this file 158 | # https://packagecontrol.io/packages/sublime-github 159 | GitHub.sublime-settings 160 | 161 | ### VisualStudioCode ### 162 | .vscode/* 163 | !.vscode/settings.json 164 | !.vscode/tasks.json 165 | !.vscode/launch.json 166 | !.vscode/extensions.json 167 | .history 168 | 169 | ### Windows ### 170 | # Windows thumbnail cache files 171 | Thumbs.db 172 | ehthumbs.db 173 | ehthumbs_vista.db 174 | 175 | # Folder config file 176 | Desktop.ini 177 | 178 | # Recycle Bin used on file shares 179 | $RECYCLE.BIN/ 180 | 181 | # Windows Installer files 182 | *.cab 183 | *.msi 184 | *.msm 185 | *.msp 186 | 187 | # Windows shortcuts 188 | *.lnk 189 | 190 | # End of https://www.gitignore.io/api/code,macos,linux,windows,phpstorm,composer,sublimetext,visualstudiocode 191 | -------------------------------------------------------------------------------- /config/database.php: -------------------------------------------------------------------------------- 1 | env('DB_CONNECTION', 'mysql'), 17 | 18 | /* 19 | |-------------------------------------------------------------------------- 20 | | Database Connections 21 | |-------------------------------------------------------------------------- 22 | | 23 | | Here are each of the database connections setup for your application. 24 | | Of course, examples of configuring each database platform that is 25 | | supported by Laravel is shown below to make development simple. 26 | | 27 | | 28 | | All database work in Laravel is done through the PHP PDO facilities 29 | | so make sure you have the driver for your particular database of 30 | | choice installed on your machine before you begin development. 31 | | 32 | */ 33 | 34 | 'connections' => [ 35 | 36 | 'sqlite' => [ 37 | 'driver' => 'sqlite', 38 | 'database' => env('DB_DATABASE', database_path('database.sqlite')), 39 | 'prefix' => '', 40 | 'foreign_key_constraints' => env('DB_FOREIGN_KEYS', true), 41 | ], 42 | 43 | 'mysql' => [ 44 | 'driver' => 'mysql', 45 | 'host' => env('DB_HOST', '127.0.0.1'), 46 | 'port' => env('DB_PORT', '3306'), 47 | 'database' => env('DB_DATABASE', 'forge'), 48 | 'username' => env('DB_USERNAME', 'forge'), 49 | 'password' => env('DB_PASSWORD', ''), 50 | 'unix_socket' => env('DB_SOCKET', ''), 51 | 'charset' => 'utf8mb4', 52 | 'collation' => 'utf8mb4_unicode_ci', 53 | 'prefix' => '', 54 | 'prefix_indexes' => true, 55 | 'strict' => true, 56 | 'engine' => null, 57 | 'options' => extension_loaded('pdo_mysql') ? array_filter([ 58 | PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'), 59 | ]) : [], 60 | ], 61 | 62 | 'pgsql' => [ 63 | 'driver' => 'pgsql', 64 | 'host' => env('DB_HOST', '127.0.0.1'), 65 | 'port' => env('DB_PORT', '5432'), 66 | 'database' => env('DB_DATABASE', 'forge'), 67 | 'username' => env('DB_USERNAME', 'forge'), 68 | 'password' => env('DB_PASSWORD', ''), 69 | 'charset' => 'utf8', 70 | 'prefix' => '', 71 | 'prefix_indexes' => true, 72 | 'schema' => 'public', 73 | 'sslmode' => 'prefer', 74 | ], 75 | 76 | 'sqlsrv' => [ 77 | 'driver' => 'sqlsrv', 78 | 'host' => env('DB_HOST', 'localhost'), 79 | 'port' => env('DB_PORT', '1433'), 80 | 'database' => env('DB_DATABASE', 'forge'), 81 | 'username' => env('DB_USERNAME', 'forge'), 82 | 'password' => env('DB_PASSWORD', ''), 83 | 'charset' => 'utf8', 84 | 'prefix' => '', 85 | 'prefix_indexes' => true, 86 | ], 87 | 88 | ], 89 | 90 | /* 91 | |-------------------------------------------------------------------------- 92 | | Migration Repository Table 93 | |-------------------------------------------------------------------------- 94 | | 95 | | This table keeps track of all the migrations that have already run for 96 | | your application. Using this information, we can determine which of 97 | | the migrations on disk haven't actually been run in the database. 98 | | 99 | */ 100 | 101 | 'migrations' => 'migrations', 102 | 103 | /* 104 | |-------------------------------------------------------------------------- 105 | | Redis Databases 106 | |-------------------------------------------------------------------------- 107 | | 108 | | Redis is an open source, fast, and advanced key-value store that also 109 | | provides a richer body of commands than a typical key-value system 110 | | such as APC or Memcached. Laravel makes it easy to dig right in. 111 | | 112 | */ 113 | 114 | 'redis' => [ 115 | 116 | 'client' => env('REDIS_CLIENT', 'predis'), 117 | 118 | 'options' => [ 119 | 'cluster' => env('REDIS_CLUSTER', 'predis'), 120 | ], 121 | 122 | 'default' => [ 123 | 'host' => env('REDIS_HOST', '127.0.0.1'), 124 | 'password' => env('REDIS_PASSWORD', null), 125 | 'port' => env('REDIS_PORT', 6379), 126 | 'database' => env('REDIS_DB', 0), 127 | ], 128 | 129 | 'cache' => [ 130 | 'host' => env('REDIS_HOST', '127.0.0.1'), 131 | 'password' => env('REDIS_PASSWORD', null), 132 | 'port' => env('REDIS_PORT', 6379), 133 | 'database' => env('REDIS_CACHE_DB', 1), 134 | ], 135 | 136 | ], 137 | 138 | ]; 139 | -------------------------------------------------------------------------------- /config/mail.php: -------------------------------------------------------------------------------- 1 | env('MAIL_DRIVER', 'smtp'), 20 | 21 | /* 22 | |-------------------------------------------------------------------------- 23 | | SMTP Host Address 24 | |-------------------------------------------------------------------------- 25 | | 26 | | Here you may provide the host address of the SMTP server used by your 27 | | applications. A default option is provided that is compatible with 28 | | the Mailgun mail service which will provide reliable deliveries. 29 | | 30 | */ 31 | 32 | 'host' => env('MAIL_HOST', 'smtp.mailgun.org'), 33 | 34 | /* 35 | |-------------------------------------------------------------------------- 36 | | SMTP Host Port 37 | |-------------------------------------------------------------------------- 38 | | 39 | | This is the SMTP port used by your application to deliver e-mails to 40 | | users of the application. Like the host we have set this value to 41 | | stay compatible with the Mailgun e-mail application by default. 42 | | 43 | */ 44 | 45 | 'port' => env('MAIL_PORT', 587), 46 | 47 | /* 48 | |-------------------------------------------------------------------------- 49 | | Global "From" Address 50 | |-------------------------------------------------------------------------- 51 | | 52 | | You may wish for all e-mails sent by your application to be sent from 53 | | the same address. Here, you may specify a name and address that is 54 | | used globally for all e-mails that are sent by your application. 55 | | 56 | */ 57 | 58 | 'from' => [ 59 | 'address' => env('MAIL_FROM_ADDRESS', 'hello@example.com'), 60 | 'name' => env('MAIL_FROM_NAME', 'Example'), 61 | ], 62 | 63 | /* 64 | |-------------------------------------------------------------------------- 65 | | E-Mail Encryption Protocol 66 | |-------------------------------------------------------------------------- 67 | | 68 | | Here you may specify the encryption protocol that should be used when 69 | | the application send e-mail messages. A sensible default using the 70 | | transport layer security protocol should provide great security. 71 | | 72 | */ 73 | 74 | 'encryption' => env('MAIL_ENCRYPTION', 'tls'), 75 | 76 | /* 77 | |-------------------------------------------------------------------------- 78 | | SMTP Server Username 79 | |-------------------------------------------------------------------------- 80 | | 81 | | If your SMTP server requires a username for authentication, you should 82 | | set it here. This will get used to authenticate with your server on 83 | | connection. You may also set the "password" value below this one. 84 | | 85 | */ 86 | 87 | 'username' => env('MAIL_USERNAME'), 88 | 89 | 'password' => env('MAIL_PASSWORD'), 90 | 91 | /* 92 | |-------------------------------------------------------------------------- 93 | | Sendmail System Path 94 | |-------------------------------------------------------------------------- 95 | | 96 | | When using the "sendmail" driver to send e-mails, we will need to know 97 | | the path to where Sendmail lives on this server. A default path has 98 | | been provided here, which will work well on most of your systems. 99 | | 100 | */ 101 | 102 | 'sendmail' => '/usr/sbin/sendmail -bs', 103 | 104 | /* 105 | |-------------------------------------------------------------------------- 106 | | Markdown Mail Settings 107 | |-------------------------------------------------------------------------- 108 | | 109 | | If you are using Markdown based email rendering, you may configure your 110 | | theme and component paths here, allowing you to customize the design 111 | | of the emails. Or, you may simply stick with the Laravel defaults! 112 | | 113 | */ 114 | 115 | 'markdown' => [ 116 | 'theme' => 'default', 117 | 118 | 'paths' => [ 119 | resource_path('views/vendor/mail'), 120 | ], 121 | ], 122 | 123 | /* 124 | |-------------------------------------------------------------------------- 125 | | Log Channel 126 | |-------------------------------------------------------------------------- 127 | | 128 | | If you are using the "log" driver, you may specify the logging channel 129 | | if you prefer to keep mail messages separate from other log entries 130 | | for simpler reading. Otherwise, the default channel will be used. 131 | | 132 | */ 133 | 134 | 'log_channel' => env('MAIL_LOG_CHANNEL'), 135 | 136 | ]; 137 | -------------------------------------------------------------------------------- /app/InfoLeakScan.php: -------------------------------------------------------------------------------- 1 | version = file_get_contents(base_path('VERSION')); 28 | 29 | $this->url = $url; 30 | $this->dangerlevel = $dangerlevel; 31 | $this->callbackurls = $callbackurls; 32 | $this->useragent = $useragent; 33 | 34 | $this->client = new Client([ 35 | ['defaults' => [ 'exceptions' => false ]], 36 | ['http_errors' => true], 37 | 'timeout' => 50, // Response timeout 38 | 'connect_timeout' => 50, // Connection timeout 39 | 'headers' => [ 40 | 'User-Agent' => $useragent, 41 | ] 42 | ]); 43 | } 44 | 45 | public function scan() { 46 | $view = new View(file_get_contents(base_path('VERSION'))); 47 | 48 | try { 49 | $this->url = $this->punycodeUrl($this->addHTTP($this->url)); 50 | 51 | $this->body = $this->client->get($this->url)->getBody(); 52 | } catch (\Exception $e) { 53 | \Log::warning('Could not connect to: ' . $this->url); 54 | 55 | if ($this->verbose) 56 | \Log::warning('Guzzle error: ' . $e); 57 | 58 | $view = $view->printError($e->getMessage(), get_class($e)); 59 | 60 | $this->result = json_encode($view, 61 | JSON_PRETTY_PRINT | 62 | JSON_UNESCAPED_UNICODE | 63 | JSON_UNESCAPED_SLASHES); 64 | 65 | if (count($this->callbackurls)) { 66 | $this->notifyCallbacks(); 67 | } 68 | 69 | \Log::warning('Error reporting done: ' . $this->url); 70 | 71 | return $this->result; 72 | } 73 | 74 | $analyser = new Analyser($this->url, $this->body); 75 | 76 | $email = $analyser->find_email($this->body); 77 | $cms = $analyser->analyse_cms(); 78 | $plugins = null; 79 | if (!empty($cms['cms'])) { 80 | $plugins = $analyser->analyse_plugins($cms['cms']); 81 | } 82 | $jslib = $analyser->analyse_JSLib(); 83 | $phone_number = $analyser->find_phoneNumber($this->body); 84 | 85 | 86 | $view = $view->printJSON($cms, $email,$plugins, 87 | $jslib, $phone_number); 88 | 89 | $this->result = json_encode($view, 90 | JSON_PRETTY_PRINT | 91 | JSON_UNESCAPED_UNICODE | 92 | JSON_UNESCAPED_SLASHES); 93 | 94 | 95 | if (count($this->callbackurls)) { 96 | $this->notifyCallbacks(); 97 | } 98 | 99 | \Log::info('JOB DONE: ' . $this->url); 100 | 101 | return $this->result; 102 | } 103 | 104 | 105 | /** 106 | * @short: Add HTTP scheme to the URL. 107 | * @var url: The URL which will get the scheme added 108 | * @algorithm: Is the scheme specified? If not add it, else leave it as it 109 | * * is. 110 | * @return string 111 | */ 112 | private function addHTTP($url, $scheme = 'http://') { 113 | return parse_url($url, PHP_URL_SCHEME) === null ? $scheme . $url : $url; 114 | } 115 | 116 | /** 117 | * Returns the Punycode encoded URL for a given URL. 118 | * 119 | * @param string $url URL to encode 120 | * 121 | * @return string Punycode-Encoded URL. 122 | * @author https://github.com/Lednerb 123 | */ 124 | public function punycodeUrl($url) { 125 | $parsed_url = parse_url($url); 126 | $scheme = isset($parsed_url['scheme']) ? $parsed_url['scheme'].'://' : ''; 127 | $host = isset($parsed_url['host']) ? idn_to_ascii($parsed_url['host'], 128 | IDNA_NONTRANSITIONAL_TO_ASCII, 129 | INTL_IDNA_VARIANT_UTS46) : ''; 130 | $port = isset($parsed_url['port']) ? ':'.$parsed_url['port'] : ''; 131 | $user = isset($parsed_url['user']) ? $parsed_url['user'] : ''; 132 | $pass = isset($parsed_url['pass']) ? ':'.$parsed_url['pass'] : ''; 133 | $pass = ($user || $pass) ? "$pass@" : ''; 134 | $path = isset($parsed_url['path']) ? $parsed_url['path'] : ''; 135 | $query = isset($parsed_url['query']) ? '?'.$parsed_url['query'] : ''; 136 | 137 | return "$scheme$user$pass$host$port$path$query"; 138 | } 139 | 140 | protected function notifyCallbacks(): void 141 | { 142 | foreach ($this->callbackurls as $url) { 143 | Log::info('Callback to: ' . $url); 144 | 145 | try { 146 | $this->client->post($url, [ 147 | 'headers' => ['Content-type' => 'application/json'], 148 | 'http_errors' => false, 149 | 'timeout' => 60, 150 | 'json' => json_decode($this->result) 151 | ]); 152 | } catch (\Exception $e) { 153 | Log::warning('Callback error (url): ' . $url); 154 | } 155 | 156 | Log::info('Finished callback for ' . $url); 157 | } 158 | } 159 | } 160 | ?> 161 | -------------------------------------------------------------------------------- /app/Libs/js_analysis_config.json: -------------------------------------------------------------------------------- 1 | { 2 | "jquery": { 3 | "name": "jquery", 4 | "tag": "script", 5 | "default_version": null, 6 | "vuln_if_smaller": null, 7 | "vuln_array": { 8 | "0": "2.0.3", 9 | "1": "2.0.2", 10 | "2": "2.0.1", 11 | "3": "2.0.0", 12 | "4": "1.10.2", 13 | "5": "1.10.1", 14 | "6": "1.10.0", 15 | "7": "1.9.1", 16 | "8": "1.8.3", 17 | "10": "1.8.2", 18 | "11": "1.8.1", 19 | "12": "1.8.0", 20 | "13": "1.7.2", 21 | "14": "1.7.1", 22 | "15": "1.7.0", 23 | "16": "1.6.4", 24 | "17": "1.6.3", 25 | "18": "1.6.2", 26 | "19": "1.6.1", 27 | "20": "1.6.0", 28 | "21": "1.5.2", 29 | "22": "1.5.1", 30 | "23": "1.5.0", 31 | "24": "1.4.4", 32 | "25": "1.4.3", 33 | "26": "1.4.2", 34 | "27": "1.4.1", 35 | "28": "1.4.0", 36 | "29": "1.3.2", 37 | "30": "1.3.1", 38 | "31": "1.3.0", 39 | "32": "1.2.6", 40 | "33": "1.2.3", 41 | "34": "1.12.0", 42 | "35": "3.0.0", 43 | "36": "1.12.4", 44 | "37": "2.1.4" 45 | }, 46 | "vuln_references": { 47 | "0": "http://domstorm.skepticfx.com/modules?id=529bbe6e125fac0000000003", 48 | "1": "https://www.cvedetails.com/vulnerability-list/vendor_id-6538/Jquery.html", 49 | "2": "https://snyk.io/test/npm/jquery/1.12.4?severity=high&severity=medium&severity=low" 50 | }, 51 | "version_regex": "/(?:(\\d+)\\.)(?:(\\d+)\\.)(\\*|\\d+)*/" 52 | }, 53 | "netease": { 54 | "name": "netease", 55 | "tag": "script", 56 | "default_version": null, 57 | "vuln_if_smaller": null, 58 | "vuln_array": { 59 | "0": "1.1.2", 60 | "1": "1.2.0" 61 | }, 62 | "vuln_references": { 63 | "0": "https://www.cvedetails.com/vulnerability-list/vendor_id-11858/Netease.html" 64 | }, 65 | "version_regex": "/(?:(\\d+)\\.)(?:(\\d+)\\.)(\\*|\\d+)*/" 66 | }, 67 | "expressionengine": { 68 | "name": "expressionengine", 69 | "tag": "script", 70 | "default_version": null, 71 | "vuln_if_smaller": null, 72 | "vuln_array": { 73 | "0": "1.6.6", 74 | "1": "1.6.4", 75 | "2": "1.2.1" 76 | }, 77 | "vuln_references": { 78 | "0": "https://www.cvedetails.com/vulnerability-list/vendor_id-7662/" 79 | }, 80 | "version_regex": "/(?:(\\d+)\\.)(?:(\\d+)\\.)(\\*|\\d+)*/" 81 | }, 82 | "analytics": { 83 | "name": "analytics.js", 84 | "tag": "script", 85 | "default_version": null, 86 | "vuln_if_smaller": null, 87 | "vuln_array": null, 88 | "vuln_references": null, 89 | "version_regex": "/(?:(\\d+)\\.)(?:(\\d+)\\.)(\\*|\\d+)*/" 90 | }, 91 | "comscore": { 92 | "name": "comscore", 93 | "tag": "script", 94 | "default_version": null, 95 | "vuln_if_smaller": null, 96 | "vuln_array": null, 97 | "vuln_references": null, 98 | "version_regex": "/(?:(\\d+)\\.)(?:(\\d+)\\.)(\\*|\\d+)*/" 99 | }, 100 | "disqus": { 101 | "name": "disqus", 102 | "tag": "script", 103 | "default_version": null, 104 | "vuln_if_smaller": null, 105 | "vuln_array": null, 106 | "vuln_references": null, 107 | "version_regex": "/(?:(\\d+)\\.)(?:(\\d+)\\.)(\\*|\\d+)*/" 108 | }, 109 | "dotnetnuke": { 110 | "name": "dotnetnuke", 111 | "tag": "script", 112 | "default_version": null, 113 | "vuln_if_smaller": null, 114 | "vuln_array": null, 115 | "vuln_references": null, 116 | "version_regex": "/(?:(\\d+)\\.)(?:(\\d+)\\.)(\\*|\\d+)*/" 117 | }, 118 | "ektron": { 119 | "name": "ektron", 120 | "tag": "script", 121 | "default_version": null, 122 | "vuln_if_smaller": null, 123 | "vuln_array": null, 124 | "vuln_references": null, 125 | "version_regex": "/(?:(\\d+)\\.)(?:(\\d+)\\.)(\\*|\\d+)*/" 126 | }, 127 | "googletagmanager": { 128 | "name": "googletagmanager", 129 | "tag": "script", 130 | "default_version": null, 131 | "vuln_if_smaller": null, 132 | "vuln_array": null, 133 | "vuln_references": null, 134 | "version_regex": "/(?:(\\d+)\\.)(?:(\\d+)\\.)(\\*|\\d+)*/" 135 | }, 136 | "krux": { 137 | "name": "krux", 138 | "tag": "script", 139 | "default_version": null, 140 | "vuln_if_smaller": null, 141 | "vuln_array": null, 142 | "vuln_references": null, 143 | "version_regex": "/(?:(\\d+)\\.)(?:(\\d+)\\.)(\\*|\\d+)*/" 144 | }, 145 | "marketo": { 146 | "name": "marketo", 147 | "tag": "script", 148 | "default_version": null, 149 | "vuln_if_smaller": null, 150 | "vuln_array": null, 151 | "vuln_references": null, 152 | "version_regex": "/(?:(\\d+)\\.)(?:(\\d+)\\.)(\\*|\\d+)*/" 153 | }, 154 | "modernizr": { 155 | "name": "modernizr", 156 | "tag": "script", 157 | "default_version": null, 158 | "vuln_if_smaller": null, 159 | "vuln_array": null, 160 | "vuln_references": null, 161 | "version_regex": "/(?:(\\d+)\\.)(?:(\\d+)\\.)(\\*|\\d+)*/" 162 | }, 163 | "omniture": { 164 | "name": "omniture", 165 | "tag": "script", 166 | "default_version": null, 167 | "vuln_if_smaller": null, 168 | "vuln_array": null, 169 | "vuln_references": null, 170 | "version_regex": "/(?:(\\d+)\\.)(?:(\\d+)\\.)(\\*|\\d+)*/" 171 | }, 172 | "outbrain": { 173 | "name": "outbrain", 174 | "tag": "script", 175 | "default_version": null, 176 | "vuln_if_smaller": null, 177 | "vuln_array": null, 178 | "vuln_references": null, 179 | "version_regex": "/(?:(\\d+)\\.)(?:(\\d+)\\.)(\\*|\\d+)*/" 180 | }, 181 | "prototype": { 182 | "name": "prototype", 183 | "tag": "script", 184 | "default_version": null, 185 | "vuln_if_smaller": null, 186 | "vuln_array": null, 187 | "vuln_references": null, 188 | "version_regex": "/(?:(\\d+)\\.)(?:(\\d+)\\.)(\\*|\\d+)*/" 189 | }, 190 | "sitecatalyst": { 191 | "name": "sitecatalyst", 192 | "tag": "script", 193 | "default_version": null, 194 | "vuln_if_smaller": null, 195 | "vuln_array": null, 196 | "vuln_references": null, 197 | "version_regex": "/(?:(\\d+)\\.)(?:(\\d+)\\.)(\\*|\\d+)*/" 198 | }, 199 | "wrating": { 200 | "name": "wrating", 201 | "tag": "script", 202 | "default_version": null, 203 | "vuln_if_smaller": null, 204 | "vuln_array": null, 205 | "vuln_references": null, 206 | "version_regex": "/(?:(\\d+)\\.)(?:(\\d+)\\.)(\\*|\\d+)*/" 207 | } 208 | } 209 | -------------------------------------------------------------------------------- /tests/Unit/ScannerTest.php: -------------------------------------------------------------------------------- 1 | printError($e->getMessage(), get_class($e)); 38 | 39 | $this->assertInternalType('array', $view); 40 | } 41 | 42 | /** 43 | * Check whether response is as specified 44 | * 45 | * @return void 46 | */ 47 | public function testPrintResult() 48 | { 49 | $view = new View(file_get_contents(base_path('VERSION'))); 50 | 51 | $view = $view->printJSON("Wordpress", ["test@email.com"], null, null, ["1234567"]); 52 | 53 | 54 | /** 55 | === Check keys === 56 | **/ 57 | $this->assertArrayHasKey('name', $view); 58 | $this->assertArrayHasKey('version', $view); 59 | $this->assertArrayHasKey('hasError', $view); 60 | $this->assertArrayHasKey('score', $view); 61 | $this->assertArrayHasKey('tests', $view); 62 | 63 | foreach ($view["tests"] as $test) { 64 | $this->assertArrayHasKey('name', $test); 65 | $this->assertArrayHasKey('hasError', $test); 66 | $this->assertArrayHasKey('score', $test); 67 | $this->assertArrayHasKey('scoreType', $test); 68 | $this->assertArrayHasKey('testDetails', $test); 69 | } 70 | 71 | /** 72 | === Check types === 73 | **/ 74 | $this->assertInternalType('array', $view); 75 | $this->assertInternalType('string', $view["version"]); 76 | $this->assertEquals($view["hasError"], null); 77 | $this->assertEquals($view["errorMessage"], null); 78 | $this->assertInternalType('float', $view["score"]); 79 | $this->assertInternalType('array', $view["tests"]); 80 | 81 | foreach ($view["tests"] as $test) { 82 | $this->assertInternalType('string', $test["name"]); 83 | $this->assertEquals($test["errorMessage"], null); 84 | $this->assertEquals($test["hasError"], null); 85 | $this->assertInternalType('integer', $test["score"]); 86 | $this->assertInternalType('string', $test["scoreType"]); 87 | } 88 | 89 | /** 90 | === Check values === 91 | **/ 92 | $this->assertEquals($view["name"], "INFOLEAK"); 93 | $this->assertEquals($view["score"], "99"); 94 | 95 | // tests 0 96 | $this->assertEquals($view["tests"][0]["score"], "100"); 97 | $this->assertEquals($view["tests"][0]["name"], "CMS_PLUGINS"); 98 | $this->assertEquals($view["tests"][0]["scoreType"], "warning"); 99 | 100 | // tests 1 101 | $this->assertEquals($view["tests"][1]["score"], "100"); 102 | $this->assertEquals($view["tests"][1]["name"], "JS_LIB"); 103 | $this->assertEquals($view["tests"][1]["scoreType"], "warning"); 104 | 105 | // tests 2 106 | $this->assertEquals($view["tests"][2]["score"], "96"); 107 | $this->assertEquals($view["tests"][2]["name"], "EMAIL_ADDRESS"); 108 | $this->assertEquals($view["tests"][2]["scoreType"], "info"); 109 | $this->assertEquals($view["tests"][2]["testDetails"][0]["translationStringId"], "EMAIL_FOUND"); 110 | $this->assertEquals($view["tests"][2]["testDetails"][0]["placeholders"]["email_adress"], "test@email.com"); 111 | 112 | // tests 3 113 | $this->assertEquals($view["tests"][3]["score"], "98"); 114 | $this->assertEquals($view["tests"][3]["name"], "PHONE_NUMBER"); 115 | $this->assertEquals($view["tests"][3]["scoreType"], "info"); 116 | $this->assertEquals($view["tests"][3]["testDetails"][0]["translationStringId"], "NUMBER_FOUND"); 117 | $this->assertEquals($view["tests"][3]["testDetails"][0]["placeholders"]["number"], "1234567"); 118 | 119 | /** 120 | === Check scoring === 121 | **/ 122 | unset($view); 123 | $view = new View(file_get_contents(base_path('VERSION'))); 124 | $view = $view->printJSON("Wordpress", null, null, null, ["1234567"]); 125 | $this->assertEquals($view["score"], "100"); 126 | 127 | $view = new View(file_get_contents(base_path('VERSION'))); 128 | $view = $view->printJSON("Wordpress", null, null, null, null); 129 | $this->assertEquals($view["score"], "100"); 130 | 131 | $view = new View(file_get_contents(base_path('VERSION'))); 132 | $view = $view->printJSON(null, null, null, null, null); 133 | $this->assertEquals($view["score"], "100"); 134 | 135 | $view = new View(file_get_contents(base_path('VERSION'))); 136 | $p = array(); 137 | $p["result"] = [true]; 138 | $p["pVal"] = ["/path/to/YoastSEO"]; 139 | $p["attrName"] = ["href"]; 140 | $p["version"] = ["1.7.3.3"]; 141 | $p["plugin_name"] = ["YoastSEO"]; 142 | $view = $view->printJSON("Wordpress", ["test@email.com"], $p, null, ["1234567"]); 143 | $this->assertEquals($view["score"], "20"); 144 | 145 | $view = new View(file_get_contents(base_path('VERSION'))); 146 | $p = array(); 147 | $p["result"] = [false]; 148 | $p["pVal"] = ["/path/to/YoastSEO"]; 149 | $p["attrName"] = ["href"]; 150 | $p["version"] = ["1.7.3.3"]; 151 | $p["plugin_name"] = ["YoastSEO"]; 152 | $view = $view->printJSON("Wordpress", ["test@email.com"], $p, null, ["1234567"]); 153 | $this->assertEquals($view["score"], "98"); 154 | } 155 | 156 | /** 157 | * Check whether Analyser works correctly 158 | * 159 | * @return void 160 | */ 161 | public function testAnalyser() 162 | { 163 | $analyser = new Analyser("http://SCANNER-PHP-UNIT-TEST.com", ""); 164 | 165 | /** 166 | ======== TESTING find_email ======== 167 | **/ 168 | 169 | $mail_adresses = [ 170 | "easy@mail.com", "x@y.com", "test0@email.de", 171 | "easy1[at]mail.com", "easy=?^2[at]mail.com", 172 | "my.mail[at]hoster.to", "number11[at]gmx.de", 173 | "me#easy@mail.com", "me#easy|}~@mail.com", "me.*+-/=?^_`{|}~easy@mail.com" 174 | //"test@mail.de", // test@mail.de encoded 175 | ]; 176 | $email_source = << 178 | 179 | easy $mail_adresses[0] 180 | inquotes "$mail_adresses[1]" 181 | mailto mailto:$mail_adresses[2] 182 | a href="mailto:$mail_adresses[3]" 183 | askdbasd "$mail_adresses[4]" kjasdasd 184 | $mail_adresses[5] 185 | $mail_adresses[6] 186 | $mail_adresses[7] 187 | $mail_adresses[8] 188 | $mail_adresses[9] 189 | 190 | 191 | EOT; 192 | $email_analysis = $analyser->find_email($email_source); 193 | 194 | // NOTE(ya): Check whether results match original adresses precisely 195 | foreach ($email_analysis as $email) { 196 | $this->assertContains($email, $mail_adresses); 197 | } 198 | 199 | // NOTE(ya): Are all tested emails getting detected? 200 | $this->assertEquals(10, count($email_analysis)); 201 | } 202 | 203 | 204 | /** @test */ 205 | public function the_email_analyser_will_not_fetch_an_invalid_email_containing_a_slash() 206 | { 207 | $analyser = new Analyser("http://SCANNER-PHP-UNIT-TEST.com", ""); 208 | $emails = $analyser->find_email("/publickey.mail@example.org"); 209 | 210 | $this->assertCount(1, $emails); 211 | $this->assertEquals('publickey.mail@example.org', $emails[0]); 212 | } 213 | } 214 | -------------------------------------------------------------------------------- /config/session.php: -------------------------------------------------------------------------------- 1 | env('SESSION_DRIVER', 'file'), 22 | 23 | /* 24 | |-------------------------------------------------------------------------- 25 | | Session Lifetime 26 | |-------------------------------------------------------------------------- 27 | | 28 | | Here you may specify the number of minutes that you wish the session 29 | | to be allowed to remain idle before it expires. If you want them 30 | | to immediately expire on the browser closing, set that option. 31 | | 32 | */ 33 | 34 | 'lifetime' => env('SESSION_LIFETIME', 120), 35 | 36 | 'expire_on_close' => false, 37 | 38 | /* 39 | |-------------------------------------------------------------------------- 40 | | Session Encryption 41 | |-------------------------------------------------------------------------- 42 | | 43 | | This option allows you to easily specify that all of your session data 44 | | should be encrypted before it is stored. All encryption will be run 45 | | automatically by Laravel and you can use the Session like normal. 46 | | 47 | */ 48 | 49 | 'encrypt' => false, 50 | 51 | /* 52 | |-------------------------------------------------------------------------- 53 | | Session File Location 54 | |-------------------------------------------------------------------------- 55 | | 56 | | When using the native session driver, we need a location where session 57 | | files may be stored. A default has been set for you but a different 58 | | location may be specified. This is only needed for file sessions. 59 | | 60 | */ 61 | 62 | 'files' => storage_path('framework/sessions'), 63 | 64 | /* 65 | |-------------------------------------------------------------------------- 66 | | Session Database Connection 67 | |-------------------------------------------------------------------------- 68 | | 69 | | When using the "database" or "redis" session drivers, you may specify a 70 | | connection that should be used to manage these sessions. This should 71 | | correspond to a connection in your database configuration options. 72 | | 73 | */ 74 | 75 | 'connection' => env('SESSION_CONNECTION', null), 76 | 77 | /* 78 | |-------------------------------------------------------------------------- 79 | | Session Database Table 80 | |-------------------------------------------------------------------------- 81 | | 82 | | When using the "database" session driver, you may specify the table we 83 | | should use to manage the sessions. Of course, a sensible default is 84 | | provided for you; however, you are free to change this as needed. 85 | | 86 | */ 87 | 88 | 'table' => 'sessions', 89 | 90 | /* 91 | |-------------------------------------------------------------------------- 92 | | Session Cache Store 93 | |-------------------------------------------------------------------------- 94 | | 95 | | When using the "apc", "memcached", or "dynamodb" session drivers you may 96 | | list a cache store that should be used for these sessions. This value 97 | | must match with one of the application's configured cache "stores". 98 | | 99 | */ 100 | 101 | 'store' => env('SESSION_STORE', null), 102 | 103 | /* 104 | |-------------------------------------------------------------------------- 105 | | Session Sweeping Lottery 106 | |-------------------------------------------------------------------------- 107 | | 108 | | Some session drivers must manually sweep their storage location to get 109 | | rid of old sessions from storage. Here are the chances that it will 110 | | happen on a given request. By default, the odds are 2 out of 100. 111 | | 112 | */ 113 | 114 | 'lottery' => [2, 100], 115 | 116 | /* 117 | |-------------------------------------------------------------------------- 118 | | Session Cookie Name 119 | |-------------------------------------------------------------------------- 120 | | 121 | | Here you may change the name of the cookie used to identify a session 122 | | instance by ID. The name specified here will get used every time a 123 | | new session cookie is created by the framework for every driver. 124 | | 125 | */ 126 | 127 | 'cookie' => env( 128 | 'SESSION_COOKIE', 129 | Str::slug(env('APP_NAME', 'laravel'), '_').'_session' 130 | ), 131 | 132 | /* 133 | |-------------------------------------------------------------------------- 134 | | Session Cookie Path 135 | |-------------------------------------------------------------------------- 136 | | 137 | | The session cookie path determines the path for which the cookie will 138 | | be regarded as available. Typically, this will be the root path of 139 | | your application but you are free to change this when necessary. 140 | | 141 | */ 142 | 143 | 'path' => '/', 144 | 145 | /* 146 | |-------------------------------------------------------------------------- 147 | | Session Cookie Domain 148 | |-------------------------------------------------------------------------- 149 | | 150 | | Here you may change the domain of the cookie used to identify a session 151 | | in your application. This will determine which domains the cookie is 152 | | available to in your application. A sensible default has been set. 153 | | 154 | */ 155 | 156 | 'domain' => env('SESSION_DOMAIN', null), 157 | 158 | /* 159 | |-------------------------------------------------------------------------- 160 | | HTTPS Only Cookies 161 | |-------------------------------------------------------------------------- 162 | | 163 | | By setting this option to true, session cookies will only be sent back 164 | | to the server if the browser has a HTTPS connection. This will keep 165 | | the cookie from being sent to you if it can not be done securely. 166 | | 167 | */ 168 | 169 | 'secure' => env('SESSION_SECURE_COOKIE', false), 170 | 171 | /* 172 | |-------------------------------------------------------------------------- 173 | | HTTP Access Only 174 | |-------------------------------------------------------------------------- 175 | | 176 | | Setting this value to true will prevent JavaScript from accessing the 177 | | value of the cookie and the cookie will only be accessible through 178 | | the HTTP protocol. You are free to modify this option if needed. 179 | | 180 | */ 181 | 182 | 'http_only' => true, 183 | 184 | /* 185 | |-------------------------------------------------------------------------- 186 | | Same-Site Cookies 187 | |-------------------------------------------------------------------------- 188 | | 189 | | This option determines how your cookies behave when cross-site requests 190 | | take place, and can be used to mitigate CSRF attacks. By default, we 191 | | do not enable this as other CSRF protection services are in place. 192 | | 193 | | Supported: "lax", "strict" 194 | | 195 | */ 196 | 197 | 'same_site' => null, 198 | 199 | ]; 200 | -------------------------------------------------------------------------------- /resources/lang/en/validation.php: -------------------------------------------------------------------------------- 1 | 'The :attribute must be accepted.', 17 | 'active_url' => 'The :attribute is not a valid URL.', 18 | 'after' => 'The :attribute must be a date after :date.', 19 | 'after_or_equal' => 'The :attribute must be a date after or equal to :date.', 20 | 'alpha' => 'The :attribute may only contain letters.', 21 | 'alpha_dash' => 'The :attribute may only contain letters, numbers, dashes and underscores.', 22 | 'alpha_num' => 'The :attribute may only contain letters and numbers.', 23 | 'array' => 'The :attribute must be an array.', 24 | 'before' => 'The :attribute must be a date before :date.', 25 | 'before_or_equal' => 'The :attribute must be a date before or equal to :date.', 26 | 'between' => [ 27 | 'numeric' => 'The :attribute must be between :min and :max.', 28 | 'file' => 'The :attribute must be between :min and :max kilobytes.', 29 | 'string' => 'The :attribute must be between :min and :max characters.', 30 | 'array' => 'The :attribute must have between :min and :max items.', 31 | ], 32 | 'boolean' => 'The :attribute field must be true or false.', 33 | 'confirmed' => 'The :attribute confirmation does not match.', 34 | 'date' => 'The :attribute is not a valid date.', 35 | 'date_equals' => 'The :attribute must be a date equal to :date.', 36 | 'date_format' => 'The :attribute does not match the format :format.', 37 | 'different' => 'The :attribute and :other must be different.', 38 | 'digits' => 'The :attribute must be :digits digits.', 39 | 'digits_between' => 'The :attribute must be between :min and :max digits.', 40 | 'dimensions' => 'The :attribute has invalid image dimensions.', 41 | 'distinct' => 'The :attribute field has a duplicate value.', 42 | 'email' => 'The :attribute must be a valid email address.', 43 | 'exists' => 'The selected :attribute is invalid.', 44 | 'file' => 'The :attribute must be a file.', 45 | 'filled' => 'The :attribute field must have a value.', 46 | 'gt' => [ 47 | 'numeric' => 'The :attribute must be greater than :value.', 48 | 'file' => 'The :attribute must be greater than :value kilobytes.', 49 | 'string' => 'The :attribute must be greater than :value characters.', 50 | 'array' => 'The :attribute must have more than :value items.', 51 | ], 52 | 'gte' => [ 53 | 'numeric' => 'The :attribute must be greater than or equal :value.', 54 | 'file' => 'The :attribute must be greater than or equal :value kilobytes.', 55 | 'string' => 'The :attribute must be greater than or equal :value characters.', 56 | 'array' => 'The :attribute must have :value items or more.', 57 | ], 58 | 'image' => 'The :attribute must be an image.', 59 | 'in' => 'The selected :attribute is invalid.', 60 | 'in_array' => 'The :attribute field does not exist in :other.', 61 | 'integer' => 'The :attribute must be an integer.', 62 | 'ip' => 'The :attribute must be a valid IP address.', 63 | 'ipv4' => 'The :attribute must be a valid IPv4 address.', 64 | 'ipv6' => 'The :attribute must be a valid IPv6 address.', 65 | 'json' => 'The :attribute must be a valid JSON string.', 66 | 'lt' => [ 67 | 'numeric' => 'The :attribute must be less than :value.', 68 | 'file' => 'The :attribute must be less than :value kilobytes.', 69 | 'string' => 'The :attribute must be less than :value characters.', 70 | 'array' => 'The :attribute must have less than :value items.', 71 | ], 72 | 'lte' => [ 73 | 'numeric' => 'The :attribute must be less than or equal :value.', 74 | 'file' => 'The :attribute must be less than or equal :value kilobytes.', 75 | 'string' => 'The :attribute must be less than or equal :value characters.', 76 | 'array' => 'The :attribute must not have more than :value items.', 77 | ], 78 | 'max' => [ 79 | 'numeric' => 'The :attribute may not be greater than :max.', 80 | 'file' => 'The :attribute may not be greater than :max kilobytes.', 81 | 'string' => 'The :attribute may not be greater than :max characters.', 82 | 'array' => 'The :attribute may not have more than :max items.', 83 | ], 84 | 'mimes' => 'The :attribute must be a file of type: :values.', 85 | 'mimetypes' => 'The :attribute must be a file of type: :values.', 86 | 'min' => [ 87 | 'numeric' => 'The :attribute must be at least :min.', 88 | 'file' => 'The :attribute must be at least :min kilobytes.', 89 | 'string' => 'The :attribute must be at least :min characters.', 90 | 'array' => 'The :attribute must have at least :min items.', 91 | ], 92 | 'not_in' => 'The selected :attribute is invalid.', 93 | 'not_regex' => 'The :attribute format is invalid.', 94 | 'numeric' => 'The :attribute must be a number.', 95 | 'present' => 'The :attribute field must be present.', 96 | 'regex' => 'The :attribute format is invalid.', 97 | 'required' => 'The :attribute field is required.', 98 | 'required_if' => 'The :attribute field is required when :other is :value.', 99 | 'required_unless' => 'The :attribute field is required unless :other is in :values.', 100 | 'required_with' => 'The :attribute field is required when :values is present.', 101 | 'required_with_all' => 'The :attribute field is required when :values are present.', 102 | 'required_without' => 'The :attribute field is required when :values is not present.', 103 | 'required_without_all' => 'The :attribute field is required when none of :values are present.', 104 | 'same' => 'The :attribute and :other must match.', 105 | 'size' => [ 106 | 'numeric' => 'The :attribute must be :size.', 107 | 'file' => 'The :attribute must be :size kilobytes.', 108 | 'string' => 'The :attribute must be :size characters.', 109 | 'array' => 'The :attribute must contain :size items.', 110 | ], 111 | 'starts_with' => 'The :attribute must start with one of the following: :values', 112 | 'string' => 'The :attribute must be a string.', 113 | 'timezone' => 'The :attribute must be a valid zone.', 114 | 'unique' => 'The :attribute has already been taken.', 115 | 'uploaded' => 'The :attribute failed to upload.', 116 | 'url' => 'The :attribute format is invalid.', 117 | 'uuid' => 'The :attribute must be a valid UUID.', 118 | 119 | /* 120 | |-------------------------------------------------------------------------- 121 | | Custom Validation Language Lines 122 | |-------------------------------------------------------------------------- 123 | | 124 | | Here you may specify custom validation messages for attributes using the 125 | | convention "attribute.rule" to name the lines. This makes it quick to 126 | | specify a specific custom language line for a given attribute rule. 127 | | 128 | */ 129 | 130 | 'custom' => [ 131 | 'attribute-name' => [ 132 | 'rule-name' => 'custom-message', 133 | ], 134 | ], 135 | 136 | /* 137 | |-------------------------------------------------------------------------- 138 | | Custom Validation Attributes 139 | |-------------------------------------------------------------------------- 140 | | 141 | | The following language lines are used to swap our attribute placeholder 142 | | with something more reader friendly such as "E-Mail Address" instead 143 | | of "email". This simply helps us make our message more expressive. 144 | | 145 | */ 146 | 147 | 'attributes' => [], 148 | 149 | ]; 150 | -------------------------------------------------------------------------------- /config/app.php: -------------------------------------------------------------------------------- 1 | env('APP_NAME', 'INFOLEAK'), 17 | 18 | /* 19 | |-------------------------------------------------------------------------- 20 | | Application Environment 21 | |-------------------------------------------------------------------------- 22 | | 23 | | This value determines the "environment" your application is currently 24 | | running in. This may determine how you prefer to configure various 25 | | services the application utilizes. Set this in your ".env" file. 26 | | 27 | */ 28 | 29 | 'env' => env('APP_ENV', 'production'), 30 | 31 | /* 32 | |-------------------------------------------------------------------------- 33 | | Application Debug Mode 34 | |-------------------------------------------------------------------------- 35 | | 36 | | When your application is in debug mode, detailed error messages with 37 | | stack traces will be shown on every error that occurs within your 38 | | application. If disabled, a simple generic error page is shown. 39 | | 40 | */ 41 | 42 | 'debug' => env('APP_DEBUG', false), 43 | 44 | /* 45 | |-------------------------------------------------------------------------- 46 | | Application URL 47 | |-------------------------------------------------------------------------- 48 | | 49 | | This URL is used by the console to properly generate URLs when using 50 | | the Artisan command line tool. You should set this to the root of 51 | | your application so that it is used when running Artisan tasks. 52 | | 53 | */ 54 | 55 | 'url' => env('APP_URL', 'http://localhost'), 56 | 57 | 'asset_url' => env('ASSET_URL', null), 58 | 59 | /* 60 | |-------------------------------------------------------------------------- 61 | | Application Timezone 62 | |-------------------------------------------------------------------------- 63 | | 64 | | Here you may specify the default timezone for your application, which 65 | | will be used by the PHP date and date-time functions. We have gone 66 | | ahead and set this to a sensible default for you out of the box. 67 | | 68 | */ 69 | 70 | 'timezone' => 'UTC', 71 | 72 | /* 73 | |-------------------------------------------------------------------------- 74 | | Application Locale Configuration 75 | |-------------------------------------------------------------------------- 76 | | 77 | | The application locale determines the default locale that will be used 78 | | by the translation service provider. You are free to set this value 79 | | to any of the locales which will be supported by the application. 80 | | 81 | */ 82 | 83 | 'locale' => 'en', 84 | 85 | /* 86 | |-------------------------------------------------------------------------- 87 | | Application Fallback Locale 88 | |-------------------------------------------------------------------------- 89 | | 90 | | The fallback locale determines the locale to use when the current one 91 | | is not available. You may change the value to correspond to any of 92 | | the language folders that are provided through your application. 93 | | 94 | */ 95 | 96 | 'fallback_locale' => 'en', 97 | 98 | /* 99 | |-------------------------------------------------------------------------- 100 | | Faker Locale 101 | |-------------------------------------------------------------------------- 102 | | 103 | | This locale will be used by the Faker PHP library when generating fake 104 | | data for your database seeds. For example, this will be used to get 105 | | localized telephone numbers, street address information and more. 106 | | 107 | */ 108 | 109 | 'faker_locale' => 'en_US', 110 | 111 | /* 112 | |-------------------------------------------------------------------------- 113 | | Encryption Key 114 | |-------------------------------------------------------------------------- 115 | | 116 | | This key is used by the Illuminate encrypter service and should be set 117 | | to a random, 32 character string, otherwise these encrypted strings 118 | | will not be safe. Please do this before deploying an application! 119 | | 120 | */ 121 | 122 | 'key' => env('APP_KEY', 'base64:xT4CVPbuFHD+eAplCj7TgQHK1IS2zinr8jt7XAlfuCM='), 123 | 124 | 'cipher' => 'AES-256-CBC', 125 | 126 | /* 127 | |-------------------------------------------------------------------------- 128 | | Autoloaded Service Providers 129 | |-------------------------------------------------------------------------- 130 | | 131 | | The service providers listed here will be automatically loaded on the 132 | | request to your application. Feel free to add your own services to 133 | | this array to grant expanded functionality to your applications. 134 | | 135 | */ 136 | 137 | 'providers' => [ 138 | 139 | /* 140 | * Laravel Framework Service Providers... 141 | */ 142 | Illuminate\Auth\AuthServiceProvider::class, 143 | Illuminate\Broadcasting\BroadcastServiceProvider::class, 144 | Illuminate\Bus\BusServiceProvider::class, 145 | Illuminate\Cache\CacheServiceProvider::class, 146 | Illuminate\Foundation\Providers\ConsoleSupportServiceProvider::class, 147 | Illuminate\Cookie\CookieServiceProvider::class, 148 | Illuminate\Database\DatabaseServiceProvider::class, 149 | Illuminate\Encryption\EncryptionServiceProvider::class, 150 | Illuminate\Filesystem\FilesystemServiceProvider::class, 151 | Illuminate\Foundation\Providers\FoundationServiceProvider::class, 152 | Illuminate\Hashing\HashServiceProvider::class, 153 | Illuminate\Mail\MailServiceProvider::class, 154 | Illuminate\Notifications\NotificationServiceProvider::class, 155 | Illuminate\Pagination\PaginationServiceProvider::class, 156 | Illuminate\Pipeline\PipelineServiceProvider::class, 157 | Illuminate\Queue\QueueServiceProvider::class, 158 | Illuminate\Redis\RedisServiceProvider::class, 159 | Illuminate\Auth\Passwords\PasswordResetServiceProvider::class, 160 | Illuminate\Session\SessionServiceProvider::class, 161 | Illuminate\Translation\TranslationServiceProvider::class, 162 | Illuminate\Validation\ValidationServiceProvider::class, 163 | Illuminate\View\ViewServiceProvider::class, 164 | 165 | /* 166 | * Package Service Providers... 167 | */ 168 | 169 | /* 170 | * Application Service Providers... 171 | */ 172 | App\Providers\AppServiceProvider::class, 173 | App\Providers\AuthServiceProvider::class, 174 | // App\Providers\BroadcastServiceProvider::class, 175 | App\Providers\EventServiceProvider::class, 176 | App\Providers\RouteServiceProvider::class, 177 | 178 | ], 179 | 180 | /* 181 | |-------------------------------------------------------------------------- 182 | | Class Aliases 183 | |-------------------------------------------------------------------------- 184 | | 185 | | This array of class aliases will be registered when this application 186 | | is started. However, feel free to register as many as you wish as 187 | | the aliases are "lazy" loaded so they don't hinder performance. 188 | | 189 | */ 190 | 191 | 'aliases' => [ 192 | 193 | 'App' => Illuminate\Support\Facades\App::class, 194 | 'Arr' => Illuminate\Support\Arr::class, 195 | 'Artisan' => Illuminate\Support\Facades\Artisan::class, 196 | 'Auth' => Illuminate\Support\Facades\Auth::class, 197 | 'Blade' => Illuminate\Support\Facades\Blade::class, 198 | 'Broadcast' => Illuminate\Support\Facades\Broadcast::class, 199 | 'Bus' => Illuminate\Support\Facades\Bus::class, 200 | 'Cache' => Illuminate\Support\Facades\Cache::class, 201 | 'Config' => Illuminate\Support\Facades\Config::class, 202 | 'Cookie' => Illuminate\Support\Facades\Cookie::class, 203 | 'Crypt' => Illuminate\Support\Facades\Crypt::class, 204 | 'DB' => Illuminate\Support\Facades\DB::class, 205 | 'Eloquent' => Illuminate\Database\Eloquent\Model::class, 206 | 'Event' => Illuminate\Support\Facades\Event::class, 207 | 'File' => Illuminate\Support\Facades\File::class, 208 | 'Gate' => Illuminate\Support\Facades\Gate::class, 209 | 'Hash' => Illuminate\Support\Facades\Hash::class, 210 | 'Lang' => Illuminate\Support\Facades\Lang::class, 211 | 'Log' => Illuminate\Support\Facades\Log::class, 212 | 'Mail' => Illuminate\Support\Facades\Mail::class, 213 | 'Notification' => Illuminate\Support\Facades\Notification::class, 214 | 'Password' => Illuminate\Support\Facades\Password::class, 215 | 'Queue' => Illuminate\Support\Facades\Queue::class, 216 | 'Redirect' => Illuminate\Support\Facades\Redirect::class, 217 | 'Redis' => Illuminate\Support\Facades\Redis::class, 218 | 'Request' => Illuminate\Support\Facades\Request::class, 219 | 'Response' => Illuminate\Support\Facades\Response::class, 220 | 'Route' => Illuminate\Support\Facades\Route::class, 221 | 'Schema' => Illuminate\Support\Facades\Schema::class, 222 | 'Session' => Illuminate\Support\Facades\Session::class, 223 | 'Storage' => Illuminate\Support\Facades\Storage::class, 224 | 'Str' => Illuminate\Support\Str::class, 225 | 'URL' => Illuminate\Support\Facades\URL::class, 226 | 'Validator' => Illuminate\Support\Facades\Validator::class, 227 | 'View' => Illuminate\Support\Facades\View::class, 228 | 229 | ], 230 | 231 | ]; 232 | -------------------------------------------------------------------------------- /app/Libs/cms_analysis_config.json: -------------------------------------------------------------------------------- 1 | { 2 | "wordpress": { 3 | "name": "wordpress", 4 | "meta": { 5 | "generator": "wordpress", 6 | "Generator": "wordpress" 7 | }, 8 | "default_version": null, 9 | "vuln_if_smaller": { 10 | "0": 4, 11 | "1": 9, 12 | "2": 4 13 | }, 14 | "vuln_array": { 15 | "0": "4.9.4" 16 | }, 17 | "vuln_references": { 18 | "0": "https://www.cvedetails.com/vulnerability-list/vendor_id-2337/product_id-4096/", 19 | "1": "https://wpvulndb.com/wordpresses?page=1" 20 | }, 21 | "version_regex": "/\\s+([\\d.]+)/", 22 | "attribute_whitelist": null, 23 | "attribute_names": { 24 | "0": "href", 25 | "1": "src", 26 | "2": "srcset" 27 | }, 28 | "indicators": { 29 | "0": "wp-includes", 30 | "1": "wp-content", 31 | "2": "wp-json" 32 | }, 33 | "html_regex": null 34 | }, 35 | "joomla": { 36 | "name": "joomla", 37 | "meta": { 38 | "generator": "Joomla!", 39 | "Generator": "Joomla!" 40 | }, 41 | "default_version": null, 42 | "vuln_if_smaller": { 43 | "0": 3, 44 | "1": 8, 45 | "2": 5 46 | }, 47 | "vuln_array": { 48 | "0": "3.7.1" 49 | }, 50 | "vuln_references": { 51 | "0": "https://www.cvedetails.com/vulnerability-list/vendor_id-3496/product_id-16499/Joomla-Joomla-.html", 52 | "1": "https://blog.sucuri.net/2017/05/sql-injection-vulnerability-joomla-3-7.html" 53 | }, 54 | "version_regex": "/\\s+([\\d.]+)/", 55 | "attribute_whitelist": null, 56 | "attribute_names": null, 57 | "indicators": null, 58 | "html_regex": null 59 | }, 60 | "drupal": { 61 | "name": "drupal", 62 | "meta": { 63 | "generator": "Drupal", 64 | "Generator": "Drupal" 65 | }, 66 | "default_version": null, 67 | "vuln_if_smaller": { 68 | "0": 8, 69 | "1": 2, 70 | "2": 3 71 | }, 72 | "vuln_array": { 73 | "0": "7.57" 74 | }, 75 | "vuln_references": { 76 | "0": "https://www.cvedetails.com/vulnerability-list/vendor_id-1367/product_id-2387/Drupal-Drupal.html" 77 | }, 78 | "version_regex": "/\\s+([\\d.]+)/", 79 | "attribute_whitelist": null, 80 | "attribute_names": null, 81 | "indicators": null, 82 | "html_regex": null 83 | }, 84 | "vbulletin": { 85 | "name": "vbulletin", 86 | "meta": { 87 | "generator": "vBulletin", 88 | "Generator": "vBulletin" 89 | }, 90 | "default_version": null, 91 | "vuln_if_smaller": { 92 | "0": 5, 93 | "1": 3, 94 | "2": 0 95 | }, 96 | "vuln_array": { 97 | "0": "5.1.3" 98 | }, 99 | "vuln_references": { 100 | "0": "https://www.cvedetails.com/vulnerability-list/vendor_id-8142/Vbulletin.html" 101 | }, 102 | "version_regex": "/\\s+([\\d.]+)/", 103 | "attribute_whitelist": null, 104 | "attribute_names": null, 105 | "indicators": null, 106 | "html_regex": null 107 | }, 108 | "contenido": { 109 | "name": "contenido", 110 | "meta": { 111 | "generator": "CONTENIDO", 112 | "Generator": "CONTENIDO" 113 | }, 114 | "default_version": null, 115 | "vuln_if_smaller": { 116 | "0": 4, 117 | "1": 9, 118 | "2": 6 119 | }, 120 | "vuln_array": { 121 | "0": "4.8.4" 122 | }, 123 | "vuln_references": { 124 | "0": "https://www.cvedetails.com/vulnerability-list/vendor_id-3633/Contenido.html" 125 | }, 126 | "version_regex": "/\\s+([\\d.]+)/", 127 | "attribute_whitelist": null, 128 | "attribute_names": null, 129 | "indicators": null, 130 | "html_regex": null 131 | }, 132 | "xt-commerce": { 133 | "name": "xt-commerce", 134 | "meta": { 135 | "generator": "xt:Commerce", 136 | "Generator": "xt:Commerce" 137 | }, 138 | "default_version": null, 139 | "vuln_if_smaller": { 140 | "0": 3, 141 | "1": 0, 142 | "2": 4 143 | }, 144 | "vuln_array": { 145 | "0": "3.0.4" 146 | }, 147 | "vuln_references": { 148 | "0": "https://www.cvedetails.com/vulnerability-list/vendor_id-6173/Xt-commerce.html" 149 | }, 150 | "version_regex": "/\\s+([\\d.]+)/", 151 | "attribute_whitelist": null, 152 | "attribute_names": null, 153 | "indicators": null, 154 | "html_regex": null 155 | }, 156 | "webspell": { 157 | "name": "webspell", 158 | "meta": { 159 | "generator": "webSPELL", 160 | "Generator": "webSPELL" 161 | }, 162 | "default_version": null, 163 | "vuln_if_smaller": { 164 | "0": 4, 165 | "1": 2, 166 | "2": 1 167 | }, 168 | "vuln_array": { 169 | "0": "4.2.1" 170 | }, 171 | "vuln_references": { 172 | "0": "https://www.cvedetails.com/vulnerability-list/vendor_id-4068/product_id-7132/Webspell-Webspell.html" 173 | }, 174 | "version_regex": "/\\s+([\\d.]+)/", 175 | "attribute_whitelist": null, 176 | "attribute_names": null, 177 | "indicators": null, 178 | "html_regex": null 179 | }, 180 | "webspell-nor": { 181 | "name": "webspell-nor", 182 | "meta": { 183 | "generator": "webSPELL-NOR", 184 | "Generator": "webSPELL-NOR" 185 | }, 186 | "default_version": null, 187 | "vuln_if_smaller": { 188 | "0": 4, 189 | "1": 2, 190 | "2": 1 191 | }, 192 | "vuln_array": { 193 | "0": "4.2.1" 194 | }, 195 | "vuln_references": { 196 | "0": "https://www.cvedetails.com/vulnerability-list/vendor_id-4068/product_id-7132/Webspell-Webspell.html" 197 | }, 198 | "version_regex": "/\\s+([\\d.]+)/", 199 | "attribute_whitelist": null, 200 | "attribute_names": null, 201 | "indicators": null, 202 | "html_regex": null 203 | }, 204 | "magento2": { 205 | "name": "magento", 206 | "meta": null, 207 | "default_version": null, 208 | "vuln_if_smaller": null, 209 | "vuln_array": null, 210 | "vuln_references": { 211 | "0": "https://www.cvedetails.com/vulnerability-list/vendor_id-15393/product_id-36803/Magento-Magento2.html" 212 | }, 213 | "version_regex": "/\\s+([\\d.]+)/", 214 | "attribute_whitelist": "script", 215 | "attribute_names": { 216 | "0": "type" 217 | }, 218 | "indicators": { 219 | "0": "text/x-magento-init" 220 | }, 221 | "html_regex": null 222 | }, 223 | "shopsys": { 224 | "name": "shopsys", 225 | "meta": { 226 | "Author": "ShopSys", 227 | "Generator": "ShopSys", 228 | "generator": "ShopSys" 229 | }, 230 | "default_version": null, 231 | "vuln_if_smaller": null, 232 | "vuln_array": null, 233 | "vuln_references": null, 234 | "version_regex": "/\\s+([\\d.]+)/", 235 | "attribute_whitelist": null, 236 | "attribute_names": null, 237 | "indicators": null, 238 | "html_regex": null 239 | }, 240 | "shopify": { 241 | "name": "shopify", 242 | "meta": null, 243 | "default_version": null, 244 | "vuln_if_smaller": null, 245 | "vuln_array": null, 246 | "vuln_references": null, 247 | "version_regex": "/\\s+([\\d.]+)/", 248 | "attribute_whitelist": "link", 249 | "attribute_names": { 250 | "0": "href" 251 | }, 252 | "indicators": { 253 | "0": "//cdn.shopify" 254 | }, 255 | "html_regex": null 256 | }, 257 | "squarespace": { 258 | "name": "squarespace", 259 | "meta": null, 260 | "default_version": null, 261 | "vuln_if_smaller": null, 262 | "vuln_array": null, 263 | "vuln_references": null, 264 | "version_regex": "/\\s+([\\d.]+)/", 265 | "attribute_whitelist": null, 266 | "attribute_names": null, 267 | "indicators": null, 268 | "html_regex": { 269 | "0": { 270 | "node": "comment", 271 | "regex": "//" 272 | } 273 | } 274 | }, 275 | "blogger": { 276 | "name": "blogger", 277 | "meta": { 278 | "generator": "Blogger", 279 | "Generator": "Blogger" 280 | }, 281 | "default_version": null, 282 | "vuln_if_smaller": null, 283 | "vuln_array": null, 284 | "vuln_references": null, 285 | "version_regex": "/\\s+([\\d.]+)/", 286 | "attribute_whitelist": null, 287 | "attribute_names": null, 288 | "indicators": null, 289 | "html_regex": null 290 | }, 291 | "1C-Bitrix": { 292 | "name": "1C-Bitrix", 293 | "meta": null, 294 | "default_version": null, 295 | "vuln_if_smaller": null, 296 | "vuln_array": null, 297 | "vuln_references": null, 298 | "version_regex": "/\\s+([\\d.]+)/", 299 | "attribute_whitelist": null, 300 | "attribute_names": null, 301 | "indicators": null, 302 | "html_regex": { 303 | "0": { 304 | "node": "link", 305 | "regex": "/(?:]+components.+bitrix|(?:src|href)=\"bitrix(?:js|templates))/" 306 | } 307 | } 308 | }, 309 | "TYPO3": { 310 | "name": "TYPO3", 311 | "meta": { 312 | "generator": "TYPO", 313 | "Generator": "TYPO" 314 | }, 315 | "default_version": null, 316 | "vuln_if_smaller": { 317 | "0": "7", 318 | "1": "6", 319 | "2": "8" 320 | }, 321 | "vuln_array": { 322 | "0": "7.6.15" 323 | }, 324 | "vuln_references": "https://www.cvedetails.com/vulnerability-list/vendor_id-3887/Typo3.html", 325 | "version_regex": "/\\s+([\\d.]+)/", 326 | "attribute_whitelist": null, 327 | "attribute_names": null, 328 | "indicators": null, 329 | "html_regex": null 330 | }, 331 | "prestashop": { 332 | "name": "prestashop", 333 | "meta": { 334 | "generator": "PrestaShop", 335 | "Generator": "PrestaShop" 336 | }, 337 | "default_version": null, 338 | "vuln_if_smaller": null, 339 | "vuln_array": null, 340 | "vuln_references": null, 341 | "version_regex": "/\\s+([\\d.]+)/", 342 | "attribute_whitelist": null, 343 | "attribute_names": null, 344 | "indicators": null, 345 | "html_regex": { 346 | "0": { 347 | "node": "a", 348 | "regex": "/Powered by ]+>PrestaShop/" 349 | }, 350 | "1": { 351 | "node": "comment", 352 | "regex": "//" 353 | }, 354 | "2": { 355 | "node": "comment", 356 | "regex": "//" 357 | } 358 | } 359 | }, 360 | "MediaWiki": { 361 | "name": "MediaWiki", 362 | "meta": { 363 | "generator": "MediaWiki", 364 | "Generator": "MediaWiki" 365 | }, 366 | "default_version": null, 367 | "vuln_if_smaller": { 368 | "0": "1", 369 | "1": "24", 370 | "2": "2" 371 | }, 372 | "vuln_array": { 373 | "0": "1.23.9" 374 | }, 375 | "vuln_references": "https://www.cvedetails.com/vulnerability-list/vendor_id-2360/product_id-4125/version_id-151629/Mediawiki-Mediawiki-1.21.html", 376 | "version_regex": "/\\s+([\\d.]+)/", 377 | "attribute_whitelist": null, 378 | "attribute_names": null, 379 | "indicators": null, 380 | "html_regex": null 381 | } 382 | } 383 | --------------------------------------------------------------------------------