被动扫描注入的实践

最近看了一些文章都提到了流量镜像的问题,流量镜像好处就是可以将我们上网流量都记录下来,利于在黑盒渗透的时候找到不被发觉的一些问题,也可以把这些包提交到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里面的文件包含也扒了下来,然后进行二次原创,可以扫描那些文件包含的漏洞。





发布了20 篇原创文章 · 获赞 11 · 访问量 13万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 编程工作室 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览