记一次曲折的渗透测试

阅读量    87277 |   稿费 1000

分享到: QQ空间 新浪微博 微信 QQ facebook twitter

https://p4.ssl.qhimg.com/t01acfd489004b8f80c.jpg

BY:蓝冰

稿费:1000

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

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

找到后台地址

https://p2.ssl.qhimg.com/t010b9f61e09d5eab01.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://p1.ssl.qhimg.com/t01cf1020b1b5b5e2da.png

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

幸运的是猜到了member用户表

https://p1.ssl.qhimg.com/t0197362a041953a8f4.png

$6$rounds=50$GXsDmPqqFQ29t7v2T9elBjX0pY5qVBBeL2uE9EkHcygQJAkAfAkTNotqRIFLBWiA4mRSrndjJ8pJvYajrdjK//

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

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

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

$6$rounds=50$GXsDmPqqFQ29t7v2T9elBjX0pY5qVBBeL2uE9EkHcygQJAkAfAkTNotqRIFLBWiA4mRSrndjJ8pJvYajrdjK//

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

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

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

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

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

https://p4.ssl.qhimg.com/t01af640846d86eea64.png

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

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

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

https://p3.ssl.qhimg.com/t0172642c6bf6cff67a.png

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

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

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

https://p5.ssl.qhimg.com/t01f48b9ebb05de2abf.png

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

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

/xxx/adminxxxxx.html?xxxx=1000

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

https://p5.ssl.qhimg.com/t016cd0febc1ff6f20d.png

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

内容依然有过滤 括号,POST,GET,COOKIE等关键字都被过滤,于是用反单引号执行命令,curl,wget统统用不了,利用`echo base64str | base64 –d > cmd.php`写入一句话到cmd.php

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

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

下一步download源代码

https://p0.ssl.qhimg.com/t01761cb1076f641723.png

代码审计:

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

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

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

Login.php的代码

https://p4.ssl.qhimg.com/t01176df7c88a917c6c.png

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

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

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

https://p3.ssl.qhimg.com/t019f5d8690cfb3172a.png

验证了SS_ADMIN_PASS和SS_ADMIN_LEVEL两个session变量

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

下面是config.php的部分代码

https://p5.ssl.qhimg.com/t0137780de16b99b1ff.png

https://p3.ssl.qhimg.com/t0151cfeef771bb6fe6.png

https://p0.ssl.qhimg.com/t014db56872c7a7bb7d.png

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

Login.php代码中首先session_register注册了三个session变量然后包含进config.php文件对传进来的参数循环注册,于是提交SS_ADMIN_PASS=ADMIN_PASS&SS_ADMIN_LEVEL=M或者_SESSION[SS_ADMIN_PASS]=ADMIN_PASS&_SESSION[SS_ADMIN_LEVEL]=M就可以伪造SESSION以管理员身份登陆了.什么? ADMIN_PASS怎么获取?之前不是挖到了一个任意文件下载吗利用这个读取config.php中的ADMIN_PASS的值

https://p2.ssl.qhimg.com/t014b08aaecf89923ce.png

https://p5.ssl.qhimg.com/t01e58f9e7bd02ee636.png

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

多重嵌套!!

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

写个本地代码测试下

https://p3.ssl.qhimg.com/t011a77b6595b24debb.png

访问输出如下

https://p1.ssl.qhimg.com/t01402af080425a4c2d.png

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

_SERVER[_SESSION][SS_ADMIN_PASS]=KEY&_SERVER[_SESSION][SS_ADMIN_LEVEL]=M

POST上面这行参数过去

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

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

$_SERVER[_SESSION][SS_ADMIN_PASS]=KEY
$_SERVER[_SESSION][SS_ADMIN_LEVEL]=M

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

$_SESSION[SS_ADMIN_PASS]=KEY
$_SESSION[SS_ADMIN_LEVEL]=M

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

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

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

/xxx/adminxxxxx.html?xxxx=1000

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

POST: /xxx/adminxxxxx.html?xxxx=1000
_SERVER[_SESSION][SS_ADMIN_PASS]=KEY&_SERVER[_SESSION][SS_ADMIN_LEVEL]=M

成功登陆

https://p5.ssl.qhimg.com/t010a2fb7e667491049.png

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

分享到: QQ空间 新浪微博 微信 QQ facebook twitter
|推荐阅读
|发表评论
|评论列表
加载更多