web应用中,有时候程序员为了考虑灵活性,简洁性,会在代码中调用代码或执行命令执行函数去处理。
比如当应用在调用一些能将字符串转化成代码的函数时,没有考虑用户是否能够控制这些字符串,将代码执行漏洞,同样调用系统命令处理,将造成命令执行漏洞。
危害是执行脚本代码,
危害是执行系统命令,系统命令就是命令提示符可以执行出来的语句,比如ip config就能查询到电脑的IP,系统命令可以做很多事情,影响到电脑。
执行脚本代码和执行系统命令,
代码执行是围绕着脚本语言来讲的,如果是php的脚本,就能执行出php的一些脚本命令,java网站的就执行java的脚本命令。而命令执行是围绕着操作系统来的,Linux的就就是linux语句,Windows就Windows语句。
用php代码的案列演示一下
写一串简单的代码
eval的意思时会把括号里面的字符串当作代码去执行,然后我现在去访问一下,给x传递一个值phpinfo去访问一下试试
在测试一下,传递x值为echo 123
结果就输出个123。
把代码里面eval换成system,然后执行输出出来
system就是会把字符串当作系统命令去执行
然后输入一个系统命令,查看ip地址的
这个就属于命令执行。
漏洞的产生分两种情况,第一种情况是根据现实的应用情况,第二种情况是网站代码里面的情况,
先说代码层面,
漏洞形成条件:可控变量(通过传递参数可以改变变量值),漏洞函数(使用的那个函数对这个变量进行操纵,刚刚演示了一个eval的函数字符串当作代码去执行,system是调用php去执行系统命令,他们最后做出的漏洞,一个是代码执行一个是系统命令,如果将函数换成文件上传类函数,文件提交或者输出函数就会造成不同的漏洞,)
所以漏洞的类型由来的函数决定,漏洞是否存在将由可控变量来决定。缺一不可
网站源码是有类型分类的,有的就是购物,有的就是文件上传,或者社区论坛,因为类型不一样,网站程序员写代码的时候也会哟区别。比如说是文件管理的网站,它的代码就是以文件管理为主,而他的可能产生的漏洞也是文件下载或者上传的漏洞比较多一些。所以网站的应用决定漏洞的走向。
rce的漏洞比其他网站的几率要小,根据网站的漏洞去判断可能出现上面漏洞,比如一个单纯的新闻网站就不可能出现代码执行。
关于漏洞检测分为两个方向,白盒和黑盒
白盒就是你知道对方网站的源码,相关信息,黑盒就是啥都没有,
白盒有源码我们就可以在源码中分析有没有这个漏洞,叫做代码审计。黑盒方向没有对方源码我们就可以用一下漏扫工具,之外还可以去找利用一些网上的公开漏洞,刚好公开的漏洞和他是对应的,他所说的程序和版本漏洞,我们就可以用网上公开漏洞去检查测它,第三种方法就是手工,根据对方的参数值和功能点去判定,拿老师的博客网站做演示
这就是一个简单的博客网站,不可能会产生上面文件上传的那种漏洞,然后参数值也是正常的123,如果参数值是echo 123,和php代码一些东西有关,就可能存在问题,就可以用phpinfo()去测试一下。
实战中还可能参数值加密,然后解密之后还可以继续测试。
#案列演示
打开墨者靶场,黑盒#命令注入执行分析
这个功能点有这么个功能,进行类似的像我们电脑上ping命令,这相当于就满足了命令,明显可能出现命令执行漏洞,可控变量和漏洞函数都存在。第一要去分析是什么操作系统,
通过查看数据包分析出来了是linux操作系统,然后如果输入字符串的话网站会提示格式正确,所以网站还有一个检测输入的是不是ip地址,
这时候我们可以使用Linux执行多条的命令的符号 | 用这个符号连接起来ip再去操作
这次的提示有一个组织测页面更多对话框,这就是个前端验证,就可以右键源代码去分析,
解决方法:1.浏览器设置禁用本地js 2.将网站源代码复制,将验证的js代码删除3.抓包工具修改数据包(在数据包内修改执行语句,就不会被前端检测)
这是个js代码,这个检测不是服务端的检测,onsubmit鼠标事件之后,就会返回f-check-i开始检测ip,我们把它禁用掉就会了,这个可以抓包,我们打开burp,然后输入一个正常ip127.0.0.1,抓住数据包之后ip后面加上|ls,这个命令是查看所在文件夹目录
就出现了,然后我们直接读取文件里面的内容,就能知道要提交什么,
|cat<文件名字,语句是这样的,有时候空格不行可以换成%20试试,可能网站有检测就换换别的,刚刚老师用ls 文件名和ls%20文件名,就没有显示出来。
#墨者靶场,白盒代码及命令执行,
打开靶场
在网上随便找一个php在线运行,然后运行一下这个代码,运行一下看看,把eval去掉,去掉相应的括号。然后echo输出一下,把它运行看一下,
变量request,是接受获取POST或GET方式提交的数据、COOKIE信息,同时可以在代码里看出来传参数值是a。然后直接
然后在进行一个key的读取就能获取到完成靶场的东西了。
这里就有一个问题,为什么用的ls,tac这种Linux的系统命令,是因为echo在Linux的里面的用法,echo `字符串` 字符串是系统命令的的话就会执行,实列如下图。
#墨者靶场,黑盒rce漏洞检测——公开漏洞
打开测试靶场
那个webmin是啥啊,网上搜一下,网上说是linux的系统管理工具,那直接网上搜一下漏洞,看看有没有西瓜吃,
有, 漏洞复现里面就用post数据发送给数据包就行
然后在回到靶场解密,随便输入个账户密码登陆抓住数据包之后,
根据网站的提示的数据包,更改一下地址然后修改下面的数据之后,直接发送,就会显示出来所在文件夹目录
然后选择只需要找到答案就行,根据靶场的目标上写着在网站的根目录,所以就是把ls换成ls/就可以
然后利用cat读取,因为是根目录,所以语句是cat /key.txt,然后就可以看到了
再利用这个公开的漏洞,要自己找到测试出来可以应该修改的地方吗,比如这个公开的漏洞,下面那串语句里面有一个id,然后获取到的就是root,就是这种名字,所以判断出来id是应该修改且有效的地方。
#产生,就是这个网站会产生在哪些地方
第一种是网站程序源码类
脚本代码执行的
thinkphp,eyoucms,wordpreess都产生过,会产生在web程序源码中
中间件平台也会产生,tomcat,apache struts2,redis,都产生过
其他环境也有,php-cci,jenkins-ci,java rmi,也有
系统命令执行的
web源码,nexus,webmin,elasticsearch,都产生过
中间件平台,weblogic,apache 都产生过
其他环境,postgresql,samba,supervisord 都有过
#javaweb-struts2框架类rcs漏洞-漏洞层面
演示一下中间件搭建平台,struts2
还是打开墨者靶场
靶场说得很去,struts2,他是一个基于mvc设计的web应用框架,随便网上一找就有
poc是验证代码,exp是利用代码,直接复制exp的代码,后面命令写个ls试试,
然后读取key.txt就可以了,
这关其实是告诉你这个漏洞产生在多个层面。不仅网站源码其他地方也会产生。
#rce漏洞防御
第一个就是waf产品,网上的一些防护软件,第二种方法就是敏感函数禁用,第三种方法变量过滤或者固定,
第二种,对变量进行过滤,但是命令是多样性我们该如何过滤它呢,他不想sql注入select有这种关键字,比如代码执行,它的代码是多样的,比如想要文件读取有readfile或者fread各种各样的函数,执行那么一个东西,各种各样的命令去执行一样东西,所以去防护关键值不现实,所以我们对变量进行控制,只让她执行某一个东西就行了,但是这种要根据实际情况。
还有一种就是敏感函数禁用。防止漏洞产生的根本条件,漏洞产生两个条件,可控变量,敏感函数,先说代码执行,我们以php为例,eval,assert,
直接在网上代码执行漏洞函数,防御就是把这些函数给禁用掉,使用到某个敏感函数就对变量进行过滤,使用不到就直接禁用,同样在代码里面挖掘这个漏洞就找他有没有对应的敏感函数,只有有才可能会产生。
#扩展知识菜刀
菜刀一句话代码执行,
一句话执行出那么多功能可能吗?不可能。eval会把post(x)传递过滤的参数进行执行,抓包看一下
这个在执行的时候,点开一个目录的时候,其实就是他把这个功能性函数写到这个程序里面去了,点开一个目录的时候就相对应,就会向代码发送一个功能性代码过去,比如说我们要去读取目录,他就用php代码去实现读取那个目录的php代码发送到,变量里面,然后eval去执行,
菜刀的原理就是把一些写好的功能数据包,写到工具里面去,然后用代码去实现正常的收发,然后去控制。