当你的才华
还撑不起你的野心时
那你就应该静下心来学习
代码审计学习线上实验,都是CE一边实操,一边整理的笔记,方便以后翻看时,可快速查阅。
目录
命令注入漏洞产生的原因
命令注入攻击可被攻击者用来导入代码到某特定的计算机程序,以改变程序的运行进程或目的。 PHP命令注入则是由于Web应用程序对用户提交的数据过滤不严格,导致黑客可以通过构造特殊命令字符串的方式,将数据提交至Web应用程序中,并利用该方式执行外部程序或系统命令实施攻击,非法获取数据或者网络资源等
简介
国内著名的PHP应用程序,如discuz!、Dedecms等大型程序在网络中均被公布过存在命令注入攻击漏洞,黑客可以通过命令注入攻击漏洞快速获取网站权限,进而实施挂马、钓鱼等恶意攻击,造成的影响和危害十分巨大。
同时,目前PHP语言应用于Web应用程序开发所占比例较大,Web应用程序员应该了解命令注入攻击漏洞的危害。
需要注意PHP命令注入和sql注入、PHP代码执行漏洞的区别:
-
命令注入漏洞是指注入可以执行的系统命令(如windows中的
CMD
命令、linux中的Bash
命令)并执行
相关函数:
system()、exec()、passthru()、shell_exec()、popen()、proc_open()、pcntl_exec()
一共7个函数。
命令注入函数,分为三类
第一类函数
包括system()、exec()、shell_exec()、passthru()
可以直接传入命令执行并返回结果,其中system()最简单,不需要输出函数,会自动打印命令执行结果,所以这里我们先讲解system()函数
代码如下,变量 $id 获取 get 方式传递的变量名为 bash 的变量值(值为一个字符串),然后传入system()函数被当作命令执行:
通过代码分析,构造我们的payload为:?bash=pwd时,页面就能成功返回当前当前.PHP文件所在目录的地址
其他几个函数类似相同的道理,比如exec()、shell_exec()、passthru()函数,大家自己手动试试吧。
exec() 函数
- <?PHP
- $id = $_GET['bash'];
- $get = exec("$id");
- echo $get;
sehll_exec 函数
- <?PHP
- $id = $_GET['bash'];
- $get = shell_exec("$id");
- echo $get;
第二类函数
说明:
resource popen ( string $command , string $mode )
打开一个指向进程的管道,该进程由派生给定的 command 命令执行而产生
- 第一个参数 $command 会被当作命令执行
- 第二个参数 $mode 决定执行模式,有两个取值
r
或者w
,来指明是读
还是写
包括popen()、proc_open()
,当使用这类函数传入命令时,命令会执行,但不会返回执行结果。
代码如下,
- <?PHP
- $bash = $_GET['bash'];
- popen("$bash",'r');
通过代码分析,构造我们的payload为:?bash=ifconfig >> /tmp/popen.txt时,页面没有返回信息,但我们这行命令的意思是将ifconfig 输出的信息写道路径为/temp 下的popen.txt里。
第三类函数
说明:
• void pcntl_exec ( string $path [, array $args [, array $envs ]] )
$path 为可执行程序的路径,如果是perl或者Bash脚本,则需要在文件头加上 #!/bin/bash
来标识可执行程序路径,args 表示传递给args表示传递给path程序的参数,$envs 则是执行这个程序的环境变量。
参考链接:https://www.shiyanlou.com/courses/895
命令注入漏洞防范
通常我们可以使用白名单对用户输入进行过滤,这是一种通用的手段。
除此之外这里有几项具体的建议:
我不需要自由,只想背着她的梦
一步步向前走,她给的永远不重