Looting GraphQL Endpoints for Fun and Profit

In one of the previous posts about the state of modern web applications security I mentioned GraphQL – a new technology for building APIs developed by Facebook. GraphQL is rapidly gaining popularity, more and more services switch to this technology, both web and mobile applications. Some of the GraphQL users are: GitHub, Shopify, Pintereset, HackerOne and many more. You can find many posts about GraphQL benefits and advantages over classic REST API on the internet, however there is not so much information about GraphQL security considerations. In this post I would like to elaborate on GraphQL: how it works, what the weak points are, how an attacker can abuse them, and which tools can be used.
More »

Arbitrary File Reading in Next.js < 2.4.1

Next.js is a quite popular (>13k stars on GitHub) framework for server-rendered React applications. It includes a NodeJS server which allows to render HTML pages dynamically. While digging into server’s code, a list of internal routes drew my attention:

defineRoutes () {
    const routes = {
      /* ... */
      '/_next/:path+': async (req, res, params) => {
        const p = join(__dirname, '..', 'client', ...(params.path || []))
        await this.serveStatic(req, res, p)
      },
      '/static/:path+': async (req, res, params) => {
        const p = join(this.dir, 'static', ...(params.path || []))
        await this.serveStatic(req, res, p)
      }
      /* ... */
}

As you can see you can pass arbitrary path into serveStatic() function via /_next/ and /static/ endpoints:

export function serveStatic (req, res, path) {
  return new Promise((resolve, reject) => {
    send(req, path)
    .on('directory', () => {
      // We don't allow directories to be read.
      const err = new Error('No directory access')
      err.code = 'ENOENT'
      reject(err)
    })
    .on('error', reject)
    .pipe(res)
    .on('finish', resolve)
  })
}

This function just pipes the contents of files into the output without any validation or restrictions. So, we can try to perform a path traversal:

GET /_next/../../../../../../../../../etc/passwd HTTP/1.1

And it works! However, NodeJS application servers are usually deployed behind nginx. Due to path normalization in nginx we cannot just use forward slashes and dots, nginx will return a Bad Request error code. Luckily, NodeJS server transforms backslashes into forward slashes, so we can bypass nginx validation.

GET /_next\..\..\..\..\..\..\..\..\..\etc\passwd HTTP/1.1

ZEIT, the company which develops Next.js, was very quick to respond and roll out the patch. Be sure to update to the latest version.

Database Firewall from Scratch

Slides from our talk with Denis Kolegov at PHDays 7 “Database Firewall from Scratch” (+ bonus).

Database Firewall from Scratch from Denis Kolegov

PostMessage Security in Chrome Extensions

Slides from my talk at OWASP London Meetup on the 30th of March, 2017.

Video
CRX PostMessage Scanner source code

Universal (Isomorphic) Web Applications Security

Nowadays you do not write things in jQuery. You use node.js, webpack, React, Redux, websockets, babel and a ton of other packages to help you create a basic ToDo web application. With frontend technologies developing rapidly, isomorphic (or to be correct universal) web applications are a big thing now. In a nutshell, it means that you can write the code in JavaScript which can be run both on server and client side with reusable components, validators and shared state. Lovely, isn’t it? As a frontend developer you would say that it definitely is. A security guy would argue since the approach is extremely unsafe for your data.

More »

Waf.js: How to Protect Web Applications using JavaScript

Waf.js: How to Protect Web Applications using JavaScript from Denis Kolegov

Обзор атак на клиента с помощью CSS

css-resetCSS (Cascading Style Sheets) – язык разметки для оформления внешнего вида веб-страниц, отделяющий визуальное представление от содержания. Первая спецификация формата была опубликована организацией W3C в 1996 году. Тогда CSS позволял делать самые простые вещи: покрасить блок текста цветом, оформить текст курсивом, выравнять абзац, сделать рамку. Сегодня CSS стал настолько сложным, что для него создают фреймворки (bootstrap, jQuery UI) и метаязыки (SASS, SCSS, LESS), которые позволяют упростить написание стилей с помощью увеличения уровня абстракции CSS.

Бурное развитие CSS привлекло внимание исследователей безопасности, что вылилось в ряд техник, позволяющих проводить атаки на клиента с целью украсть его персональные данные: CSRF-токены, историю посещений сайтов, списки email-контактов и т.д. Начнем обзор с классических векторов, которые еще не потеряли свою актуальность. More »

Вебинар по распознаванию ботов с помощью машинного обучения

В среду в 19:00 с моим коллегой Андреем Завгородним проводим вебинар “Распознавание активности ботов с помощью алгоритмов машинного обучения”. Ждем всех, кто интересуется машинным обучением и не только.

И да, мы все еще ищем специалистов по веб-безопасности, хакеров и тех, кому интересно не только ломать, но и защищать для исследовательской работы в проекте PT Application Firewall. Пишите на мою почту: me@raz0r.name

687474703a2f2f75706c6f61642e77696b696d656469612e6f72672f77696b6970656469612f656e2f7468756d622f612f61362f42656e6465725f526f6472696775657a2e706e672f32323070782d42656e6465725f526f6472696775657a2e706e67

Компания Positive Technologies срочно ищет веб-хакеров разной квалификации

В первую очередь нам интересен ваш практический опыт в данном направлении, а не количество строчек в резюме.

Приветствуется наличие статей в блогах и на форумах, в журнале Хакер, участие в CTF или bug-bounty программах.

Пожелания с технической стороны:

  • наличие навыков практической компрометации и защиты веб-приложений;
  • желателен опыт программирования на любом из языков: Java, C#/VB (ASP, ASP.NET), PHP, Python, Ruby (наиболее востребованы: Java, C#/VB), SQL;
  • наличие собственных разработок и исследований, в том числе и опубликованных на тематических форумах и в блогах; наличие опубликованных данных об уязвимостях, обнаруженных вами.

Задачи, которые предлагаем:

  • анализ защищенности веб-приложений и систем ДБО ведущих российских и зарубежных компаний;
  • проведение тестов на проникновение, участие в исследовательской деятельности отдела, посещение и участие в российских и международных конференциях;
  • участие в организации конференции Positive Hack Days;
  • возможность вести собственные исследования в области ИБ;
  • работа в команде признанных экспертов в ИБ.

Условия:

  • «белая» заработная плата;
  • ДМС;
  • 6 недель оплачиваемого отпуска.

Мы можем предложить работу в московском и питерском офисе компании, а так же удаленно.
Резюме/вопросы пишите на career@ptsecurity.com

Hash Length Extension in HTMLPurifier

HTMLPurifier is a PHP library that helps to protect against XSS by filtering bad HTML and only allowing harmless markup. Recently a new version of HTMLPurifier has been released that fixes a hash length extension issue that I reported some time ago.
Hash length extension is a crypto attack against algorithms based on Merkle-Damgard construction (md5, sha1, etc) that allows to inject arbitrary characters into the signed data without knowing the secret key. A typical vulnerable piece of code looks like this:

if hash(secret + value) == signature:

With hash length extension we can append our data to the “value” and generate such a new signature that will satisfy the expression above. More information on this kind of attack can be found in this great article.

One of HTMLPurifier’s filters, namely URIFilter.Munge, can rewrite links to some custom address. It has also an ability to generate signatures that will protect these links from altering. However this is done in a way prone to hash length extension:

if ($this->secretKey) $this->replace['%t'] = sha1($this->secretKey . ':' . $string);

Web applications that rely on this signature to check the links, for example in URL redirectors or before placing them in the DB, may be vulnerable (for example Invision Power Board), because arbitrary data can be appended despite unknown secret.

Now HTMLPurifier uses secure HMAC-SHA256 to generate and verify signatures. Upgrade to 3.6.0 and be safe.

Next Page »