1、命令执行漏洞php
应用有时须要调用一些执行系统命令的函数,当服务器没有通过严格过滤用户的参数,这时候就可能致使命令执行,从而致使命令执行漏洞正则表达式
漏洞成因shell
1.代码过滤不严格windows
2.系统的漏洞形成命令执行数组
3.调用的第三方组件存在代码执行漏洞服务器
经常使用命令执行函数函数
system(): 该函数会把执行结果输出。post
passthru(): 该函数只调用命令,并把运行结果原样地直接输出没有返回值3d
exec(): 不输出结果,返回执行结果地最后一行blog
shell_exec(): 不输出结果,返回执行结果
命令链接符
windows和Linux都支持地命令链接符:
cmd1 | cmd2 只执行cmd2
cmd1 || cmd2只有当cmd1执行失败后,cmd2才被执行
cmd1 & cmd2先执行cmd1,无论是否成功,都会执行cmd2
cmd1 && cmd2先执行cmd1,cmd1执行成功后才执行cmd2,不然不执行cmd2
Linux还支持分号(;)cmd1;cdm2按顺序依次执行,先执行cmd1再执行cmd2
防范及修复
1. 尽可能少使用执行命令地函数或者直接禁用
2.参数值尽可能使用引号包括
3.再使用动态函数以前,确保使用地函数是指定地函数之一
4.再进行执行命令地函数|方法以前,对参数进行严格过滤,对敏感字符进行转义
2、代码执行漏洞
代码执行漏洞
因为服务器对危险函数过滤不严,致使用户输入地一些字符串能够被转换成代码来执行,从而致使代码执行漏洞
漏洞成因
用户可以控制函数输入
存在可执行代码地危险函数
常见地危险函数
eval()、assert()
这两个函数均可以将输入地字符串参数做为php程序代码来执行
eval()的参数必须是合法的php代码,因此必须以分号;结尾
assert(mixed $assertion [,string $description])若是assertion是字符串,它将会被assert()看成php代码来执行
还有一些危险函数
preg_replace()、str_replace()、call_user_func()这些函数跟eval、exec等函数地特性相同,都属于危险函数
preg_replace(mixed pattern,mixed replacement,mixed subject [,int limit]):此函数能够用来执行一个正则表达式的搜索和替换
$pattern:正则表达式匹配的内容
$replacement:用于替换的字符串或字符串数组
$subject:要搜索替换的目标字符串或字符串数组
当$pattern存在/e模式修正符,容许代码执行
修复方案
1. 尽可能不要执行外部的应用程序或命令
2.使用自定义函数或函数库来替代外部应用程序或命令的功能
3.执行函数的参数作成白名单限制,再代码或配置文件中限制某些参数
了解这些漏洞以后,咱们开始去ctfhub上面去作一下rce的题目
0x11 eval执行
这段代码没有通过过滤,而后咱们上面也有举例子,咱们直接用get方式传入
phpinfo();
由于eval中的参数必须是php标准的语句的字符串,因此必须以分号结尾
最后构造payload:?cmd=system("cat ../../../flag_14453");
拿到ctfhub{bc1644e9e45ddb7e79f9da2d}
0x12文件包含
下面的shell链接就是一个一句话木马,咱们这简单须要个绕过就是strpos不能等于flag
咱们直接就是利用文件包含构造payload:?file=shell.txt
而后咱们post传入一个ctfhub=phpinfo();咱们会发现执行了
而后咱们就构造拿flag的payload:ctfhub=system("cat ../../../flag");
拿到ctfhub{3041141beefd6faba007a336}