在介绍命令注入之前,有一点需要注意:命令注入与远程代码执行不同。他们的区别在于,远程代码执行实际上是调用服务器网站代码进行执行,而命令注入则是调用操作系统命令进行执行。
作为CTF最基础的操作,命令执行的学习主要是为了以后进一步使用webshell打下基础
同样的,今天还会介绍如何使用各种命令执行绕过的方式
首先我们先来看代码执行
动态调用:
这个地方是ctf曾经的一个考点,也是我在强网杯出过的一道题目,叫"高明的黑客",里面使用的就是混淆代码+动态函数调用,这种写法实际上在红蓝攻防中很经常用到,就是一堆函数进行混淆,然后在里面插入一个动态函数进行真正的代码执行或者是命令执行。
当时那道题目的灵感是来自于一场安全响应,黑客攻陷网站后,在里头插入了混淆以后的代码,1000多个文件里面只有一条路径是正常执行的,最后是使用debug直接看栈内存的调用来判断哪个路径是真的动态调用。
<?php $a = 'assert';$a($_POST['a']);?>
常见的命令执行函数
常见命令执行函数system()passthru()exec()shell_exec()`反引号
反引号
➜ ~ php -r "echo @whoami
;"
这个是大家很容易忘记的一个命令执行点,ctf赛题最近也出了很多道关于这个的题目。我们在第二篇中会拿一个例子来详细分析他的作用。
命令执行绕过
以上是我们常见的代码注入或者是命令注入的函数,但是很多时候在ctf中,出题人不会那么轻易的就让我们执行命令。因此我们必须要能够掌握多种命令执行绕过的姿势。
一般来说,遇到的无非以下两种情况:
disable_function
过滤字符
disable_function
这个东西很明显就是什么呢,你能够代码执行了,但是发现不论是蚁剑还是你自己手打,都执行不了系统命令,然后你用phpinfo这种函数读取后发现如下配置:
实际上是开发者在后端的php.ini里写了如下语句
disable_functions = system,exec,shell_exec,passthru,proc_open,proc_close, proc_get_status,checkdnsrr,getmxrr,getservbyname,getservbyport, syslog,popen,show_source,highlight_file,dl,socket_listen,socket_create,so