BugScan插件编写的一些小技巧

1. 开头定义

在编写插件的时候,一般来说我们在代码起始位置只需要写

#!/usr/bin/env python

就可以正常运行

但是,为了说明该插件的一些信息,我个人比较建议按照以下格式来书写

#!/usr/bin/env python
# -*- coding: utf-8 -*-
#__Author__ = 作者/作者ID/代号
#__Service_ = 应用范围/针对的CMS
#__Refer___ = 漏洞来源/详情
#___Type___ = 漏洞类型(注入/XSS/代码执行/路径泄露/……)
#___name___ = 漏洞名称/CVE编号/WooYun编号/其他代号/代称
'''
漏洞简要说明
'''


2. SQL注入和XSS

通常SQL注入的验证时是使用MD5(123)然后看返回当中是否存在MD5值这种 我们经常可以看到很多使用正则去匹配的情况,写插件者想正则想破脑袋,看插件的理解正则也想破脑袋
于人于己都不便
所以我们在保证功能不变的情况下可以稍微做改动 让代码可读性更高,执行效率也稍好点
先举个例子

#!/usr/bin/env python
b = "abcdefghijk"
c = "abc" in b
d = "xyz" in b
print c
print d


返回为

TrueFalse

c的值为True,d的值为False,都为布尔变量
所以str in str可以作为条件判断

#!/usr/bin/env python
b = "abcdefghijk"
if "abc" in b :
    print "OK"

所以我们可以吧一些比如注入验证,XSS验证等等的验证方式由正则改为if判断

#!/usr/bin/env python
# -*- coding: utf-8 -*-
def audit(arg):
    page = arg + 'readnes.php'
    payload = "?id=1 and 123=321 union select 1,md5(123),3,4,5"
    url = page + payload
    code, head, res, _, _ = curl.curl('%s' % url)
    if code == 200 and '202cb962ac59075b964b07152d234b70' in res: 
    #并列条件判断,用and
      security_hole(verify_url)

3. 正则使用

在不得不使用正则去匹配的时候,例如绝对路径泄露,匹配绝对路径的时候等等,那只好使用正则了

4. 注入验证

联合注入不能去读账号密码,直接打印MD5值验证是否存在注入 通常情况下不能出现特有的表名,防止漏报 在注入验证的时候,可以不要from xxx,例如

#!/usr/bin/env python
def audit(arg):
    page = arg + 'readnes.php'
    payload1 = "?id=1 and 11=22 union select 1,md5(123),3,4,5 from admin"
    payload2 = "?id=1 and 11=22 union select 1,md5(123),3,4,5"
    # payload 1 和payload 2 的实际效果是一样的,但是from限定了表
    # 这样相当于多了一次表的查询,对对方资源算是一种浪费,不建议

XSS直接在res里str in str就行

5. 组合判断

在判断的时候尽量使用组合判断,经常可以看到

#!/usr/bin/env python
if code == 200:
    if '202cb962ac59075b964b07152d234b70' in res:
        security_hole(verify_url)

这样书写的话代码可读性很低,在功能一致的原则下我们可以改为

#!/usr/bin/env python
if code == 200 and '202cb962ac59075b964b07152d234b70' in res:
    security_hole(verify_url)

可以很清晰的看到整个判断,一步达成,没有那么多的if嵌套
保持功能不变的情况下提高可代码的可读性和执行效率

6. 变量定义

对变量能不进行新的定义就别定义,例如

#!/usr/bin/env python
url = arg

这就是完全没有必要的一步,完全可以写成

#!/usr/bin/env python
payload= "readnews.php?id=1 and 1=2 union select 1,md5(1),3,4"
url= arg + payload


能用一步达成的事情坚决不做无用功

7. 缩进问题

缩进尽量使用4个space
如果使用sublime text编辑器的话可以安装Python PEP8 Autoformat来格式化代码 
安装完成之后设置语法着色为python,然后使用Ctrl+Alt+R快捷键来格式化代码

8. 多个payload问题

使用元组来吧多个payloads放到一起,提交到一个插件,减少审核人员的工作量
例如

payloads = (
            "payload1",
            "payload2",
            "payload3",
            "payload4",
            "payload5",
            )
for payload in payloads:
    url = arg + payload
    code, head, res, errcode, _ = curl.curl('"%s"' % url)
    if code == 200 and "str" in res:
        security_hole(url)

9. 单双引号问题

经常会遇到单双引号问题造成的curl不能使用等,可以采用格式化输入来避免这个事情
url post cookie的数据中如果有单引号、双引号、空格字符需要转义 * 单引号 %27 * 双引号 %22 * * 空格 %20 有一部分插件中使用这种方法,虽然可以成功执行,但是不推荐
因为代码可读性降低了,烧脑

code, head, res, errcode, _ = curl.curl("\""+url+"\"")

可以改成格式化输入的

code, head, res, errcode, _ = curl.curl('"%s"' % url)

10. 插件标题

标题请尽量简单扼要的说明插件的用途
比如:DeDeCMS search.php SQL-Injection
不要只写一个CMS的名称,对反查插件内容和作用会造成不便

11. service名称

service名称请全部使用小写
例如DeDecCMS,虽然官方是这么写的,但是在我们定义的时候是全部使用小写的 dedecms

#!/usr/bin/env python
# -*- coding: utf-8 -*-
#__author__ = 'xxxxx'

def assign(service, arg):
    if service == "service_type":  # 这里是小写
        return True, arg

def audit(arg):
        # code
        # code
        # code

if __name__ == '__main__':
    from dummy import *
    audit(assign('service_type', 'http://www.example.com/')[1])
    # 这里也是小写

12. 插件重新修改

插件修改完成之后请将标题上已标注的【未通过】删除掉,方便审核人员区分

13. 插件来源

你可以上乌云BeeBeeToExploit-DB补天等漏洞提交平台去寻找最新的漏洞
也可以吧目前插件中存在不符合SDK的的插件使用标准的SDK重新编写

14. 服务类型(service)

可以在https://www.bugscan.net/#!/n/7查到所有web程序的service名
除此之外还有ip,www,rdp,mysql,vnc,ftp,smtp,mssql
www的使用错误,当service是www时,所有url包括目录和连接都是www,请谨慎使用www
服务类型应当全部使用小写

def assign(service, arg):
    if service == "wordrpess":  # 1. service字符串
        return True, arg

暂时想到这么多,等以后有其他的了再进行补充


转载于:https://my.oschina.net/rookier/blog/395180

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值