thinkphp3.2.3-5.0.10前台缓存写shell
0x00 简介
漏洞简述就不多说,这里将分别介绍tp3.2.3、tp5.0.10和onethink缓存写入getshell。
tp3.2.3:
缓存文件路径:/Application/Runtime/Temp
可能缓存文件名:b068931cc450442b63f5b3d276ea4297.php
onethink1.0:
thinkphp3开发 缓存文件路径:/Runtime/Temp/ 默认缓存文件名:2bb202459c30a1628513f40ab22fa01a.php 缓存名基本不变
tp5.0.10:
缓存文件路径:/runtime/cache
可能规则命名的md5值:b068931cc450442b63f5b3d276ea4297
那么缓存文件名为:/runtime/cache/b0/68931cc450442b63f5b3d276ea4297.php
写入的php语句开头需要换行,结尾需要注释掉后面的垃圾数据:
换行利用url编码:%0d%0a或者%0a 注释用 // 例如写入phpinfo(); 那么应该为:%0d%0aphpinfo();//
0x01 利用条件
- 开启缓存功能;
- 能够猜解出缓存文件名(文件名生成有一定规律)
- 缓存内容可控或部分可控,即找到写入的位置(一般与数据库交互的地方)
缓存文件名可由泄露的源码已知,或者可猜测,规律为使用常见的名词,如user、news、goods、article,然后对这些名称md5编码。
例如:一个论坛类网站
1.发帖处可与数据库交互,即可在这儿写入php内容到缓存文件;
2.那么发帖处的url为:http://xxx/index/article/showarticle/articleld/52,猜测缓存名词为article_52
对名词进行md5,echo(md5("article_52")); 输出md5值 12a51218427a2df68e54e8f4c8b10109 ;
那么如果是tp3,缓存名则为12a51218427a2df68e54e8f4c8b10109 .php,如tp5,则是/12/a51218427a2df68e54e8f4c8b10109.php
0x02 thinkphp3.2.3缓存写shell关键
1.找到与数据库交互的地方,一般是提交post数据的地方,写入php语句,例如:
%0d%0aphpinfo();//
2.访问查看post数据提交过后的记录来触发数据缓存。
3.访问缓存文件。
0x03 onethink1.0缓存写shell
注意:换行利用%0d%0a,如遇长度限制可去掉%0d尝试。
构造的php语句不能直接在页面表单写入提交,需要在burp里面进行操作
onethink1.0缓存写shell漏洞是固定的,在注册用户的地方,且进行登录触发缓存数据。
先注册,再登录成功才能写入 写两条语句: %0a$a=$_POST[1];// %0d%0aeval($a);//
1.注册写入php语句到缓存文件:
抓包,在注册包post数据里面的username变量写入%0a$a=$_POST[1];//,然后其他信息正常添好提交注册;
2.登录成功来触发数据缓存:
登录页面抓包,username处填入%0a$a=$_POST[1];//,然后正常填写刚刚注册的密码,成功登录代表第一条语句写入成功;
3.第二条语句再次进行上面两步操作;
4.访问缓存文件。
0x04 tp5.0.10缓存写shell
1.找到数据交互的地方,burp抓包修改post数据,写入php语句,例如:
2.访问触发缓存数据,例如这里访问cache方法:
3.访问缓存文件。
总结:
其实thinkphp缓存写shell的漏洞的利用主要分三个步骤:数据交互写入恶意php语句,触发缓存数据,访问缓存文件。