目录
概念
这里引用小迪的话:
在Web应用中有时候程序员为了考虑灵活性、简洁性、会将代码调用代码或者命令执行函数进行调用进行处理。比如当应用在调用一些能将字符串转换为代码的函数的时候,没有考虑用户是否能够控制这个字符串,将造成代码执行漏洞。
代码执行和命令执行区别
代码执行漏洞特点
基于脚本,根据由对应编写的脚本产生不同的危害,如php执行出php命令,Java则是Java命
eval函数调用输入是字符变为代码执行
此时网页将其传递的参数
http://192.168.248.129:801/RCE.php?x=phpinfo();
在代码中所执行的是:
$code=phpinfo(); eval(phpinfo(); ); #eval会将()中的以代码进行解析而不是字符串
system函数调用系统命令
命令执行漏洞特点
基于系统,根据使用的系统产生不同的危害,Windows执行Windows命令,Linux执行Linux命令
system函数调用的是系统命令
此时相当于cmd命令行内输入ipconfig如果是Linux系统则是ifconfig
漏洞形成条件
两个条件缺一不可
可控变量:可以控制的变量为可控变量,比如通过网址的一个传参,通过参数值改变变量值
通俗来说就是能够输入自己写的一些数据
漏洞函数:指的是哪个函数对这个变量进行操作,如:eval
好比:上传函数对应文件上传,查询函数对应sql注入,输出函数对应XSS
另外这种漏洞出现的机率取决于网站的应用特性或带有使用的功能
所以在进行找这种漏洞的时候
如果网站只是单纯的一个展示网站,没有其他的查询接口和服务,出现代码执行的漏洞概率不大
漏洞产生地方
漏洞产生不只在编写网页的时候可能存在,同时在中间件,框架还有一些cms等插件程序也是存在
对于插件,框架,cms这些开源的直接到网上进行查找就可以进行复现
web程序源码
中间件平台
其他框架漏洞
如何检测漏洞
白盒情况下
通过代码审计进行查看源代码进行查看
黑盒情况下
漏洞扫描工具:AWVS、Appscan、Nessus
公开漏洞:网上会曝出漏洞,如果网上中有曝出相同的网站漏洞进行利用
源码漏洞,框架漏洞,中间件漏洞
手工看参数及功能点:根据对方的参数值和功能点进行查找,
查看某一个变量参数和使用的脚本语言有相关,实战中会遇到加密
防御方案
变量过滤或固定
代码执行是多样性的,不像sql注入一样存在固定的关键字,可以使用各种函数进行代替
所以过滤变量值不显示,可以改为固定变量值。
只允许使用某一种命令
WAF产品防火墙防护
找到市面上的一些安全产品进行防护
敏感函数禁用
PHP:
eval:把字符串作为php进行执行
assert:断言
call_user_func():把第一个参数作为回调参数
call_user_func_array():调用回到函数,并把第一个数组参数作为回到函数的参数
array_map():为数组的每个元素应用回调参数
python:
exec
Java:
Java中没有类似php中的eval函数可以直接将字符串转为代码进行执行的函数
但是存在反射机制,OGNL、SpEL等(存在相关利用的功能)
命令执行函数
system():执行外部程序并输出显示
exec():执行一个外部程序
shell_exec():通过shell环境执行命令,并将完整的输出以字符串的方式返回
passthru():执行外部命令并显示原始输出
pcntl_exec():在当前进程空间执行指定程序
``反引号():
<?php
echo `abc`;
?>
拓展
菜刀一句话代码原理
<?php @eval($_POST['Z']);?>
原理:
菜刀将一些执行的数据包写到根据工具里面,然后利用密码传参点进行收发控制
eval会将传递的数据包以代码进行执行
通俗来说就是:操作变为数据包,然后数据包通过密码进行发送
案例演示
pikachu靶场黑盒功能点命令执行——应用功能
发现存在可以用于ping服务器通信,可能存在系统命令执行漏洞
另外:此时ping的是他的本机地址,同时也可能存在SSRF漏洞
进行分析可控变量,是否满足条件,发现是可以自由输入是可行的
进行信息收集验证是属于Linux系统还是Windows系统
发现为window系统
此时我们就利用Windows的多命令执行,发现这里是存在漏洞的
Windows下如何一次运行多个命令_天王的博客-CSDN博客_windows执行多条命令
此后我们就可以对其进行后续的渗透
墨者白盒代码及命令执行——代码分析
此时我们拿到该网页的一个源代码
eval函数是一个代码输入的函数,此时这里可能是存在代码执行漏洞
我们此时将原来的eval函数更改为echo输出函数,将输入的改成输出原来的字符
<?php
eval(gzinflate(base64_decode(&40pNzshXSFCJD3INDHUNDolOjE2wtlawt+MCAA==&)));
?>
由于是解密,所以&符号也要根变为’
<?php
echo gzinflate(base64_decode('40pNzshXSFCJD3INDHUNDolOjE2wtlawt+MCAA=='));
?>
此时在php环境得到输出结果为
echo `$_REQUEST[a]`;; ?>
而request函数则是一个接受参数的函数,接受get,post和cookie的变量数据
此时就相当于
那么得知接受参数名为a,并且由request函数接受满足可控变量,eval能够带入代码进行执行
eval(echo `$_REQUEST[a]`;; ?>)
此时利用变量a进行传参,列出当前文件
通过数据包发现是属于Linux系统
那么我们将使用tac命令对其读取文件,获取里面的内容,拿到flag
如果是Windows系统则是cat
cat<key_120672328426179.php
案例补充知识点: 加密的带有echo
此处的echo并非是自己更换的echo
而是解密之后自带的echo,我们换成print输出也是带有echo输出
他是存在于
gzinflate(base64_decode('40pNzshXSFCJD3INDHUNDolOjE2wtlawt+MCAA=='));
当加上echo之后是命令执行,而不存在echo的情况下是代码执行
名词解释:
poc:验证代码
exp:利用漏洞
本文章仅供学习交流