命令执行
文章同步在我的个人博客https://quan9i.github.io/command/#more中,欢迎大家访问
有关信息
定义: 当应用需要调用一些外部程序去处理内容的情况下,就会用到一些执行系统命令的函数。如PHP中的system,exec,shell_exec等,当用户可以控制命令执行函数中的参数时,将可注入恶意系统命令到正常命令中,造成命令执行攻击。 漏洞成因: 命令执行漏洞形成的原因是web服务器对用户输入的命令安全监测不足,导致恶意代码被执行。 分类 1、系统命令执行漏洞:传入系统命令 2、PHP代码执行漏洞:传入PHP代码 漏洞危害 漏洞危害 继承Web服务程序的权限去执行系统命令或读写文件 反弹shell 控制整个网站甚至控制服务器 进一步内网渗透
连接符
A;B 先执行A,再执行B(仅linux可用)
A&B 简单拼接,A B之间无制约关系(仅window可用)
A&&B A执行成功,然后才会执行B(Windows和linux皆可)
A|B 显示B的执行结果(Windows和linux皆可)
A||B A执行失败,然后才会执行B(Windows和linux皆可)
Windows net 命令
Net ViewI
作用:显示域列表、计算机列表或指定计算机的共享资源列表。
Net User
作用:添加或更改用户帐号或显示用户帐号信息。
Net Use
作用:连接计算机或断开计算机与共享资源的连接,或显示计算机的连接信息。
Net Time
作用:使计算机的时钟与另一台计算机或域的时间同步。
Net Config
作用:显示当前运行的可配置服务,或显示并更改某项服务的设置。
linux 部分命令
who am i
作用:调用该命令时系统会输出当前用户的有效用户名
pwd
作用:在Linux层次结构中,想要知道当前所处的目录,可以用pwd命令,该命令显示整个路径名。
ifconfig:
作用:用于显示或设置网络设备。
dir:
作用:dir命令基本上会列出目录中的文件及子目录的名称,也可以列出其文件大小,创建时间等相关信息,并且列出所在的磁盘、可用空间等信息
DVWA实战
首先讲解遇到的一个小问题: 可能很多人在DVWA靶场会遇见一个现象:就是执行&& net user语句时无回显,这是因为net user 是针对Windows而言的,部分人的DVWA是在linux上的,因此在linux环境下执行Windows语句,不可能会出现回显,如果想查看当前用户 可以用linux中的whoami语句来进行
low
首先观察源码
<?php
if( isset($_POST['Submit'])){
$target = $_REQUEST[ 'ip' ];
if( stristr( php_uname( 's' ), 'Windows NT' ) ) {
$cmd = shell_exec( 'ping ' . $target );
}
else {
$cmd = shell_exec( 'ping -c 4 ' . $target );
}
echo "<pre>{$cmd}</pre>";
}
?>
涉及函数: php_uname — 返回运行 PHP 的系统的有关信息。 shell_exec() —是PHP中的一个内置函数,用于通过shell执行命令并以字符串的形式返回完整的输出。shell_exec是backtick操作符的别名,用于*nix。如果命令失败,则返回NULL,并且这些值对于错误检查不可靠。
stristr() —搜索字符串在另一字符串中的第一次出现。
'a':此为默认。
's':操作系统名称。
'n':主机名。
'r':版本名称。
'v':版本信息。
'm':机器类型。
先ping一下本地瞅瞅 再试着用拼接符执行一个语句 发现下方有回显,成功执行了,说明存在漏洞 接下来使用两个拼接符试试(pwd是unix的命令,用来显示整个路径名) 获取文件夹内文件名,如下图所示 列出了当前目录下的文件名,如果想进一步查看名,可如下图操作 这个漏洞可以更改用户信息,配置等,由此可见漏洞危害较大
medium
首先观察源码
<?php
if( isset( $_POST[ 'Submit' ] ) ) {
$target = $_REQUEST[ 'ip' ];
$substitutions = array(
'&&' => '',
';' => '',
);
$target = str_replace( array_keys( $substitutions ), $substitutions, $target );
if( stristr( php_uname( 's' ), 'Windows NT' ) ) {
$cmd = shell_exec( 'ping ' . $target );
}
else {
$cmd = shell_exec( 'ping -c 4 ' . $target );
}
echo "<pre>{$cmd}</pre>";
}
?>
涉及函数: array_keys:返回包含数组中所有键名的一个新数组 实例如下 str_replace:以其他字符替换字符串中的一些字符 实例如下
因为&&和;被注释掉了,因此我们在这里可以用;&进行绕过 同时呢,拼接符|和&都是可以使用的,如下图 可以发现注入成功了。
high
观察源码
<?php
if( isset( $_POST[ 'Submit' ] ) ) {
$target = trim($_REQUEST[ 'ip' ]);
$substitutions = array(
'&' => '',
';' => '',
'| ' => '',
'-' => '',
'$' => '',
'(' => '',
')' => '',
'`' => '',
'||' => '',
);
$target = str_replace( array_keys( $substitutions ), $substitutions, $target );
if( stristr( php_uname( 's' ), 'Windows NT' ) ) {
$cmd = shell_exec( 'ping ' . $target );
}
else {
$cmd = shell_exec( 'ping -c 4 ' . $target );
}
echo "<pre>{$cmd}</pre>";
}
?>
本关与上一关不同点在于更多的拼接符被过滤了(黑名单中增添了几个),但仔细观察后发现过滤拼接符|的时候后面多了个空格。因此我们可以利用|拼接符来进行注入 尝试注入 再试试其他语句 注入成功
impossible
观察源码
<?php
if( isset( $_POST[ 'Submit' ] ) ) {
checkToken( $_REQUEST[ 'user_token' ], $_SESSION[ 'session_token' ], 'index.php' );
$target = $_REQUEST[ 'ip' ];
$target = stripslashes( $target );
$octet = explode( ".", $target );
if( ( is_numeric( $octet[0] ) ) && ( is_numeric( $octet[1] ) ) && ( is_numeric( $octet[2] ) ) && ( is_numeric( $octet[3] ) ) && ( sizeof( $octet ) == 4 ) ) {
$target = $octet[0] . '.' . $octet[1] . '.' . $octet[2] . '.' . $octet[3];
if( stristr( php_uname( 's' ), 'Windows NT' ) ) {
$cmd = shell_exec( 'ping ' . $target );
}
else {
$cmd = shell_exec( 'ping -c 4 ' . $target );
}
echo "<pre>{$cmd}</pre>";
}
else {
echo '<pre>ERROR: You have entered an invalid IP.</pre>';
}
}
generateSessionToken();
?>
涉及函数 stripslashes:删除反斜杠: 实例如下 explode:把字符串打散为数组 实例如下 is_numeric:用于检测变量是否为数字或数字字符串。 sizeof:返回数组中元素的数目 实例如下 这次使用了白名单,要求输入的格式必须是xxx.xxx.xxx.xxx,而且必须是数字,因此不存在命令执行注入漏洞了 博主只是一个小白,如果哪里有问题还请各位师傅们多多指教。
|