Fix Cloudflare detection in POST requests

This commit is contained in:
ngosang 2022-07-31 16:06:28 +02:00
parent d79782bec9
commit a2345affb3

View File

@ -90,7 +90,7 @@ async function resolveChallenge(params: V1Request, session: SessionsCacheItem):
// reload the page to be sure we get the real page // reload the page to be sure we get the real page
log.debug("Reloading the page") log.debug("Reloading the page")
try { try {
response = await gotoPage(params, page); response = await gotoPage(params, page, params.method);
} catch (e) { } catch (e) {
log.warn("Page not reloaded (do not report!): Cause: " + e.toString()) log.warn("Page not reloaded (do not report!): Cause: " + e.toString())
} }
@ -132,9 +132,10 @@ async function resolveChallenge(params: V1Request, session: SessionsCacheItem):
} }
} }
async function gotoPage(params: V1Request, page: Page): Promise<HTTPResponse> { async function gotoPage(params: V1Request, page: Page, method: string = 'GET'): Promise<HTTPResponse> {
let pageTimeout = params.maxTimeout / 3; let pageTimeout = params.maxTimeout / 3;
let response: HTTPResponse let response: HTTPResponse
try { try {
response = await page.goto(params.url, {waitUntil: 'domcontentloaded', timeout: pageTimeout}); response = await page.goto(params.url, {waitUntil: 'domcontentloaded', timeout: pageTimeout});
} catch (e) { } catch (e) {
@ -142,47 +143,29 @@ async function gotoPage(params: V1Request, page: Page): Promise<HTTPResponse> {
response = await page.goto(params.url, {waitUntil: 'domcontentloaded', timeout: pageTimeout}); response = await page.goto(params.url, {waitUntil: 'domcontentloaded', timeout: pageTimeout});
} }
if (params.method == 'POST') { if (method == 'POST') {
// post hack // post hack, it only works with utf-8 encoding
await page.setContent(
`
<!DOCTYPE html>
<html>
<body>
<script>
function parseQuery(queryString) { let postForm = `<form id="hackForm" action="${params.url}" method="POST">`;
var query = {}; let queryString = params.postData;
var pairs = (queryString[0] === '?' ? queryString.substr(1) : queryString).split('&'); let pairs = (queryString[0] === '?' ? queryString.substr(1) : queryString).split('&');
for (var i = 0; i < pairs.length; i++) { for (let i = 0; i < pairs.length; i++) {
var pair = pairs[i].split('='); let pair = pairs[i].split('=');
query[decodeURIComponent(pair[0])] = decodeURIComponent(pair[1] || ''); let name; try { name = decodeURIComponent(pair[0]) } catch { name = pair[0] }
} if (name == 'submit') continue;
return query; let value; try { value = decodeURIComponent(pair[1] || '') } catch { value = pair[1] || '' }
postForm += `<input type="text" name="${name}" value="${value}"><br>`;
} }
postForm += `</form>`;
const form = document.createElement('form'); await page.setContent(`
form.method = 'POST'; <!DOCTYPE html>
form.action = '${params.url}'; <html>
<body>
const params = parseQuery('${params.postData}'); ${postForm}
for (const key in params) { <script>document.getElementById('hackForm').submit();</script>
if (params.hasOwnProperty(key)) { </body>
const hiddenField = document.createElement('input'); </html>`
hiddenField.type = 'hidden';
hiddenField.name = key;
hiddenField.value = params[key];
form.appendChild(hiddenField);
}
}
document.body.appendChild(form);
form.submit();
</script>
</body>
</html>
`
); );
await page.waitForTimeout(2000) await page.waitForTimeout(2000)
try { try {