Алгоритм поиска sql-inj в исходниках php сценариев

Discussion in 'Уязвимости' started by n4n0bit, 4 Nov 2006.

  1. n4n0bit

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

    Joined:
    11 Sep 2006
    Messages:
    52
    Likes Received:
    14
    Reputations:
    20
    Вот собираюсь делать так, прошу попровлять и дополнять:

    1. сбор всех имен переменных передоваемых GET/POST со всех php сценаривем
    1.1 создание хеша имя_переменной/файл
    2. сбор всех ф-ций которые фильтруют переменный используя addslashes magic_quotes_gpc str_replace
    2.1 создание хеша имя_ф-ции/файл
    3. сбор всех строк вида mysql_query($perm), где потом содержание $perm интерпалируем в значение хеша, а ключ хеша будет имя этой переменной.

    Далее сравниваем, если строка запроса (п.3) к БД содержит переменную (п.1) , делаем проверку на наличия имени ф-ции (п.2),
    если она не обнаружена - значит код потанцеально уязвим.

    На сколька этот алгоритм эффективен - я хз.

    помогайте господа.
     
  2. r0

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

    Joined:
    17 Jul 2005
    Messages:
    450
    Likes Received:
    149
    Reputations:
    147
    Нужно собирать переменные, значения которых используются в запросах к БД, хотя п1 почти этому удовлетворяет.
    Вот насчет п2 -- ты на чем пишешь? Т.е magic_quotes_gpc - это директива, а не ф-я, значение(on\off) можно получить посредством get_magic_quotes_gpc() но это опять же в php.
     
  3. EXSlim

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

    Joined:
    9 Oct 2006
    Messages:
    73
    Likes Received:
    20
    Reputations:
    18
    А почему бы не собирать запросы к БД содержащие строки $_get[], $_post[], $_cookie[] ? Это будет означать, что скрипт наверняка уязвим
     
    1 person likes this.
  4. Digimortal

    Digimortal Banned

    Joined:
    22 Aug 2006
    Messages:
    471
    Likes Received:
    248
    Reputations:
    189
    Зачем получать значение magic_quotes_gpc ? И, главное откуда его получать? Заранее ведь не известно, будет ли анализируемый скрипт работать с значением magic_quotes_gpc = 1 или 0. Просто нужно чтоб в отчете прога (скрипт?) выводила, что существует вероятность SQL-inj в случае magic_quotes_gpc=0..
    И еще: не надо забывать про cookies..
     
  5. n4n0bit

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

    Joined:
    11 Sep 2006
    Messages:
    52
    Likes Received:
    14
    Reputations:
    20
    r0cha! я делаю проверку по регеспу на ф-цию такога рода.
    Но смори не все же переменные которые есть в теле запроса доступны через GET/POST,
    поетому я проверяю сWEBдоступные переменные на наличая в БДзапросе.

    PHP:
    function un($code){
            if (
    get_magic_quotes_gpc()) {
               
    $code stripslashes($code);
            }
            return 
    $code;
    }
    EXSlim хм, такога проста почти не встречал, ну если такое есть то этот момент тоже включу.

    С кукисами чуть поже, хотяб это автоматизировать.

    ps: что еще господа?

    ps2: пишу на PERL, http://forum.antichat.ru/thread26051-nJin4.html
     
    #5 n4n0bit, 4 Nov 2006
    Last edited: 4 Nov 2006
    1 person likes this.
  6. EXSlim

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

    Joined:
    9 Oct 2006
    Messages:
    73
    Likes Received:
    20
    Reputations:
    18
    Ты прав, такая конструкция редко встречается, но ведь она зараза работает
     
  7. n4n0bit

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

    Joined:
    11 Sep 2006
    Messages:
    52
    Likes Received:
    14
    Reputations:
    20
    EXSlim гуд, уже включил., а регистр соблюдается? в $_get[], $_post[], $_cookie[] ???

    Все согласны с этим алгоритмом?
     
    #7 n4n0bit, 4 Nov 2006
    Last edited: 4 Nov 2006
  8. r0

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

    Joined:
    17 Jul 2005
    Messages:
    450
    Likes Received:
    149
    Reputations:
    147
    ну а я про что и говорю..
    да, и только $_GET[], $_POST[], $_COOKIE[]
     
    #8 r0, 4 Nov 2006
    Last edited: 4 Nov 2006
  9. guest3297

    guest3297 Banned

    Joined:
    27 Jun 2006
    Messages:
    1,246
    Likes Received:
    639
    Reputations:
    817
    когда руками баги ищу то просто...
    есть запрос к бд...
    select Name,pass from users where '.$id.'

    Вот те и иньекция...
    тоесть есть в строке есть нефильтруймый передаваемый параметр то это бага...
    как это реализовать в сканере я хз...

    еще добавь include()
     
  10. n4n0bit

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

    Joined:
    11 Sep 2006
    Messages:
    52
    Likes Received:
    14
    Reputations:
    20
    include() ета отдельная песьгя - все всем спасибо.
     
  11. darky

    darky ♠ ♦ ♣ ♥

    Joined:
    18 May 2006
    Messages:
    1,773
    Likes Received:
    825
    Reputations:
    1,418
    ну еще можно исключать переменные которые фильтруются прегматчем например... и проверять на наличие !isset'а
     
  12. SQLHACK

    SQLHACK Остались только слоны

    Joined:
    27 Sep 2006
    Messages:
    437
    Likes Received:
    372
    Reputations:
    407
    Привет!
    А как насчёт Register_Global ? :)
     
    _________________________
  13. n4n0bit

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

    Joined:
    11 Sep 2006
    Messages:
    52
    Likes Received:
    14
    Reputations:
    20
    по конкретнее..что ты имеешь тут ввиду