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(); //动态调用函数 ?>
当 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来说,不能完全控制的危险函数最好不要使用。