once-penetration-test

记一次历史业务安全测试

最近在对公司历史遗留的老业务进行安全测试,简单记录一下测试的过程。

子域名是http://upload.xxxx.com/

pic1

主页是一个phpinfo的页面,首先对网站进行文件扫描。

wfuzz -w common.txt -z list,-.php-.html –hw 76 http://upload.xxxx.com/FUZZFUZ2Z

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
********************************************************
* Wfuzz 2.3.4 - The Web Fuzzer *
********************************************************

Target: http://upload.xxxx.com/FUZZFUZ2Z
Total requests: 13839

==================================================================
ID Response Lines Word Chars Payload
==================================================================

003313: C=200 5 L 11 W 203 Ch "crossdomain.xml - "
006047: C=200 562 L 2593 W 46219 Ch "index - .php"
006058: C=200 562 L 2593 W 46219 Ch "index.php - "
008776: C=301 0 L 0 W 0 Ch "php - "
012639: C=200 86 L 179 W 2315 Ch "uploadfile - .html"

Total time: 131.0165
Processed Requests: 13839
Filtered Requests: 13834
Requests/sec.: 105.6279

扫描结果中index.php为首页的phpinfo页面,另外扫描发现了php目录和uploadfile.html文件。

访问php目录返回401错误:

pic2

http://upload.xxxx.com/uploadfile.html 为空白页

pic3

查看源代码有所发现:

pic4

这里猜测phpPath为php目录,结果证实了我的猜想:

pic5

构造参数:

pic6

上次文件,查看返回:

pic7

图片成功上传,另外发现了一个命名疑似图片裁剪的文件phpcutPhoto.php

先测试了文件上传漏洞,发现服务器进行了图片验证,然后强制改后缀,此路不通

访问http://upload.xxxx.com/php/phpcutPhoto.php 发现文件不存在,这里走了些弯路

后面测试发现地址应该是http://upload.xxxx.com/php/cutPhoto.php

前面uploadHead.php中phpPath参数值为php,所以后面文件名误加了php,这里应该是以前的代码有bug

pic8

访问后提示打开失败,明显是缺少了图片地址的参数,这里可以使用WAScan、Arjun等工具进行参数爆破。我这里就简单用burpsuite fuzz爆破一下:

pic9

参数名可以考虑使用https://github.com/s0md3v/Arjun/blob/master/db/params.txt 里的参数名。

这里我自己简单构造了一些常见的,没包括首字母大写的情况:

1
2
3
4
5
6
7
8
9
10
img
image
images
imgpath
img_path
file
filename
path
file_path
filepath

参数Fuzz爆破结果:

pic10

返回中可以看到,虽然报了错误,但是图片剪切后的文件成功生成了:

pic10

访问同服务器的图片域名,发现文件存在:

pic11

现在我们可以来测试这个接口的本地文件读取和ssrf漏洞

先测试本地文件包含:

pic12

path=/etc/passwd,返回/etc/passwd.jpg.jpg打开失败

把path改成一个不存在的文件:

pic13

path=/etc/test,返回/etc/test打开失败

当path为一个存在目录的情况:

pic14

测试发现读取一个存在的非图片后缀文件或目录时,会自动把path加上.jpg.jpg

这样的话我们只能通过这个接口探测服务器的文件或目录,但无法进行正常的文件读取的操作

另外我测试了ssrf,发现无法直接访问外部链接

pic15

突然发现忘记了php伪协议的操作

pic16

php://input没戏,另外尝试了其它协议配合截断读取的方法,也都以失败告终。

但当我测试到path=php://filter/read=string.tolower/resource=http://m3rryz.com/ 返回有了数据

pic17

并且我的blog获取到了服务器的请求:

pic18

可以看到服务器请求了http://myblog.com/.jpg.jpg 并返回了404

那么当我在blog上,构造一个x.jpg.jpg的文件,内容为/etc/passwd

然后让path=php://filter/read=string.tolower/resource=http://m3rryz.com/x

是否就可以绕过之前的限制,进行本地文件读取呢?
然而现实很残酷:

pic19

这里path必须为真实图片,否则无法进行cut操作。:(

不过过程还是有点意思的,对文件读取和ssrf漏洞了解更深了一些。

如果有其它绕过思路的朋友,希望可以留言指教下。