命令执行漏洞学习笔记

0x01 PHP命令执行

命令注入的条件

  • 是否调用系统命令
  • 函数或函数的参数是否可控
  • 是否拼接注入命令

命令连接符

A&B A&&B A|B A||B
AB间无约束关系 A执行成功,然后执行B A的输出作为B的输入 A执行失败,然后执行B

命令执行

  • PHP提供部分函数用来执行外部应用程序。如system()、shell_exec()、exec()和passthru()。

  • eval()函数可以把字符串按照PHP代码来执行(动态执行PHP代码)注:输入的字符串必须是合法的PHP代码,且必须以分号结尾。

  • PHP支持动态函数调用:

    <?php
    	function A()
    	{
    		return "A()函数..";
    	}
    	function B()
    	{
    		return "B()函数..";
    	}
    	$fun = $_GET['fun'];
    	$par = $_GET['par'];
    	$fun($par);		//执行函数并使用参数
    	
    	$fun = $_REQUEST['fun'];
    	echo $fun();	//动态调用函数
    ?>
    

    f u n p h p i n f o fun值为phpinfo时, fun()对应的函数即为phpinfo();。当用户提交的url为http://www.xxx.com/function.php?fun=system&par=net user时,执行的函数为:system(“net user”)。

  • PHP危险函数:preg_replace()、ob_start()、array_map()、unserialize()

0x02 Java命令执行

Java SE中存在Runtime类,在该类中提供exec方法用以在单独的进程中执行制定的字符串命令。模型代码:

import java.io.InputStream;			//导包操作
import java.io.InputStreamReader;
import java.io.BufferedReader;

public class RuntimeTest
{
	public static void main(String []args)
	throws Exception
	{
		if(args.length==0)
		{
			System.exit(1);			//没有参数就退出
		}
	}
	String command = args[0];
	Runtime run = Runtime.getRuntime();
	Process pro = run.exec(command);//执行命令
	InputStreamReader in = new InputStreamReader(pro.getInputStream());
	BufferedReader buff = new BufferedReader(in);
	for(String temp = buff.readLine();temp!=null;temp=buff.readLine())
	{
		System.out.println(temp);	//输出结果
	}
	buff.close();
	in.close();
}

0x03 框架执行

  • MVC架构(Model-View-Controller)将Web应用分为三层:View层负责用户视图、页面展示等工作;Controller负责应用的逻辑实现,接受View层传入的用户请求,并转发给对应的Model做处理;Model层负责实现模型,完成数据的处理。

  • Struts2代码执行漏洞:Struts2使用XWORK的核心框架,处理action是通过调用底层Java Bean的getter/setter方法来处理http参数,它将每个http参数声明为一个ONGL语句。当提交?user.address.city=bj&user['name']=admin时,ONGL将它转换为:Obj.getUser().GetAddress().setCity="bj";Obj.getUser().setname="admin".这个过程是用ParametersInterceptor拦截器调用ValueStack.setValue()来完成的,并且参数可控。(Unicode字符可绕过XWORK自身的保护机制)

  • ThinkPHP命令执行漏洞:双引号中的PHP变量语法能够被解析执行,所以造成任意代码执行漏洞,利用方式:

    index.php/module/action/paraml/${@print(THINK_VERSION)}
    index.php/module/action/paraml/${@print(eval($_POST[x]))}	//菜刀可直接连接
    

0x04 防范命令执行漏洞

  • 尽量不使用系统执行命令;
  • 在进入执行命令函数/方法之前,变量做好过滤,对敏感字符进行转义;
  • 在使用动态函数之前,确保使用的函数是指定的函数之一;
  • 对PHP来说,不能完全控制的危险函数最好不要使用。
发布了22 篇原创文章 · 获赞 24 · 访问量 1979

猜你喜欢

转载自blog.csdn.net/weixin_43872099/article/details/101313191