最近看了一些文章都提到了流量镜像的问题,流量镜像的好处就是可以将我们上网的流量都记录下来,利于在黑盒渗透的时候找到不被发觉的一些问题,也可以把这些包提交到sqlmap进行自动检测。
Sqlmap作为一个神器,它留了一个接口给我们调用,然后再进行被动的注入检测,在github上搜到一个做好的的封装包,
https://github.com/OneSourceCat/sqli-proxy/blob/master/AutoSqli.py
# -*-coding:utf-8-*-
import requests
import time
import json
from threading import Thread
from models import *
class AutoSqli(Thread):
def __init__(self, server='', target='',
data='', referer='', cookie='', req_text=''):
Thread.__init__(self)
self.server = server
if self.server[-1] != '/':
self.server = self.server + '/'
self.target = target
self.taskid = ''
self.engineid = ''
self.status = ''
self.data = data
self.referer = referer
self.cookie = cookie
self.req_text = req_text
self.start_time = time.time()
def task_new(self):
self.taskid = json.loads(
requests.get(self.server + 'task/new').text)['taskid']
print 'Created new task: ' + self.taskid + "\t" + self.target
if len(self.taskid) > 0:
return True
return False
def task_delete(self):
if json.loads(requests.get(self.server + 'task/' + self.taskid + '/delete').text)['success']:
print '[%s] Deleted task' % (self.taskid)
return True
return False
def scan_start(self):
headers = {'Content-Type': 'application/json'}
payload = {
'url': self.target,
'data': self.data,
'cookie': self.cookie,
'referer': self.referer}
url = self.server + 'scan/' + self.taskid + '/start'
t = json.loads(
requests.post(url, data=json.dumps(payload), headers=headers).text)
self.engineid = t['engineid']
if len(str(self.engineid)) > 0 and t['success']:
return True
return False
def scan_status(self):
self.status = json.loads(
requests.get(self.server + 'scan/' + self.taskid + '/status').text)['status']
if self.status == 'running':
return 'running'
elif self.status == 'terminated':
return 'terminated'
else:
return 'error'
def scan_data(self):
self.data = json.loads(
requests.get(self.server + 'scan/' + self.taskid + '/data').text)['data']
if len(self.data) == 0:
print 'not injection:\t' + self.target
else:
print '=======> injection:\t' + self.target
SQLIRecords.insert(url=self.target, request_text=self.req_text).execute()
def option_set(self):
headers = {'Content-Type': 'application/json'}
option = {"options": {
"smart": True,
}
}
url = self.server + 'option/' + self.taskid + '/set'
t = json.loads(
requests.post(url, data=json.dumps(option), headers=headers).text)
def scan_stop(self):
json.loads(
requests.get(self.server + 'scan/' + self.taskid + '/stop').text)['success']
def scan_kill(self):
json.loads(
requests.get(self.server + 'scan/' + self.taskid + '/kill').text)['success']
def write_to_db(self):
pass
def run(self):
try:
if not self.task_new():
return False
self.option_set()
if not self.scan_start():
return False
while True:
if self.scan_status() == 'running':
time.sleep(10)
elif self.scan_status() == 'terminated':
break
else:
break
print self.target + ":\t" + str(time.time() - self.start_time)
if time.time() - self.start_time > 500:
error = True
self.scan_stop()
self.scan_kill()
break
self.scan_data()
self.task_delete()
print self.target + ":\t" + str(time.time() - self.start_time)
except Exception, e:
print e
# if __name__ == '__main__':
# t = AutoSqli('http://127.0.0.1:8775', 'http://www.zxssyxx.com/read.asp?id=2471')
# t.run()
我们可以找一个有注入的站点来测试一下,看看效果。
打开sqlmapapi,Python sqlmapapi.py -s
其实整个流程就是
get请求创建任务,获取到任务id
get请求特定的任务id设置参数
post请求特定的任务id开始扫描指定url
get请求特定的任务id获取状态
get请求特定的任务id获取测试结果
get请求特定的任务id删除任务
所以我们所要做的就是提交一些数据包到这个类中,而这时候就可以通过镜像流量获取到这些流量包,获取镜像流量我是找了猪猪侠大牛做好的一个轮子,我觉得是比较稳定。
https://github.com/ring04h/wyproxy2
这个我测试抓https包都比较稳定,python做代理出现的问题多。这个轮子是把数据包写进了库里面。所以只需把数据包从库里取出然后再提交给上面的类处理就行。
但是想做到一边上网,一边测试注入就有一个坑。数据一边进库,一边从库中取出数据就要用到一种模式:生产者和消费者模式,不断地从库中取数据,然后再提交数据。我在这过程主要是自己在库中增加一个字段,默认设置为0,然后测试了数据包为1,这样就不断地从库中取数据出来。代码都比较容易实现,我就不放出来。希望大家能有收获。
更新:
最近又进行了一些改进,把GourdScan里面的文件包含也扒了下来,然后进行二次原创,可以扫描那些文件包含的漏洞。