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
暂时想到这么多,等以后有其他的了再进行补充