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再去操作
这次的提示有一个组织测页面更多对话框,这就是个前端验证,就可以右键源代码去分析,
这是个js代码,这个检测不是服务端的检测,onsubmit鼠标事件之后,就会返回f-check-i开始检测ip,我们把它禁用掉就会了,这个可以抓包,我们打开burp,然后输入一个正常ip127.0.0.1,抓住数据包之后ip后面加上|ls,这个命令是查看所在文件夹目录
就出现了,然后我们直接读取文件里面的内容,就能知道要提交什么,
|cat<文件名字,语句是这样的,有时候空格不行可以换成%20试试,可能网站有检测就换换别的,刚刚老师用ls 文件名和ls%20文件名,就没有显示出来。