1.命令和代码执行的本质是什么
命令执行的本质是调用操作系统的接口来执行特定的系统命令。这些命令通常是由操作系统提供的,例如Linux的ls、cd等,或者Windows的dir、cd等。
代码执行的本质是调用后端语言(如PHP,JAVA等)来执行特定代码。代码执行通常发生在你的程序内部,它不直接与操作系统交互,而是通过你的程序来控制计算机的行为。
总的来说,命令执行和代码执行都是为了让计算机执行特定的操作,但它们的工作方式和使用场景有所不同。
其实说白了,都是注入类攻击,主要也是看过滤。
2.审计的特征(思路)
命令执行的代码审计特征:
- 命令执行漏洞发生的根本原因是"用户可控的"、”未经净化“的数据直接作为可执行命令函数的参数。
- 参数是否用户可控,如用户输入的外部数据是否拼接到可执行命令函数的参数内?
- 是否配置了全局过滤器?检查过滤器的配置,是否所有命令的执行都经过过滤器处理,过滤器的过滤规则是否符合安全要求?
- 例如,Java中的Runtime.getRuntime().exec(cmds),其中cmds是一个字符串数组,包含了要执行的命令和参数。如果这些参数可以被用户控制,那么就可能存在命令执行漏洞。
代码执行的代码审计特征:
- 代码执行漏洞是指因为系统使用了可以执行命令的危险函数,但是调用这些函数的参数可控,并没有做过滤或过滤不严格,使攻击者可以通过构造特殊命令字符串的方式将数据提交至Web应用程序中,并利用该方式执行外部程序或系统命令实施攻击。
- 例如,当应用在调用一些能将字符串转化成代码的函数时,没有考虑用户是否能控制这个字符串,将造成代码执行漏洞4。
简单来说着重点就是过滤规则和危险函数。
3.简单说下危险函数
命令执行的危险函数:
- system():将字符串当作操作系统命令执行。
- exec():将字符串当作操作系统命令执行,但只输出命令执行的最后一行。
- shell_exec():将字符串当作操作系统命令执行。
- passthru():将字符串当作操作系统命令执行。
- popen():能够执行操作系统命令,相当于把命令执行结果输出到一个文件内。
- 反引号``:反引号内的字符串,也会被解析成操作系统命令。
代码执行的危险函数:
- eval():将字符串当作PHP代码执行。
- assert():将字符串当作PHP代码执行。
- preg_replace():将字符串正则匹配后替换。
- call_user_func():回调函数。
- array_map():回调函数。
上面只说了比较出名的,并不是所有的,还有一些基于框架和一些服务的,比如SpEL和JNDI这种。简单说下,不做具体分析。
SpEL(Spring Expression Language),即Spring表达式语言。SpEL表达式是可以操作类及其方法的,可以通过类类型表达式T(Type)来调用任意类方法。在不指定 EvaluationContext 的情况下默认采用的是 StandardEvaluationContext,而它包含了SpEL的所有功能,允许用户在可以控制输入 的情况下成功造成任意代码执行。
Java命名和目录接口(JNDI)是一种Java API,类似于一个索引中心,它允许客户端通过name发现和查找数据和对象。JNDI注入是一种安全漏洞,发生在应用程序接受用户输入并将其作为JNDI(Java Naming and Directory Interface)查找的参数。如果参数可控,攻击者可以传入恶意的URL,远程加载恶意载荷。例如,当开发者在定义JNDI接口初始化时,lookup()方法的参数可控,攻击者就可以将恶意的URL传入参数,远程加载恶意载荷,造成注入攻击。这可能导致远程代码执行,对系统安全构成威胁。
一般来说,最简单初步的测试log4j就是利用这个jndi服务去联动dnslog平台去看访问记录,看看存在不存在该漏洞。理论上,只要存在执行操作,就有执行风险,具体还是看环境。
再会,铁子。