记一次曲折的渗透测试

目标: http://www.xxx.xx.xx

首先手工挖掘漏洞和信息.

找到后台地址

https://static-js.b0.upaiyun.com/wp-content/uploads/auto_save_image/2015/11/144517s9i.png

然而访问不了目测被限制IP,返回403测试发现不光访问不了后台,所有URL路径,GET,POST,COOKIE中带admin都会返回403.坑啊~~先放一边继续挖掘

接着很快找到一枚注入

http://www.xxx.xx.xx/news/xxx.html?xxxxx=1869+and+1=1 正常

http://www.xxx.xx.xx/news/xxx.html?xxxxx=1869+and+1=2 错误

接着order by又返回了403 POST请求依然返回403 COOKIE没有过滤果断拿起Burp手工注入

https://static-js.b0.upaiyun.com/wp-content/uploads/auto_save_image/2015/11/144517FN7.png

继续蛋疼Mysql版本为4.0.x 意味着子查询用不了,没有info库只能猜表,只能用union

幸运的是猜到了member用户表
https://static-js.b0.upaiyun.com/wp-content/uploads/auto_save_image/2015/11/144518auw.png

密码hash又是什么鬼,$6$之前遇到过是SHA512加密 rounds=50 这个本该是盐值但这个字符串看起来是有意义的

一番查资料发现是PHP的SHA512加密

rounds=50代表循环50次加密,但正确的用法是

而这个不是代表50次循环无盐值 而是PHP把rounds=50这段字符串当成了盐值并用默认的循环次数5000次进行加密

因为这个导致后续用Python批量生成hash的时候hash一直对不上(别问我为什么不用PHP直接生成,生成的太多脚本直接挂了233)

这种hash不光cmd5识别不了连hashcat这种软件都识别不了

我这种穷B没有强大的服务器因此跑hash是没希望的

然后我测试了一下重置密码功能

https://static-js.b0.upaiyun.com/wp-content/uploads/auto_save_image/2015/11/144519aVI.png

发现临时密码固定为,00000000-99999999 8位随机数字的MD5值

要生成将近一亿个hash值,时间是一次MD5加密加5000次SHA512加密

我的小破B电脑显然是不可能短时间内生成这一亿个于是只生成了80000000-90000000的hash值(用Python生成了2天1夜)

https://static-js.b0.upaiyun.com/wp-content/uploads/auto_save_image/2015/11/144519CbO.png

这样每点一次重置就有将近10分之1的机会找到正确的临时密码了.但想想并没什么卵用

就算重置了管理员的密码,访问不了后台依然登陆不了,况且我也不想就这么打草惊蛇.于是决定迂回战术

该网站采用了一套CMS但并不开源要花钱思密达,于是Google找到一批网站

https://static-js.b0.upaiyun.com/wp-content/uploads/auto_save_image/2015/11/14451981q.png

挑出几个后台没有做限制IP的网站,从中挑一个比较LOW的下手,跳板挂起,重置管理员密码一次10分之1的机会重置了大概4,5次后命中

接着顺利登陆了后台,首先收集了一批后台的各个功能对应的URL,有一个URL比较异常

是 删除文章的功能URL可以看到URL中包含了admin字符串,但很奇怪目标站没有抛出403错误而是跳转到首页表示没有权限,猜测目标站对这个URL没 有设置访问控制(这个URL在后面起了很大作用)然后挖掘后台漏洞,终于找到了一枚上传漏洞,更幸运的是上传功能的URL没有admin字符串,所以只要 有管理员权限就可以Getshell目标站了

https://static-js.b0.upaiyun.com/wp-content/uploads/auto_save_image/2015/11/144519gsa.png

大写绕过然后move的时候竟然生成了1.php不知道程序员咋想的

内容依然有过滤 括号,POST,GET,COOKIE等关键字都被过滤,于是用反单引号执行命令,curl,wget统统用不了,利用

写入一句话到cmd.php

本地写个zhongzhuan.php base64传递参数值饶过检测

挖掘上传漏洞的同时挖到了一枚任意文件下载(对之后的渗透依然起着重要的作用)

下一步download源代码

https://static-js.b0.upaiyun.com/wp-content/uploads/auto_save_image/2015/11/144519EGe.png

代码审计:

在审计这步入了很多坑我就不废话了直接挑重点写

先对不包含admin字符串&&越权访问&&上传功能进行挖掘历经了几个小时最后失败233

然后对网站的登陆,SESSION逻辑进行审计

Login.php的代码

https://static-js.b0.upaiyun.com/wp-content/uploads/auto_save_image/2015/11/144520mq1.png

session_register注册了SS_ADMIN_ID,SS_ADMIN_PASS,SS_ADMIN_LEVEL三个session变量

接着对user_id,user_pw去空格,$adminLogin->getUserInfo()验证成功后给三个session变量赋值

然后看一下is_login函数(判断是否登陆函数)

https://static-js.b0.upaiyun.com/wp-content/uploads/auto_save_image/2015/11/144521u2S.png

验证了SS_ADMIN_PASS和SS_ADMIN_LEVEL两个session变量

其中ADMIN_PASS常量是认证KEY在config.php文件中

下面是config.php的部分代码

https://static-js.b0.upaiyun.com/wp-content/uploads/auto_save_image/2015/11/144522TbE.png

https://static-js.b0.upaiyun.com/wp-content/uploads/auto_save_image/2015/11/144522WeD.png

https://static-js.b0.upaiyun.com/wp-content/uploads/auto_save_image/2015/11/144522Iu4.png

可以发现对GET,POST,COOKIE,REQUEST进行了_SESSION,SS_ADMIN_PASS参数进行过滤,不过滤的话会怎么样呢

Login.php 代码中首先session_register注册了三个session变量然后包含进config.php文件对传进来的参数循环注册,于是提交

或者

就可以伪造 SESSION以管理员身份登陆了.什么? ADMIN_PASS怎么获取?之前不是挖到了一个任意文件下载吗利用这个读取config.php中的ADMIN_PASS的值

https://static-js.b0.upaiyun.com/wp-content/uploads/auto_save_image/2015/11/1445236iz.png

https://static-js.b0.upaiyun.com/wp-content/uploads/auto_save_image/2015/11/144524skR.png

然后回归现实在代码中对_SESSION和SS_ADMIN_PASS进行了过滤 参数KEY中带这两个都会置空,那怎么饶过呢

多重嵌套!!

从代码中可以发现对$_SERVER是没有过滤的,可能程序员觉得$_SERVER是服务器的环境变量,是不可控的,而事实却不是这样

写个本地代码测试下

https://static-js.b0.upaiyun.com/wp-content/uploads/auto_save_image/2015/11/144524ALC.png

访问输出如下

https://static-js.b0.upaiyun.com/wp-content/uploads/auto_save_image/2015/11/144525kff.png

可以发现完全是可控的那怎么控制呢,直接上Payload

POST上面这行参数过去

代码中对POST数组只过滤了_SESSION和SS_ADMIN_PASS

所以_SERVER是不会被过滤的所以在POST循环注册的时候会注册这两个变量

然后程序走到SERVER循环中注册这两个变量

因为SERVER循环中没有对_SESSION进行过滤导致SESSION变量成功被注册

在利用任意文件下载获取config.php文件中的ADMIN_PASS,然后找到包含了config.php文件的PHP脚本(基本所有PHP脚本都包含了config.php文件呵呵)所有条件都满足最后伪造登陆后台任意文件上传Getshell!!

然后用这个Payload打目标站时瞬间菊花一紧,因为POST过去的字符串里有ADMIN字符串很显然直接给我抛了个403,瞬间蒙蔽,然后大脑高速运转,哎呀~之前不是发现了一个异常的URL吗? 就是这个

虽 然URL带了admin但目标站并没有返回403所以猜测对该文件是没有设置IP限制的(.html文件你在逗我?恩这个.html文件里翻源代码发现有 PHP语言当然包含了config.php文件,然后apache设置了html当php解析吧.我的猜测)于是………

成功登陆

https://static-js.b0.upaiyun.com/wp-content/uploads/auto_save_image/2015/11/144526mKi.png

后续就可以Getshell了,因为用来Getshell的URL中没有包含admin字符串,所以是没问题的.

【via@蓝冰-360播报