命令执行漏洞学习笔记

0x01 PHP命令执行

命令注入的条件
  • 是否调用系统命令
  • 函数或函数的参数是否可控
  • 是否拼接注入命令
命令连接符
A&BA&&BA|BA||B
AB间无约束关系A执行成功,然后执行BA的输出作为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时, funphpinfofun()对应的函数即为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来说,不能完全控制的危险函数最好不要使用。
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值