php bugscan,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. 插件来源

你可以上乌云,BeeBeeTo,Exploit-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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值