لینک کوتاه مطلب : https://hsgar.com/?p=3839

«مهندسی معکوس» اخبار هکر در یک API

نوشته شده توسط لوکا کر در 1 آوریل 2018

در حین ساخت هک کرد من با مشکلی مواجه شدم – API رسمی Hacker News اجازه تعامل، مانند رأی مثبت، ارسال و نظر دادن را نمی دهد. من می‌خواستم هک یک کلاینت با ویژگی‌های کامل هکر نیوز باشد، بنابراین این کار باعث قطع شدن آن نمی‌شود.

از آنجایی که این اقدامات به احتمال زیاد فقط درخواست POST به سرور Hacker News هستند، من تصمیم گرفتم درخواست های شبکه را هنگام انجام اقدامات مختلف بررسی کنم – ورود به سیستم، رأی مثبت، خروج از سیستم. فهمیدن اینکه درخواست‌ها چگونه انجام می‌شوند و چه اطلاعاتی مورد نیاز است و به آنها منتقل می‌شود، چندان سخت نبود.

ورود به سیستم را به عنوان مثال در نظر بگیرید. صفحه ورود به سیستم Hacker News بسیار ساده است، شما نام کاربری و رمز عبور خود را وارد کرده و روی “ورود” کلیک کنید. با نگاهی به درخواست شبکه که انجام می شود، می بینیم که سه پارامتر مورد نیاز است: goto، acct و pw.

تکرار این مورد برای سایر اقدامات، تنظیم مشابهی از پارامترهای عبور و ایجاد یک درخواست POST را نشان می دهد. نوشتن یک تابع برای این کار باید به اندازه کافی آسان باشد، و این کاری است که من برای هر عملی که می توانستم به آن فکر کنم انجام دادم. دوباره، اجازه دهید عمل ورود به سیستم را به عنوان مثال در نظر بگیریم. در قطعه زیر یک تابع تعریف می کنیم login که طول می کشد username و password و درخواست می کند https://news.ycombinator.com/login. یک بولی از اینکه آیا پاسخ شامل است یا خیر برگردانده می شود Bad Login (پیام خطای Hacker News نمایش داده می شود).

/**
 * Login a user
 * @param  {String} username The users username
 * @param  {String} password The users password
 * @return {Promise}         Returns a promise that
 *                           resolves true if logged in, else false
 */
const login = (username, password) => {
  const headers = new Headers({
    'Content-Type': 'application/x-www-form-urlencoded',
    'Access-Control-Allow-Origin': '*',
  });

  // config.base = https://news.ycombinator.com
  return fetch(`${config.base}/login`, {
    method: 'POST',
    headers,
    body: `acct=${username}&pw=${password}&goto=news`,
    mode: 'no-cors',
    credentials: 'include',
  })
    .then(response => response.text())
    .then(responseText => {
      // Return whether logged in
      return responseText.match(/Bad Login/i);
    });
};

export {
  login,
}

برخی از اقدامات، مانند رأی مثبت و اظهار نظر، به یک URL خاص متکی هستند که حاوی یک آدرس است auth پارامتر، که می تواند در HTML پست/نظری که به آن رأی مثبت داده شده یا روی آن نظر داده می شود، یافت می شود. نمونه ای از آن در زیر آمده است:

<a id="up_16724962" onclick="return vote(event, this, &quot;up&quot;)" href="vote?id=16724962&amp;how=up&amp;auth=4356e982da9ab9ae4f443ee80b7ede2d716834be&amp;goto=item%3Fid%3D16724962">
  <div class="votearrow" title="upvote"></div>
</a>

در این صورت می توانیم HTML صفحه را تجزیه کنیم و این را پیدا کنیم href بر اساس id از پستی که به آن رأی مثبت داده شده یا روی آن نظر داده شده است، و از آن URL درخواست کنید. این با استفاده از زیر اجرا می شود cheerio برای تجزیه HTML:

import cheerio from 'cheerio-without-node-native';

/**
 * Get the URL needed to upvote
 * @param  {String} itemId The item ID to upvote
 * @return {Promise}       Returns a promise that
 *                         resolves with the upvote URL
 */
const getUpvoteUrl = itemId =>
  fetch(`${config.base}/item?id=${itemId}`, {
    mode: 'no-cors',
    credentials: 'include',
  })
    .then(response => response.text())
    .then(responseText => {
      const document = cheerio.load(responseText);
      return document(`#up_${itemId}`).attr('href');
    });

/**
 * Upvote an item
 * @param  {String} itemId The item ID to upvote
 * @return {Promise}       Returns a promise that
 *                         resolves true if upvoted, else false
 */
const upvote = itemId =>
  getUpvoteUrl(itemId)
    .then(upvoteUrl =>
      fetch(`${config.base}/${upvoteUrl}`, {
        mode: 'no-cors',
        credentials: 'include',
      }),
    )
    .then(response => response.text())
    .then(responseText => true)
    .catch(error => false);

export {
  upvote,
}

دوباره، این روش را می توان برای اظهار نظر، لغو رأی و خروج از سیستم، در جایی که URL منحصر به فرد مورد نیاز است، تکرار کرد.

شما می توانید یک پیاده سازی کاملاً کاربردی برای این اقدامات در قسمت پیدا کنید مخزن هک شده.

لینک منبع

ارسال یک پاسخ

آدرس ایمیل شما منتشر نخواهد شد.