批量挖SRC漏洞的一种打开方式 阅读原文»*本文原创作者:Aderduo,本文属FreeBuf原创奖励计划,未经许可禁止转载
混迹在各大SRC平台的白帽子手里都握着很多法宝,或私藏或公开。而给大家介绍下基于cms的漏洞扫描,如何挖漏洞。
一、绪论
1.1 首先获取补天厂商名单,这里保存在d:/butian.txt。你也可以放入各大src的域名
1.2 本cms是基于知道创宇的pocbuite二次开发。漏洞扫描器主要是扫描平台的整体框架设计,而真正需要耗时和长期维护的便是poc的编写与扩充。这里,重点在于poc的编写与扩充。
1.3 编写poc并批量扫描网站,将存在漏洞网站提交漏洞给相应厂商
二、系统设计
2.1 系统体系结构设计
本系统是基于CMS的漏洞扫描工具,确切来说是使用python作为脚本语言,使用PoC 编写的 SDK,自动化的调用测试,将payload按照一定格式写成py文件,并注册为类,为工具调用。支持验证与利用两种插件模式,你可以指定单个目标或者从文件导入多个目标,使用单个 PoC 或者 PoC 集合进行漏洞的验证或利用。可以使用命令行模式进行调用,也支持类似 Metaspolit 的交互模式进行处理,除此之外,还包含了一些基本的如输出结果报告等功能。本文采用pocsuite这一poc开发框架,主要使用乌云作为漏洞获取平台,在实际批量扫描的过程中用多线程、锁、队列来实现,扫描结果直接写入doc文件,在采集漏洞信息编写payload文件要选择尽可能详细的内容,包括漏洞名称,漏洞编号,漏洞来源,漏洞发布时间,漏洞厂商,漏洞CMS类型,漏洞版本,漏洞编写人,漏洞编写时间,漏洞详情,漏洞修复方案,漏洞类型,漏洞原理等等。这样方便以后对此漏洞的查阅修改以及漏洞结果更为自动人性化输出。本系统运行流程图,如图 2-1所示:
图 2-1 系统运行流程图
2.2 详细功能模块设计
2.2.1 基础扫描框架功能设计
本系统采用pocsuite作为poc开发框架,在此基础上修改代码使更适合本系统设计目标,并编写漏洞payload文件使增加丰富系统漏洞扫描,即可执行命令启动程序运行。这边对他进行改动如下:
(1)payload文件格式,增加漏洞修复、漏洞描述、漏洞等级等内容。
(2)漏洞结果生成。这边改动为,生成随机文件夹里面每个url每个payload文件生成一个doc文件,文件名格式[网站域名].doc,文件内容使用python的库docx来生成doc格式的文件。
2.2.2 漏洞类型功能设计
CMS漏洞类型较多,常见的有:命令执行,SQL注入,XSS攻击,逻辑漏洞,越权操作,文件上传,文件读取等等。这些漏洞类型又可以继续往下细分。在实际编写时,要根据具体情况,编写payload文件,不是每种漏洞都可以编写payload文件进行批量扫描。需要在CMS漏洞类型的确认上下功夫,接下来会拿SQL注入和XSS来做分析。
1.SQL注入漏洞
包括布尔型注入,报错型注入,可联合查询注入,可多语句查询注入,基于时间延迟注入五种,其中布尔型注入在编写POC的时候是不能编写到工具中的。我们判断是否存在注入只能通过构造特殊语句发送请求,返回页面是否正常。正常页面和错误页面的不同因网站源码设计而不同,无法写出通用规则。基于时间延迟注入编写出的POC是基于两个不同的请求判断响应时间,如果第一个请求<=1秒,第二个请求>=5秒,算漏洞存在[10]。由于网络原因请求时间会有延迟,导致恰好满足漏洞存在条件批量扫描时候显示漏洞存在,实则属于误报。这样每次批量扫描之后还需要手工验证漏洞是否存在,那么这种漏洞就没必要加进来。所以,在选择SQL注入的时候,避开这两种类型。规范如图 3-2 所示:
图3-2 编写SQL注入POC流程图
2.XSS攻击
如果网站仅仅能弹出框,并不能在页面源码上造成可识别的影响,我们在编写利用脚本的时候无法准确判断是否存在漏洞。除非对网页造成影响,通过一些唯一特定,可以确定就是这种CMS类型。比如DEDECMS 5.7的/images/swfupload/swfupload.swf文件中的参数movieName没有经过有效过滤,且影响的是swf文件,导致跨站脚本漏洞。我们在利用时候只能弹出框,尚不能编写出具有唯一标识的payload。payload编写为/images/swfupload/swfupload.swf?movieName=%22]%29}catch%28e%29{if%28!window.x%29{window.x=1;alert%28%22xss%22%29}}//。页面未造成影响不能继续深入,只好作罢。
综上,实际操作时候要像计划靠拢,由于场景不同导致可能与计划有一定偏差。
2.2.3 系统运行设计
CMS漏洞扫描工具是通过输入不同的命令来控制不同的扫描方式。输入命令将程序运行,然后输出一些界面信息比如什么工具、什么版本、当前运行时间之类表示程序已经启动,接着是,开启线程调用注册过的POC类,批量扫描,扫描过程界面上会实时显示扫描的网站信息,最后扫描结束,生成报告日志。系统运行流程如图 3-3 所示:
图2-2-3 系统运行流程图
三、系统实现
3.1 系统整体模块实现
工具需要最基本核心的是基本框架的实现,只需要把重心放在基本框架上对于多线程的写入提高了系统运行效率,其他就是源源不断的整合CMS漏洞,写出的payload只需要按照一定格式写进入就可以使整个工具跑起来,不需要把精力放在如何跑起来这种重复的工作上。程序运行起来的过程是:启动入口文件pocbase.py,调用pocbase/pocbase_cli.py里main(),接着调用pcsInit()将程序启动起来。目录结构如表 3-1 所示:
表3-1 目录结构表,其中pocbase文件夹里面是让程序运行起来的文件函数以及第三方库,目录结构如下:
├── docs #说明文档
├── POCAPI.md #POC编写规范及相关API
├── pocsuite #pocsuite主程序
│ ├── data #基础数据
│ ├── lib
│ │ ├──controller
│ │ ├──core #核心组件
│ │ ├──parse #参数处理封装
│ │ ├──request #网络请求封装
│ │ └──utils #常用工具包
│ ├── modules
│ │ └──tmp #临时目录
│ ├── pcs-attack.py #攻击程序
│ ├── pcs-console.py #控制台程序
│ ├── pcs-verify.py #验证程序
│ ├── pocsuite.py #pocsuite主入口程序
│ ├── tests #测试poc目录
│ └── thirdparty #第三方库
└── README.md
Test文件夹是编写的CMS漏洞的payload文件。包含haha,time_sql_inj两个子文件夹。haha文件夹里的payload文件是验证成功率100%,完全不用人工参与,输出数据完全正确可信。time-sql-inj是时间盲注,也就是由于网络原因可能造成误差的payload文件,我们无法消除,只能通过二次运行来确认漏洞是否存在。
haha文件夹内容根据漏洞类型化为为不同的文件夹存储。由上而下分别是:代码执行漏洞,设计漏洞,文件下载漏洞,文件读取漏洞,文件上传漏洞,信息泄露,OpenSSL,解析漏洞,SQL注入漏洞,URL重定向漏洞,XSS攻击漏洞。
haha文件夹如图 3-1-1 所示:
图3-1-1 haha文件夹目录结构图
这些文件夹里面是关于所有相同漏洞类型可以是不同CMS的payload文件。拿SQL_Inject来说里面包含的CMS类型有:
AspCMS,DedeCMS,eYou,FangWei,OhHu,PHPCMS,QiboCMS,searun,ShopBuilder,Siteserver,V5shop,Vallery,YongYou,YuCheng,ZhengFang,ZuiTu等。如图 3-1-2 所示:
图 3-1-2 SQL_Inject文件夹目录结构图
3.2 基础扫描框架模块
扫描结束生成报告文件,我这边设计的是生成doc文件,利用Python库docx里面的Document来制定通用doc生成规则。Kb.results里面存放的是验证结果的数据部分,对它进行循环取各部分值插入到doc文件相应位置。
3.3 Payload文件编写模块
3.3.1 编撰payload文件通用规则
本模块实现了在批量的同时,有一些站为了防机器人,需要看你有没有 HTTP 请求头的,比如有一些 WAF 会检测请求中是否有 User-Agent, 所以 PoC 中需要 Cookie 。
代码整体结构:

最上面是引入一些类库,中部是一个 PoC 的类,继承自PoCBase 类,类中有两个函数,_verify和_attack ,这两个分别是 verify 和 attack模式的入口函数,然后还有一个用户自己定义的函数parse_result , 用于统一输出。类里的变量是对漏洞描述的详细介绍,由上而下为:漏洞id,工具版本,漏洞编写者,漏洞发布时间,漏洞写入工具时间,漏洞文件最近更新时间,漏洞来源,漏洞名称,CMS链接,CMS名称,CMS版本,漏洞类型所属文件,漏洞类型,漏洞原理,漏洞修复,漏洞危害级别,漏洞详情描述。有了这些变量在漏洞扫描结束这些信息会选择性的写入漏洞结果的doc文件。
其中,pocbase/lib/poc_base.py文件是写一些编写payload文件常用到的函数。

3.3.2 编撰pa
Inndy的Hack Game攻略(WEB篇) 阅读原文»先推荐一个很有意思适合初学者的CTF练习网站,网上关于这套题目的攻略很少,并且不全,那么就自己写一个攻略。
上面是题目的分数和每个题解出的人数,可以看到题目的难度情况。
网站没有登录认证,先给自己起个复杂点不会重名的名字,就可以累积分数,然后开始答题。
按照作者Inndy的要求,只提供解题思路,不贴flag。
Do NOT share flag, it’s boring.
Let’s go!
## WEB题
### Task 12 hide and seek
WEB的10分送分题,已经提示了flag的格式是
flag{...}
查看源代码
搜索flag{,然后就可以找到flag
### Task 13 guestbook
标准的sql注入,并且提示sqlmap是你的好朋友
那么没有道理不让好朋友出场的
跑下来找到flag表,dump出flag
### Task 14 LFI
这道题考的是文件包含漏洞
提示的解题思路是使用php封装协议
题目里面还有一个登录页面,提示里面也关照了是干扰项,可以忽略
查看source code发现有一个flag文件,使用php封装协议去读
php://filter/read=convert.base64-encode/resource=pages/flag
然后解md5,发现里面还require了一个config.php
Can you read the flag<?php require(‘config.php’); ?>?
再使用php封装协议去读取这个config文件,成功get到flag
### Task 15 homepage
这道题好坑,坑点太多,无力吐槽^~^
找了半天,最后找到一个cute.js,打开发现里面是乱码,改变编码,转成unicode,发现是一堆表情包,试了各种办法,最后发现是aaencode
aaencode - Encode any JavaScript program to Japanese style emoticons
然后使用网上的工具给这段js代码decode,保存成一个js,然后使用一个页面调用这个js,使用console查看输出,发现生成了一个二维码,还要扫二维码,作为安全人员,第一反应安全吗?
扫描二维码后,获取到flag。
### Task 16 ping
这道题的考点是命令注入,打开页面可以看到源代码
发现我们要使用的常用命令注入符号”;”,”|”,”&”被过滤了
试下`pwd`,发现反引号没有被过滤
发现了flag.php文件,但是又过滤了cat命令,但是还是可以使用head命令
head flag.php,又过滤了flag,只有2个文件,可以使用通配符
`head f*`
### Task 17 scoreboard
Inndy说不用扫描服务器,查看过了源代码,没有,那么会藏在哪里呢?
用burp抓个包看看吧,原来flag就藏在respone的X-Flag里。
### Task 18 login as admin 0
先贴一段源代码
调用了safe_filter过滤函数,把 ‘ 转换成了 \\’
可以使用手工注入
' or 1#
成功绕过,但是并没有得到flag
' or 1 limit 1, 1#
成功获取flag
### Task 19 login as admin 0.1
提示:"Grab the hidden flag"
题目既然是login as admin 0.1,那么肯定上一题有关联,顺着这个线索,继续找。
上面那题还可以使用sqlmap来跑,不过需要自己写一个tamper
这里该一个tamper,把unmagicquotes.py改一下,把原来宽字节注入的部分改成如下。
再跑sqlmap,登录点存在sql注入。
查表,里面有2个表,user表就是上一题的表,h1dden_f14g表就是这题的隐藏表。
成功get到flag
这道题用sqlmap跑最后的数据时候有点问题,可能是字符编码的问题,这里是用时间延迟注入跑出来的,跑了近1个小时。
这道题也可以使用手工注入,union select效率更高。
### Task 20 login as admin 1
这道注入题和前面类似,只是为了增加难度,它的安全函数过滤了更多的字符串,先上源代码。
这里过滤了空格,我们需要对注入语句做一些处理。
admin'/**/UNION/**/SELECT/**/1,version(),3,4#
登录进去就看到flag
### Task 21 login as admin 1.2
这道题提示是道盲注题,关闭了回显,并且改了tamper也不能用sqlmap跑,只好自己动手丰衣足食,自己写个盲注的脚本来跑。
这是个半自动化的脚本,需要自己去改payload,截图是最后一步的脚本。
自己写的脚本比较慢,跑了好久,并且数据库里故意把存flag的表名和字段名设置的很长,都是32个字符的字符串
最后的flag很长长长…
### Task 22 login as admin 3
源代码
这道题考的是cookie绕过
按照题目的算法,生一个admin账号,因为不知道密钥,尝试使用0,弱类型比较,更换cookie,成功绕过。
### Task 23 login as admin 4
先上源代码

可以看到逻辑不严谨,只要用户名是admin就可以显示flag
使用burp抓包,截断,获得flag
### Task 24 login as admin 6
这道题考的是strcmp函数漏洞和变量覆盖漏洞。
废话少说上源代码
测试的时候先用guest账号,再构造一个空数组做密码,成功绕过登录。
但是在使用admin账号的时候死活无法绕过,曾经一度怀疑人生了,后来突然一想,既然admin账号不对的话,那么就构造一个admin账号覆盖原来的账号。
上payload
{"users":{"admin":"test"},"username":"admin","password":{}}
也可以不利用strcmp漏洞,直接构造一个密码,用自己构造的密码登录。
{"users":{"admin":"test"},"username":"admin","password":"test"}
### Task 25 login as admin 7
还是先上源代码
这道题的考点是php的弱类型比较,随便找一个弱类型的密码,登录后成功获取flag
### Task 26 dafuq-manager 1
一开始想的比较多,还看了好长时间源代码,这道题其实很简单。
根据提示,构建一个cookie
help=me;
然后可以看到进一步提示,修改cookie试试,cookie里面有一个hidden参数
show_hidden=no
把no改成yes就可以了,再?p>阅读更多内容