`搜索公众号:白帽子左一,每天更新技术干货!
PHP
一.命令执行
命令执行(注入)常见可控位置情况有下面几种:
system("$arg");
//可控点直接是待执行的程序
如果我们能直接控制$arg,那么就能执行执行任意命令了。
system("/bin/prog $arg");
//可控点是传入程序的整个参数
我们能够控制的点是程序的整个参数,我们可以直接用&& || 或 | 等等,利用与、或、管道命令来执行其他命令(可以涉及到很多linux命令行技巧)。
system("/bin/prog -p $arg")
; //可控点是传入程序的某个参数的值(无引号包裹)
我们控制的点是一个参数,我们也同样可以利用与、或、管道来执行其他命令,情境与二无异。
system("/bin/prog -p=\"$arg\"")
;//可控点是传入程序的某个参数的值(有双引号包裹)
这种情况压力大一点,有双引号包裹。
如果引号没有被转义,我们可以先闭合引号,成为第三种情况后按照第三种情况来利用,如果引号被转义(addslashes)、我们也不必着急。
linux shell 环境下双引号中间的变量也是可以被解析的,我们可以在双引号内利用反引号执行任意命令 id
system("/bin/prog --p='$arg'");
//可控点是传入程序的某个参数的值(有单引号包裹)
这是最困难的一种情况
因为单引号内只是一个字符串,我们要先闭合单引号才可以执行命令。
如:system(“/bin/prog –p=’aaa’ | id”)
在漏洞检测中,除了有回显的命令注入
(比如执行dir 命令或者cat 读取系统文件);
还可以使用盲打
的方式,比如curl远程机器的某个目录(看access.log),或者通过dns解析的方式获取到漏洞机器发出的请求。
当我们确定了OS命令注入漏洞后,通常可以执行一些初始命令来获取有关受到破坏的系统的信息。
以下是在Linux和Windows平台上常用的一些命令的摘要:
命令分隔符
在Linux上, ; 可以用 |、|| 代替
前面的执行完执行后面的
|是管道符,显示后面的执行结果
||当前面的执行出错时执行后面的
可用**%0A和 \n**换行执行命令
在Windows上,不能用 ; 可以用&、&&、|、||代替
&前面的语句为假则直接执行后面的
&&前面的语句为假则直接出错,后面的也不执行
|直接执行后面的语句
||前面出错执行后面的
PHP 支持一个执行运算符:反引号(``) PHP 将尝试将反引号中的内容作为 shell 命令来执行,并将其输出信息返回
<?php echo `whoami`;?>
效果与函数 shell_exec() 相同,都是以字符串的形式返回一个命令的执行结果,可以保存到变量中
二.代码执行
此处以php为例,其它语言也存在这类利用。
(1) preg_replace()函数:
mixed preg_replace ( mixed $pattern , mixed $replacement , mixed $subject [,int $limit =-1[,int&$count ]])
当 p a t t e r n 处 存 在 e 修 饰 符 时 , pattern处存在e修饰符时,