目录
- 前言
- 代码执行
- 命令执行
- 代码执行函数(PHP)
- 命令执行函数
- 修复方法
- 演示案例
- 墨者靶场黑盒功能点命令执行-应用功能
- 墨者靶场白盒代码及命令执行-代码分析
- 墨者靶场黑盒层RCE漏洞检测-公开漏洞
- Javaweb-Struts2框架类RCE漏洞-漏洞层面
- 一句话Webshell后门原理代码执行-拓展说明
前言
在Web应用中有时候程序员为了考虑灵活性、简洁性,会在代码调用代码或命令执行函数去处理。比如当应用在调用一些能将字符串转化成代码的函数时,没有考虑用户是否能控制这个字符串,将造成代码执行漏洞。同样调用系统命令处理,将造成命令执行漏洞。代码执行和命令执行是有明显的区别的
代码执行
脚本代码能做什么事情,也就是这个漏洞能做什么事情,一个脚本代码,可以写出来,可以利用这个脚本读取文件、写入文件,删除文件、上传文件,这个功能可以全部用脚本代码来实现
<?php
$code=$_GET['x'];
eva1($code);
//http://127.0.0.1:8080/test.php?x=phpinfo();
//$code=phpinfo(); eval(phpinfo(););
?>
eval()函数把字符串按照 PHP 代码来计算
代码执行漏洞就是会将后面的数据进行一个执行,以当前的脚本类型,如果你的网站是php的,那就当成php执行;如果是javaweb那就当做javweb去执行它。
我们可以通过代码去实现我们的目的,通过代码写入一个文件。
换成system函数
<?php
$code=$_GET['x'];
echo system($code);
//http://127.0.0.1:8080/test.php?x=dir
?>
system执行外部程序并显示输出资料,这就是属于命令执行;php代码里面使用到system函数,那么这个函数将会导致这个脚本调用电脑系统的命令去执行
漏洞形成条件:可控变量,漏洞函数
通过网址上面的传参,通过上面的参数值去改变变量值;你用什么函数对变量进行操作
我们刚才演示用到的eval和system函数,eval函数就是把字符串当做代码去执行,另一个是调用php去执行系统命令,最终形成的漏洞一个是叫代码执行,一个是叫命令执行
如果我将这个函数换做文件上传类的函数,进行输出,那么他就会造成不同的函数,这个漏洞产生需要两个条件,一个是可控变量,另一个是漏洞函数
就是这个函数使用的是什么东西,他就会造成那方面的漏洞,如果他是上传的,那他就会造成上传漏洞,如果是执行代码,那就是代码执行漏洞,如果是输出的,那就是xss,如果是进行数据库查询的,那就是sql注入,这个漏洞的类型将由函数决定,漏洞是否存在将由可控变量去决定,没有可控变量,就没有漏洞
web源码有很多分类,我们打开类似的网站源码下载,区分不一样,程序员在写这个代码的时候,这个代码也会有改变,比如我的网站是做文件管理,就是进行文件的传输和下载、展示,他的代码实现更多的,应该是关于文件操作类的代码,比较容易产生文件上传和下载,网站的应用将会决定漏洞的走向
看代码在程序网站源码当中出现的大小,如果代码当中经常出现system函数的话,他漏洞产生的精确度会比较大
如果网站没有这个应用的话,没有这种系统调用命令去实现这种功能的话,他就不会产生命令执行漏洞
一个网站给到我,我们发现RCE漏洞、注入、上传、跨站的可能性谁更高一些,其实就是根据漏洞的特性、网站的应用分类,RCE漏洞比其它漏洞机率要小。
像一般的网站要进行展示的话,一般不会涉及到system函数,我们要找RCE漏洞的时候,要看网站的具体应用,如果他是单纯的页面展示,就是每天发个新闻,这种单纯的网站,没有一些拓展的功能,基本上不可能出现RCE漏洞
https://www.xxxxxx.com/?id=echo 123
参数值和代码相关,例如echo,脚本里面的输出性函数,当我们发现这个参数值的时候,可以把后面的代码执行
我们可以phpinfo(),来确定这个漏洞是否存在,参数值后面加上去的,应该是类似的脚本代码;我们在实战当中会碰到把参数值加密的情况,我们要去解密,解密出来,再去判定
命令执行
在电脑调至cmd窗口或powershell命令终端,系统命令可以做很多东西,查看当前计算机的相关信息并且能够进行文件的读写,或者是文件的删除操作,有这么多功能命令可以实现的话,也对应这个漏洞也能这么做,这个漏洞一旦有的话,会造成对方网站服务器系统命令漏洞,就可以借助这个漏洞执行相关漏洞,来实现我们相关的命令
根据当前系统命令的情况选择执行,因为不同的操作系统,命令是不一样的
敏感函数禁用,防止漏洞产生的根本原因
代码执行函数(PHP)
eval()
把字符串作为PHP代码执行
assert()
断言
call_user_func()
把第一参数作为回调函数
call user func array()
调用回到函数,并把第一个数组参数作为回到函数的参数
array_map()
为数组的每个元素应用回调函数
可以在网上自己搜索其它语言的代码执行函数
命令执行函数
system()
执行外部程序并显示输出
exec()
执行一个外部程序
shell_exec()
通过shell环境执行命令,并将完整的输出以字符串的方式返回
passthru()
执行外部命令并显示原始输出
pcntl exec()
在当前进程空间执行指定程序反
``
反引号()
实际调用的shell_exec()函数
修复方法
如果不使用这些变量、函数,就直接禁用掉
如果我们要通过代码去挖掘漏洞的话,我们要去找里面有没有相应的函数,因为只有相应函数才能产生RCE漏洞。
演示案例
墨者靶场黑盒功能点命令执行-应用功能
先确定网站的功能点,能不能执行系统命令,如果能,说明这里面涉及到执行命令的函数,漏洞可能会存在,然后函数是执行命令的,那么造成的漏洞是命令执行漏洞
分析到命令执行,我们要确认操作系统,因为操作系统不一样,我们要执行的命令也不一样,随便抓个包,改个大小写就能确认什么类型了
管道符,一条命令多条命令执行
iipp=127.0.0.1|1s&submit=Ping
根据网站的功能,从功能这里,我们知道他存在网站命令执行漏洞
墨者靶场白盒代码及命令执行-代码分析
http://219.153.49.228:43529/f.php?a=phpinfo()
代码执行执行的是脚本
墨者靶场黑盒层RCE漏洞检测-公开漏洞
直接搜索webmin 漏洞,网上有复现,直接利用
Javaweb-Struts2框架类RCE漏洞-漏洞层面
这个漏洞很多,网上的复现工具也很多
rce漏洞会产生在多个层面
一句话Webshell后门原理代码执行-拓展说明
我们现在都是用蚁剑和冰蝎,连接shell工具里面有一句话代码
蚁剑和菜刀是没有区别的,只有冰蝎区别有点大
把一些写好的功能数据包,写到工具里面去,然后利用后门代码进行正常程序的收发,来实现这个控制
因为这种连接shell工具,我们要经常进行分析的,因为后门控制工具,也会被安全软件拦截,实现对安全软件的一个绕过,原理跟代码执行漏洞是一样的
@的作用不显示错误,代码出现错误,不会显示