@shriyanss/js-recon 1.0.0 → 1.1.0-beta.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (143) hide show
  1. package/.github/workflows/build-and-prettify.yaml +65 -0
  2. package/.github/workflows/npm-publish.yml +35 -0
  3. package/.prettierignore +2 -0
  4. package/.prettierrc +4 -0
  5. package/CHANGELOG.md +50 -0
  6. package/README.md +35 -139
  7. package/build/api_gateway/checkFeasibility.js +32 -0
  8. package/build/api_gateway/checkFeasibility.js.map +1 -0
  9. package/build/api_gateway/checkFireWallBlocking.js +24 -0
  10. package/build/api_gateway/checkFireWallBlocking.js.map +1 -0
  11. package/build/api_gateway/genReq.js +199 -0
  12. package/build/api_gateway/genReq.js.map +1 -0
  13. package/build/api_gateway/index.js +275 -0
  14. package/build/api_gateway/index.js.map +1 -0
  15. package/build/endpoints/gen_report/gen_json.js +22 -0
  16. package/build/endpoints/gen_report/gen_json.js.map +1 -0
  17. package/build/endpoints/gen_report/gen_markdown.js +66 -0
  18. package/build/endpoints/gen_report/gen_markdown.js.map +1 -0
  19. package/build/endpoints/gen_report/utility/iterate_n_store.js +46 -0
  20. package/build/endpoints/gen_report/utility/iterate_n_store.js.map +1 -0
  21. package/build/endpoints/index.js +89 -0
  22. package/build/endpoints/index.js.map +1 -0
  23. package/build/endpoints/next_js/client_jsFilesHref.js +91 -0
  24. package/build/endpoints/next_js/client_jsFilesHref.js.map +1 -0
  25. package/build/endpoints/next_js/client_jsonParse.js +78 -0
  26. package/build/endpoints/next_js/client_jsonParse.js.map +1 -0
  27. package/build/endpoints/next_js/client_subsequentRequests.js +199 -0
  28. package/build/endpoints/next_js/client_subsequentRequests.js.map +1 -0
  29. package/build/endpoints/next_js/getWebpacks.js +45 -0
  30. package/build/endpoints/next_js/getWebpacks.js.map +1 -0
  31. package/build/globalConfig.js +11 -0
  32. package/build/globalConfig.js.map +1 -0
  33. package/build/index.js +166 -0
  34. package/build/index.js.map +1 -0
  35. package/build/lazyLoad/downloadFilesUtil.js +128 -0
  36. package/build/lazyLoad/downloadFilesUtil.js.map +1 -0
  37. package/build/lazyLoad/downloadLoadedJsUtil.js +51 -0
  38. package/build/lazyLoad/downloadLoadedJsUtil.js.map +1 -0
  39. package/build/lazyLoad/globals.js +22 -0
  40. package/build/lazyLoad/globals.js.map +1 -0
  41. package/build/lazyLoad/index.js +170 -0
  42. package/build/lazyLoad/index.js.map +1 -0
  43. package/build/lazyLoad/next_js/next_GetJSScript.js +94 -0
  44. package/build/lazyLoad/next_js/next_GetJSScript.js.map +1 -0
  45. package/build/lazyLoad/next_js/next_GetLazyResources.js +202 -0
  46. package/build/lazyLoad/next_js/next_GetLazyResources.js.map +1 -0
  47. package/build/lazyLoad/next_js/next_SubsequentRequests.js +120 -0
  48. package/build/lazyLoad/next_js/next_SubsequentRequests.js.map +1 -0
  49. package/build/lazyLoad/nuxt_js/nuxt_astParse.js +188 -0
  50. package/build/lazyLoad/nuxt_js/nuxt_astParse.js.map +1 -0
  51. package/build/lazyLoad/nuxt_js/nuxt_getFromPageSource.js +75 -0
  52. package/build/lazyLoad/nuxt_js/nuxt_getFromPageSource.js.map +1 -0
  53. package/build/lazyLoad/nuxt_js/nuxt_stringAnalysisJSFiles.js +94 -0
  54. package/build/lazyLoad/nuxt_js/nuxt_stringAnalysisJSFiles.js.map +1 -0
  55. package/build/lazyLoad/svelte/svelte_getFromPageSource.js +68 -0
  56. package/build/lazyLoad/svelte/svelte_getFromPageSource.js.map +1 -0
  57. package/build/lazyLoad/svelte/svelte_stringAnalysisJSFiles.js +95 -0
  58. package/build/lazyLoad/svelte/svelte_stringAnalysisJSFiles.js.map +1 -0
  59. package/build/map/index.js +58 -0
  60. package/build/map/index.js.map +1 -0
  61. package/build/map/next_js/getFetchInstances.js +108 -0
  62. package/build/map/next_js/getFetchInstances.js.map +1 -0
  63. package/build/map/next_js/getWebpackConnections.js +227 -0
  64. package/build/map/next_js/getWebpackConnections.js.map +1 -0
  65. package/build/map/next_js/interactive.js +32 -0
  66. package/build/map/next_js/interactive.js.map +1 -0
  67. package/build/map/next_js/interactive_helpers/commandHandler.js +190 -0
  68. package/build/map/next_js/interactive_helpers/commandHandler.js.map +1 -0
  69. package/build/map/next_js/interactive_helpers/commandHelpers.js +91 -0
  70. package/build/map/next_js/interactive_helpers/commandHelpers.js.map +1 -0
  71. package/build/map/next_js/interactive_helpers/helpMenu.js +11 -0
  72. package/build/map/next_js/interactive_helpers/helpMenu.js.map +1 -0
  73. package/build/map/next_js/interactive_helpers/keybindings.js +80 -0
  74. package/build/map/next_js/interactive_helpers/keybindings.js.map +1 -0
  75. package/build/map/next_js/interactive_helpers/printer.js +17 -0
  76. package/build/map/next_js/interactive_helpers/printer.js.map +1 -0
  77. package/build/map/next_js/interactive_helpers/ui.js +81 -0
  78. package/build/map/next_js/interactive_helpers/ui.js.map +1 -0
  79. package/build/map/next_js/resolveFetch.js +201 -0
  80. package/build/map/next_js/resolveFetch.js.map +1 -0
  81. package/build/run/index.js +62 -0
  82. package/build/run/index.js.map +1 -0
  83. package/build/strings/index.js +238 -0
  84. package/build/strings/index.js.map +1 -0
  85. package/build/strings/openapi.js +55 -0
  86. package/build/strings/openapi.js.map +1 -0
  87. package/build/strings/permutate.js +55 -0
  88. package/build/strings/permutate.js.map +1 -0
  89. package/build/strings/secrets.js +89 -0
  90. package/build/strings/secrets.js.map +1 -0
  91. package/build/techDetect/index.js +229 -0
  92. package/build/techDetect/index.js.map +1 -0
  93. package/build/utility/ai.js +69 -0
  94. package/build/utility/ai.js.map +1 -0
  95. package/build/utility/globals.js +84 -0
  96. package/build/utility/globals.js.map +1 -0
  97. package/build/utility/interfaces.js +2 -0
  98. package/build/utility/interfaces.js.map +1 -0
  99. package/build/utility/makeReq.js +265 -0
  100. package/build/utility/makeReq.js.map +1 -0
  101. package/build/utility/resolvePath.js +44 -0
  102. package/build/utility/resolvePath.js.map +1 -0
  103. package/{utility → build/utility}/runSandboxed.js +10 -13
  104. package/build/utility/runSandboxed.js.map +1 -0
  105. package/{utility → build/utility}/urlUtils.js +9 -11
  106. package/build/utility/urlUtils.js.map +1 -0
  107. package/docs/CNAME +1 -0
  108. package/docs/README.md +20 -0
  109. package/docs/api-gateway.md +68 -0
  110. package/docs/endpoints.md +49 -0
  111. package/docs/example-scenario.md +258 -0
  112. package/docs/interactive-mode.md +76 -0
  113. package/docs/lazyload.md +56 -0
  114. package/docs/map.md +53 -0
  115. package/docs/run.md +54 -0
  116. package/docs/strings.md +75 -0
  117. package/package.json +50 -38
  118. package/api_gateway/checkFeasibility.js +0 -25
  119. package/api_gateway/checkFireWallBlocking.js +0 -17
  120. package/api_gateway/genReq.js +0 -214
  121. package/api_gateway/index.js +0 -325
  122. package/endpoints/index.js +0 -7
  123. package/globalConfig.js +0 -12
  124. package/index.js +0 -69
  125. package/lazyLoad/downloadFilesUtil.js +0 -122
  126. package/lazyLoad/downloadLoadedJsUtil.js +0 -54
  127. package/lazyLoad/globals.js +0 -15
  128. package/lazyLoad/index.js +0 -167
  129. package/lazyLoad/next_js/next_GetJSScript.js +0 -99
  130. package/lazyLoad/next_js/next_GetLazyResources.js +0 -201
  131. package/lazyLoad/next_js/next_SubsequentRequests.js +0 -138
  132. package/lazyLoad/nuxt_js/nuxt_astParse.js +0 -194
  133. package/lazyLoad/nuxt_js/nuxt_getFromPageSource.js +0 -77
  134. package/lazyLoad/nuxt_js/nuxt_stringAnalysisJSFiles.js +0 -99
  135. package/research/firewall_bypass.md +0 -38
  136. package/research/next_js.md +0 -116
  137. package/research/nuxt_js.md +0 -125
  138. package/research/vue_js.md +0 -9
  139. package/strings/index.js +0 -145
  140. package/techDetect/index.js +0 -156
  141. package/utility/globals.js +0 -6
  142. package/utility/makeReq.js +0 -179
  143. package/utility/resolvePath.js +0 -43
@@ -0,0 +1,202 @@
1
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
+ return new (P || (P = Promise))(function (resolve, reject) {
4
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
8
+ });
9
+ };
10
+ import chalk from "chalk";
11
+ import puppeteer from "puppeteer";
12
+ import parser from "@babel/parser";
13
+ import _traverse from "@babel/traverse";
14
+ const traverse = _traverse.default;
15
+ import inquirer from "inquirer";
16
+ import CONFIG from "../../globalConfig.js";
17
+ import makeRequest from "../../utility/makeReq.js";
18
+ import execFunc from "../../utility/runSandboxed.js";
19
+ import { getJsonUrls, getJsUrls, pushToJsonUrls, pushToJsUrls, } from "../globals.js"; // Import js_urls functions
20
+ import * as globals from "../../utility/globals.js";
21
+ /**
22
+ * Asynchronously fetches the given URL and extracts JavaScript file URLs
23
+ * from webpack's require.ensure() function.
24
+ *
25
+ * @param {string} url - The URL of the webpage to fetch and parse.
26
+ * @returns {Promise<string[]|undefined>} - A promise that resolves to an array of
27
+ * absolute URLs pointing to JavaScript files found in require.ensure()
28
+ * functions, or undefined if no webpack JS is found.
29
+ */
30
+ const next_getLazyResources = (url) => __awaiter(void 0, void 0, void 0, function* () {
31
+ const browser = yield puppeteer.launch({
32
+ headless: true,
33
+ });
34
+ const page = yield browser.newPage();
35
+ yield page.setRequestInterception(true);
36
+ page.on("request", (request) => __awaiter(void 0, void 0, void 0, function* () {
37
+ // get the request url
38
+ const req_url = request.url(); // Renamed to avoid conflict with outer 'url'
39
+ // see if the request is a JS file, and is a get request
40
+ if (request.method() === "GET" &&
41
+ req_url.match(/https?:\/\/[a-z\._\-]+\/.+\.js\??.*/)) {
42
+ if (!getJsUrls().includes(req_url)) {
43
+ pushToJsUrls(req_url);
44
+ }
45
+ }
46
+ // check if the request is a JSON file with a get request
47
+ if (request.method() === "GET" &&
48
+ req_url.match(/https?:\/\/[\d\w\.\-]+\/.+\.json\??.*$/)) {
49
+ if (!getJsonUrls().includes(req_url)) {
50
+ pushToJsonUrls(req_url);
51
+ }
52
+ }
53
+ yield request.continue();
54
+ }));
55
+ try {
56
+ yield page.goto(url, { waitUntil: "networkidle0" });
57
+ }
58
+ catch (err) {
59
+ console.log(chalk.yellow("[!] Timeout reached for page load. Continuing with the current state"));
60
+ }
61
+ yield browser.close();
62
+ let webpack_js = "";
63
+ // iterate through JS files
64
+ for (const js_url of getJsUrls()) {
65
+ // match for webpack js file
66
+ if (js_url.match(/\/webpack.*\.js/)) {
67
+ console.log(chalk.green(`[✓] Found webpack JS file at ${js_url}`));
68
+ webpack_js = js_url;
69
+ }
70
+ }
71
+ if (!webpack_js) {
72
+ console.log(chalk.red("[!] No webpack JS file found"));
73
+ console.log(chalk.magenta(CONFIG.notFoundMessage));
74
+ return; // Return undefined as per JSDoc
75
+ }
76
+ // parse the webpack JS file
77
+ const res = yield makeRequest(webpack_js, {});
78
+ const webpack_js_source = yield res.text();
79
+ // parse it with @babel/*
80
+ const ast = parser.parse(webpack_js_source, {
81
+ sourceType: "unambiguous",
82
+ plugins: ["jsx", "typescript"],
83
+ });
84
+ let functions = [];
85
+ traverse(ast, {
86
+ FunctionDeclaration(path) {
87
+ var _a;
88
+ functions.push({
89
+ name: ((_a = path.node.id) === null || _a === void 0 ? void 0 : _a.name) || "(anonymous)",
90
+ type: "FunctionDeclaration",
91
+ source: webpack_js_source.slice(path.node.start, path.node.end),
92
+ });
93
+ },
94
+ FunctionExpression(path) {
95
+ var _a;
96
+ functions.push({
97
+ name: ((_a = path.parent.id) === null || _a === void 0 ? void 0 : _a.name) || "(anonymous)",
98
+ type: "FunctionExpression",
99
+ source: webpack_js_source.slice(path.node.start, path.node.end),
100
+ });
101
+ },
102
+ ArrowFunctionExpression(path) {
103
+ var _a;
104
+ functions.push({
105
+ name: ((_a = path.parent.id) === null || _a === void 0 ? void 0 : _a.name) || "(anonymous)",
106
+ type: "ArrowFunctionExpression",
107
+ source: webpack_js_source.slice(path.node.start, path.node.end),
108
+ });
109
+ },
110
+ ObjectMethod(path) {
111
+ functions.push({
112
+ name: path.node.key.name,
113
+ type: "ObjectMethod",
114
+ source: webpack_js_source.slice(path.node.start, path.node.end),
115
+ });
116
+ },
117
+ ClassMethod(path) {
118
+ functions.push({
119
+ name: path.node.key.name,
120
+ type: "ClassMethod",
121
+ source: webpack_js_source.slice(path.node.start, path.node.end),
122
+ });
123
+ },
124
+ });
125
+ let user_verified = false;
126
+ // method 1
127
+ // iterate through the functions, and find out which one ends with `".js"`
128
+ let final_Func;
129
+ for (const func of functions) {
130
+ if (func.source.match(/"\.js".{0,15}$/)) {
131
+ console.log(chalk.green(`[✓] Found JS chunk having the following source`));
132
+ console.log(chalk.yellow(func.source));
133
+ final_Func = func.source;
134
+ }
135
+ }
136
+ if (!final_Func) {
137
+ // Added check if final_Func was not found
138
+ console.log(chalk.red("[!] No suitable function found in webpack JS for lazy loading."));
139
+ return [];
140
+ }
141
+ // ask through input if this is the right thing
142
+ if (!globals.getYes()) {
143
+ const askCorrectFuncConfirmation = () => __awaiter(void 0, void 0, void 0, function* () {
144
+ const { confirmed } = yield inquirer.prompt([
145
+ {
146
+ type: "confirm",
147
+ name: "confirmed",
148
+ message: "Is this the correct function?",
149
+ default: true,
150
+ },
151
+ ]);
152
+ return confirmed;
153
+ });
154
+ user_verified = yield askCorrectFuncConfirmation();
155
+ if (user_verified === true) {
156
+ console.log(chalk.cyan("[i] Proceeding with the selected function to fetch files"));
157
+ }
158
+ else {
159
+ console.log(chalk.red("[!] Not executing function."));
160
+ return [];
161
+ }
162
+ }
163
+ const urlBuilderFunc = `(() => (${final_Func}))()`;
164
+ let js_paths = [];
165
+ try {
166
+ // rather than fuzzing, grep the integers from the func code
167
+ const integers = final_Func.match(/\d+/g);
168
+ if (integers) {
169
+ // Check if integers were found
170
+ // iterate through all integers, and get the output
171
+ for (const i of integers) {
172
+ const output = execFunc(urlBuilderFunc, parseInt(i));
173
+ if (output.includes("undefined")) {
174
+ continue;
175
+ }
176
+ else {
177
+ js_paths.push(output);
178
+ }
179
+ }
180
+ }
181
+ }
182
+ catch (err) {
183
+ console.error("Unsafe or invalid code:", err.message);
184
+ return [];
185
+ }
186
+ if (js_paths.length > 0) {
187
+ console.log(chalk.green(`[✓] Found ${js_paths.length} JS chunks`));
188
+ }
189
+ // build final URL
190
+ let final_urls = [];
191
+ for (let i = 0; i < js_paths.length; i++) {
192
+ // get the directory of webpack file
193
+ const webpack_dir = webpack_js.split("/").slice(0, -1).join("/");
194
+ // replace the filename from the js path
195
+ const js_path_dir = js_paths[i].replace(/\/[a-zA-Z0-9\.]+\.js.*$/, "");
196
+ const final_url = webpack_dir.replace(js_path_dir, js_paths[i]);
197
+ final_urls.push(final_url);
198
+ }
199
+ return final_urls;
200
+ });
201
+ export default next_getLazyResources;
202
+ //# sourceMappingURL=next_GetLazyResources.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"next_GetLazyResources.js","sourceRoot":"","sources":["../../../src/lazyLoad/next_js/next_GetLazyResources.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,120 @@
1
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
+ return new (P || (P = Promise))(function (resolve, reject) {
4
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
8
+ });
9
+ };
10
+ import chalk from "chalk";
11
+ import fs from "fs";
12
+ import path from "path";
13
+ import { getURLDirectory } from "../../utility/urlUtils.js";
14
+ // custom request module
15
+ import makeRequest from "../../utility/makeReq.js";
16
+ let queue = 0;
17
+ let max_queue;
18
+ /**
19
+ * Given a string of JS content, it finds all the static files used in the
20
+ * file, and returns them as an array.
21
+ *
22
+ * @param {string} js_content - The string of JS content to search through.
23
+ *
24
+ * @returns {string[]} An array of strings, each string being a static file
25
+ * path.
26
+ */
27
+ const findStaticFiles = (js_content) => __awaiter(void 0, void 0, void 0, function* () {
28
+ // do some regex-ing
29
+ const matches = [
30
+ ...js_content.matchAll(/\/?static\/chunks\/[a-zA-Z0-9\._\-\/]+\.js/g),
31
+ ];
32
+ // return matches
33
+ let toReturn = [];
34
+ for (const match of matches) {
35
+ toReturn.push(match[0]);
36
+ }
37
+ return toReturn;
38
+ });
39
+ const getURLDirectoryServer = (urlString) => {
40
+ const url = new URL(urlString);
41
+ const pathParts = url.pathname.split("/").filter(Boolean); // ['business', 'api']
42
+ pathParts.pop(); // Remove 'api'
43
+ const newPath = "/" + pathParts.join("/"); // '/business'
44
+ return `${url.origin}${newPath}`; // 'http://something.com/business'
45
+ };
46
+ const subsequentRequests = (url, urlsFile, threads, output, js_urls) => __awaiter(void 0, void 0, void 0, function* () {
47
+ max_queue = threads;
48
+ let staticJSURLs = [];
49
+ console.log(chalk.cyan(`[i] Fetching JS files from subsequent requests`));
50
+ // open the urls file, and load the paths (JSON)
51
+ if (!fs.existsSync(urlsFile)) {
52
+ console.log(chalk.red(`[!] URLs file ${urlsFile} does not exist`));
53
+ console.log(chalk.yellow(`[!] Please run strings module first with -e flag`));
54
+ console.log(chalk.yellow(`[!] Example: js-recon strings -d <directory> -e`));
55
+ process.exit(1);
56
+ }
57
+ const endpoints = JSON.parse(fs.readFileSync(urlsFile, "utf8")).paths;
58
+ let js_contents = {};
59
+ // make requests to all of them with the special header
60
+ const reqPromises = endpoints.map((endpoint) => __awaiter(void 0, void 0, void 0, function* () {
61
+ const reqUrl = new URL(endpoint, url).href;
62
+ try {
63
+ // delay in case over the thread count
64
+ while (queue >= max_queue) {
65
+ yield new Promise((resolve) => setTimeout(resolve, 100));
66
+ }
67
+ queue++;
68
+ const res = yield makeRequest(reqUrl, {
69
+ headers: {
70
+ RSC: "1",
71
+ },
72
+ });
73
+ if (res &&
74
+ res.status === 200 &&
75
+ res.headers.get("content-type").includes("text/x-component")) {
76
+ const text = yield res.text();
77
+ js_contents[endpoint] = text;
78
+ const { host, directory } = getURLDirectory(reqUrl);
79
+ // save the contents to "___subsequent_requests/"
80
+ // make the subsequent_requests directory if it doesn't exist
81
+ const output_path = path.join(output, host, "___subsequent_requests", directory);
82
+ if (!fs.existsSync(output_path)) {
83
+ fs.mkdirSync(output_path, { recursive: true });
84
+ }
85
+ fs.writeFileSync(path.join(output_path, "index.js"), text);
86
+ // find the static ones from the JS resp
87
+ const staticFiles = yield findStaticFiles(text);
88
+ // go through each file and get the absolute path of those
89
+ const absolutePaths = staticFiles.map((file) => {
90
+ // go through existing JS URLs found
91
+ let js_path_dir;
92
+ for (const js_url of js_urls) {
93
+ if (!js_path_dir &&
94
+ new URL(js_url).host === new URL(url).host &&
95
+ new URL(js_url).pathname.includes("static/chunks/")) {
96
+ js_path_dir = js_url.replace(/\/[^\/]+\.js.*$/, "");
97
+ }
98
+ }
99
+ return js_path_dir.replace("static/chunks", "") + file;
100
+ });
101
+ // Filter out paths that are already in js_urls before pushing to staticJSURLs
102
+ const newPaths = absolutePaths.filter((path) => !js_urls.includes(path));
103
+ if (newPaths.length > 0) {
104
+ staticJSURLs.push(...newPaths);
105
+ }
106
+ }
107
+ queue--;
108
+ }
109
+ catch (e) {
110
+ queue--;
111
+ console.log(chalk.red(`[!] Error fetching ${reqUrl}: ${e}`));
112
+ }
113
+ }));
114
+ yield Promise.all(reqPromises);
115
+ staticJSURLs = [...new Set(staticJSURLs)];
116
+ console.log(chalk.green(`[✓] Found ${staticJSURLs.length} JS chunks from subsequent requests`));
117
+ return staticJSURLs;
118
+ });
119
+ export default subsequentRequests;
120
+ //# sourceMappingURL=next_SubsequentRequests.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"next_SubsequentRequests.js","sourceRoot":"","sources":["../../../src/lazyLoad/next_js/next_SubsequentRequests.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,188 @@
1
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
+ return new (P || (P = Promise))(function (resolve, reject) {
4
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
8
+ });
9
+ };
10
+ import parser from "@babel/parser";
11
+ import _traverse from "@babel/traverse";
12
+ const traverse = _traverse.default;
13
+ import execFunc from "../../utility/runSandboxed.js";
14
+ import makeRequest from "../../utility/makeReq.js";
15
+ import chalk from "chalk";
16
+ import inquirer from "inquirer";
17
+ import t from "@babel/types";
18
+ import resolvePath from "../../utility/resolvePath.js";
19
+ import * as globals from "../../utility/globals.js";
20
+ const nuxt_astParse = (url) => __awaiter(void 0, void 0, void 0, function* () {
21
+ let filesFound = [];
22
+ const resp = yield makeRequest(url, {});
23
+ const body = yield resp.text();
24
+ let ast;
25
+ try {
26
+ ast = parser.parse(body, {
27
+ sourceType: "module",
28
+ plugins: ["jsx", "typescript"],
29
+ });
30
+ }
31
+ catch (error) {
32
+ console.log(chalk.red("[!] Error parsing JS file: ", url));
33
+ return filesFound;
34
+ }
35
+ let functions = [];
36
+ traverse(ast, {
37
+ FunctionDeclaration(path) {
38
+ var _a;
39
+ functions.push({
40
+ name: ((_a = path.node.id) === null || _a === void 0 ? void 0 : _a.name) || "(anonymous)",
41
+ type: "FunctionDeclaration",
42
+ source: body.slice(path.node.start, path.node.end),
43
+ });
44
+ },
45
+ FunctionExpression(path) {
46
+ var _a;
47
+ functions.push({
48
+ name: ((_a = path.parent.id) === null || _a === void 0 ? void 0 : _a.name) || "(anonymous)",
49
+ type: "FunctionExpression",
50
+ source: body.slice(path.node.start, path.node.end),
51
+ });
52
+ },
53
+ ArrowFunctionExpression(path) {
54
+ var _a;
55
+ functions.push({
56
+ name: ((_a = path.parent.id) === null || _a === void 0 ? void 0 : _a.name) || "(anonymous)",
57
+ type: "ArrowFunctionExpression",
58
+ source: body.slice(path.node.start, path.node.end),
59
+ });
60
+ },
61
+ ObjectMethod(path) {
62
+ functions.push({
63
+ name: path.node.key.name,
64
+ type: "ObjectMethod",
65
+ source: body.slice(path.node.start, path.node.end),
66
+ });
67
+ },
68
+ ClassMethod(path) {
69
+ functions.push({
70
+ name: path.node.key.name,
71
+ type: "ClassMethod",
72
+ source: body.slice(path.node.start, path.node.end),
73
+ });
74
+ },
75
+ });
76
+ // iterate through the functions, and find out the one that ends with ".js"
77
+ for (const func of functions) {
78
+ if (func.source.match(/"\.js".{0,15}$/)) {
79
+ console.log(chalk.green(`[✓] Found JS chunk having the following source:`));
80
+ console.log(chalk.yellow(func.source));
81
+ let user_verified;
82
+ if (!globals.getYes()) {
83
+ const askCorrectFuncConfirmation = () => __awaiter(void 0, void 0, void 0, function* () {
84
+ const { value } = yield inquirer.prompt([
85
+ {
86
+ type: "confirm",
87
+ name: "value",
88
+ message: "Is this the correct function?",
89
+ default: true,
90
+ },
91
+ ]);
92
+ return value;
93
+ });
94
+ user_verified = yield askCorrectFuncConfirmation();
95
+ }
96
+ else {
97
+ user_verified = true;
98
+ }
99
+ if (user_verified === true) {
100
+ console.log(chalk.cyan("[i] Proceeding with the selected function to fetch files"));
101
+ }
102
+ else {
103
+ console.log(chalk.red("[!] Not executing function."));
104
+ continue;
105
+ }
106
+ // get the value of the unknown vars
107
+ // first, get the name of the unknown function
108
+ const unknownVarAst = parser.parse(`(${func.source})`, {
109
+ sourceType: "script",
110
+ plugins: ["jsx", "typescript"],
111
+ });
112
+ let memberExpressions = [];
113
+ traverse(unknownVarAst, {
114
+ MemberExpression(path) {
115
+ // Only collect identifiers like f.p (not obj["x"])
116
+ if (t.isIdentifier(path.node.object) &&
117
+ t.isIdentifier(path.node.property) &&
118
+ !path.node.computed // ignore obj["x"]
119
+ ) {
120
+ const objName = path.node.object.name;
121
+ const propName = path.node.property.name;
122
+ memberExpressions.push(`${objName}.${propName}`);
123
+ }
124
+ },
125
+ });
126
+ const unknownVar = memberExpressions[0].split(".");
127
+ // now, resolve the value of this unknown var
128
+ let unknownVarValue;
129
+ traverse(ast, {
130
+ AssignmentExpression(path) {
131
+ const { left, right } = path.node;
132
+ if (t.isMemberExpression(left) &&
133
+ t.isIdentifier(left.object, { name: unknownVar[0] }) &&
134
+ t.isIdentifier(left.property, {
135
+ name: unknownVar[1],
136
+ }) &&
137
+ !left.computed) {
138
+ if (t.isStringLiteral(right)) {
139
+ unknownVarValue = right.value;
140
+ }
141
+ else {
142
+ // fallback to source snippet
143
+ unknownVarValue = func.source.slice(right.start, right.end);
144
+ }
145
+ }
146
+ },
147
+ });
148
+ // replace the unknown var with the value
149
+ const funcSource = func.source.replace(new RegExp(`${unknownVar[0]}.${unknownVar[1]}`), `"${unknownVarValue}"`);
150
+ // continue to executing the function with all possible numbers
151
+ const urlBuilderFunc = `(() => (${funcSource}))()`;
152
+ let js_paths = [];
153
+ try {
154
+ // rather than fuzzing, grep the integers from the func code
155
+ const integers = funcSource.match(/\d+/g);
156
+ if (integers) {
157
+ // Check if integers were found
158
+ // iterate through all integers, and get the output
159
+ for (const i of integers) {
160
+ const output = execFunc(urlBuilderFunc, parseInt(i));
161
+ if (output.includes("undefined")) {
162
+ continue;
163
+ }
164
+ else {
165
+ js_paths.push(output);
166
+ }
167
+ }
168
+ }
169
+ }
170
+ catch (error) {
171
+ console.log(chalk.red("[!] Error executing function: ", error));
172
+ }
173
+ if (js_paths.length > 0) {
174
+ // iterate through the files, and resolve them
175
+ for (const js_path of js_paths) {
176
+ const resolvedPath = yield resolvePath(url, js_path);
177
+ filesFound.push(resolvedPath);
178
+ }
179
+ }
180
+ }
181
+ }
182
+ if (filesFound.length > 0) {
183
+ console.log(chalk.green(`[✓] Found ${filesFound.length} JS chunks`));
184
+ }
185
+ return filesFound;
186
+ });
187
+ export default nuxt_astParse;
188
+ //# sourceMappingURL=nuxt_astParse.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nuxt_astParse.js","sourceRoot":"","sources":["../../../src/lazyLoad/nuxt_js/nuxt_astParse.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,75 @@
1
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
+ return new (P || (P = Promise))(function (resolve, reject) {
4
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
8
+ });
9
+ };
10
+ import chalk from "chalk";
11
+ import makeRequest from "../../utility/makeReq.js";
12
+ import { getJsUrls, pushToJsUrls } from "../globals.js";
13
+ import * as cheerio from "cheerio";
14
+ const nuxt_getFromPageSource = (url) => __awaiter(void 0, void 0, void 0, function* () {
15
+ console.log(chalk.cyan("[i] Analyzing page source"));
16
+ // get the page source
17
+ const res = yield makeRequest(url, {});
18
+ const pageSource = yield res.text();
19
+ // cheerio to parse the page source
20
+ const $ = cheerio.load(pageSource);
21
+ // find all link tags
22
+ const linkTags = $("link");
23
+ // go through them, and find the ones which have `as=script` attr
24
+ for (const linkTag of linkTags) {
25
+ const asAttr = $(linkTag).attr("as");
26
+ if (asAttr === "script") {
27
+ const hrefAttr = $(linkTag).attr("href");
28
+ if (hrefAttr) {
29
+ // see if it starts with /_nuxt
30
+ if (hrefAttr.startsWith("/_nuxt")) {
31
+ // get the URL root, and append the hrefAttr to it
32
+ const urlRoot = new URL(url).origin;
33
+ pushToJsUrls(urlRoot + hrefAttr);
34
+ }
35
+ }
36
+ }
37
+ }
38
+ // now, search all the script tags
39
+ const scriptTags = $("script");
40
+ for (const scriptTag of scriptTags) {
41
+ const src = $(scriptTag).attr("src");
42
+ if (src !== undefined &&
43
+ src.match(/(https:\/\/[a-zA-Z0-9_\_\.]+\/.+\.js\??.*|\/.+\.js\??.*)/)) {
44
+ if (src.startsWith("http")) {
45
+ if (!getJsUrls().includes(src)) {
46
+ pushToJsUrls(src);
47
+ }
48
+ }
49
+ // if the src starts with /, like `/static/js/a.js` find the absolute URL
50
+ else if (src.startsWith("/")) {
51
+ const absoluteUrl = new URL(url).origin + src;
52
+ if (!getJsUrls().includes(absoluteUrl)) {
53
+ pushToJsUrls(absoluteUrl);
54
+ }
55
+ }
56
+ else if (src.match(/^[^/]/)) {
57
+ // if the src is a relative URL, like `static/js/a.js` find the absolute URL
58
+ // Get directory URL (origin + path without filename)
59
+ const pathParts = new URL(url).pathname.split("/");
60
+ pathParts.pop(); // remove the filename from the path
61
+ const directory = new URL(url).origin + pathParts.join("/") + "/";
62
+ if (!getJsUrls().includes(directory + src)) {
63
+ pushToJsUrls(directory + src);
64
+ }
65
+ }
66
+ else {
67
+ continue;
68
+ }
69
+ }
70
+ }
71
+ console.log(chalk.green(`[✓] Found ${getJsUrls().length} JS files from the page source`));
72
+ return getJsUrls();
73
+ });
74
+ export default nuxt_getFromPageSource;
75
+ //# sourceMappingURL=nuxt_getFromPageSource.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nuxt_getFromPageSource.js","sourceRoot":"","sources":["../../../src/lazyLoad/nuxt_js/nuxt_getFromPageSource.ts"],"names":[],"mappings":"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"}