前言
一、组件漏洞排查
-
snyk.io https://snyk.io/vuln/search?type=any&q=fastjson -
CVE Details https://www.cvedetails.com/google-search-results.php?q=thinkphp -
seebug https://www.seebug.org/search/?keywords=thinkphp -
当然,搜索引擎语法必须拥有姓名,例如: site:www.cnvd.org.cn thinkphp
-
ThinkPHP 3 TP 3:但没说清楚是哪个子版本,tp<=3.2.3是存在注入漏洞的。一般可以通过路由报错来确定版本,或者在有源码时直接查看配置文件(可全局搜索 THINK_VERSION
)。 -
PHP 5.4 PHP 5.4:版本不高。据我所知,首先是不存在%00截断问题(在PHP 5.3.24修复),还有其它问题吗,暂时没想到——不着急,咱们继续往后走。
二、全端口扫描
全端口扫描,本来是直接命令行运行
nmap -p-
直接冲即可。不过,这一回,我还想介绍一种全端口扫描的技巧,利用环境变量, 先快速扫全端口,再有针对性地对开放端口做漏洞扫描,命令如下:
nmap -p$ports -sC -sV 10.13.38.11
三、WEB目录爆破
Spring Boot
的Actuator
未授权,就是由于/actuator/env
接口未授权访问所导致的。![图片.png](https://cdn.nlark.com/yuque/0/2020/png/166008/1604386882246-cddca7ca-8e59-4a71-9693-fe384b1a092a.png#align=left&display=inline&height=522&margin=%5Bobject%20Object%5D&name=%E5%9B%BE%E7%89%87.png&originHeight=522&originWidth=938&size=90267&status=done&style=none&width=938)
工具方面,我选用的目录爆破工具是 dirsearch + Dirbuster , 这俩都支持保存扫描结果,但我对它俩的看法是这样的:
-
dirsearch:重在快速确定重要的路径以确定问题,如actuator未授权、备份文件、api接口、常见后台等; -
Dirbuster:重在全面地爆破路径。使用40万关键词级别的medium字典,可以爆破出不少文件夹,效果还不错。
四、WEB安全内容测试
0x01 服务端自动填充密码
我在另外一台机器上访问后台,看到登录口赫然填着密码——合着在上一次成功登录后,服务端直接将账号、密码写在前端页面中了。真有你的!
再理一理逻辑:密码既然不是浏览器自动填充的,那必然就是服务端(直接将上一次成功登录的账号密码,作为默认值填充到输入框中了(也许是为了方便),妥妥的逻辑问题。另外,此处无验证码、且无防止重放的token,所以存在账号、密码可被暴力破解的风险。三分钟,两个洞,妥妥的低危小子!
0x02 XSS
<">
,观察后端是否对页面的输出进行了HTML实体转义,结果发现未对尖括号转义。下图的左边部分,可以看到,<
已经跟HTML代码”融为一体”了,>
闭合<span
标签,我们填写一个弹框的payload,<"><script>alert(/xss/)</script>
,刷新——弹框——没毛病,存储型XSS到手。Content-Type: text/html
, 即浏览器会把页面内容当成html页面进行渲染,另外该接口的特点是输入的参数会体现在响应中,二者结合即为反射XSS。0x03 命令注入
看了看后台的功能点, 是偏向于给网管用的运维工具, 比如可以对Linux服务器做登录扫描, 当然, 前提是咱们得输入ssh的账号、密码。
越高端的操作往往越接近底层,越底层的东西往往越危险。
sshpass
,说不定存在OS命令注入的问题,试试?sshpass -p password ssh root@127.0.0.1
&&
、||
、>
、<
一直试到反引号,都是直接报错,好家伙,都给过滤了呗。然而转机常在灰头土脸时到来: 开发忘记了过滤$
和括号()
,一发$(sleep 5)
,睡了五秒再醒过来,正好拿到shell。0x04 SQL注入
前台登录绕过:在USERNAME处实施注入, 用UNION SELECT联合查询, 控制数据库返回的密码值, 使其与PASSWORD值相同, 以此来达成前台登录的绕过.
$where
变量,都是拼接的用户输入, 用单引号闭合即可实施注入,SQLMAP一把梭即可直捣黄龙。不过,话又说回来:都有shell了, 要后台的SQL注入干嘛,命令执行不香?0x05 前台SSRF
HTTPS型SSRF
curl
请求
CURLOPT_FOLLOWLOCATION
属性并未启用, 导致不能使用302跳转, 只能做https
请求万金油型SSRF
go
函数, 它是一个开启了CURLOPT_FOLLOWLOCATION
的CURL封装, 那么我们就能用302跳转到gopher
协议来打内网。当然:此处只做论证,不演示。0x06 前台任意文件上传
case 123
处,是存在任意文件上传的, 只不过文件是传到了内网,并无实际用处。后来,我注意到使用了一个文件上传相关的组件,在
xxxxxx/uploadfile/app.php
中, 存在以下代码<?php
$DIR = ‘base’;
$src = file_get_contents(‘php://input’);if (preg_match(“#^data:image/(\w+);base64,(.*)$#”, $src, $matches)) {
$appUrl = sprintf(
“%s://%s%s”,
isset($_SERVER[‘HTTPS’]) && $_SERVER[‘HTTPS’] != ‘off’ ? ‘https’ : ‘http’,
$_SERVER[‘HTTP_HOST’],
$_SERVER[‘REQUEST_URI’]
);
$appUrl = str_replace(“app.php”, “”, $appUrl);$base64 = $matches[2];
$type = $matches[1];
if ($type === ‘jpeg’) {
$type = ‘jpg’;
}$filename = md5($base64).”.$type”;
$filePath = $DIR.DIRECTORY_SEPARATOR.$filename;
if (file_exists($filePath)) {
die(‘{“result” : “$appUrl”.’base/’.”$filename”‘);
} else {
$data = base64_decode($base64);
file_put_contents($filePath, $data);
die(‘{“result” : “$appUrl”.’base/’.”$filename”‘);
}
整个文件的逻辑是:通过正则,提取出形如
data:image/XXXXX;base64,YYYYYYY
的字符串中XXXXX
和
YYYYYYY
值,分别作为文件后缀和文件内容。那么利用方式就呼之欲出了:直接将上传内容进行base64编码,把数据放到POST_DATA里,实现无损上传PHP文件。并且,由于文件内容缺少PHP脚本的特征,上传过程顺带把WAF给绕了——我直呼内行
实际上,XSS、SQLi 、SSRF,都只是手段,不是目的——要是存在前台RCE问题的话,为什么不提出来呢?
0x07 前台命令执行
总结
其实,开发也好,安全也罢,都不能闭门造车:开发需要了解安全,安全也应当学学开发;
毕竟,不懂开发的我,现在还在打工。
转自:乌云安全