命令注入
命令注入漏洞是一种安全漏洞,攻击者可以通过向应用程序输入恶意命令,诱使系统执行这些命令,从而达到未授权访问、数据篡改、系统控制等目的。该漏洞通常出现在应用程序未对用户输入进行充分验证和清理时
常见管道符:
php
; 前面的执行完执行后面的
| 上一条命令的输出,作为下一条命令的参数(显示后面的执行结果)
|| 当前面的执行出错时(为假)执行后面的
& 将任务置于后台执行(不管前面是否为真都执行后面)
&& 前面的语句为假则直接出错,后面的也不执行,前面只能为真
%0a (换行)
%0d (回车)
如果出现乱码现象,可以如下更改
如下替换编码方式即可
low
ping 127.0.0.1试试,可以看到正常回显
执行 下面语句都可以,没有任何过滤
php
127.0.0.1 ; date
127.0.0.1 || date
127.0.0.1 | date
127.0.0.1 & date
127.0.0.1 && date
源码审计
没有做任何过滤,很容易被攻击
php
<?php
// 检查是否通过 POST 方法提交了表单
if( isset( $_POST[ 'Submit' ] ) ) {
// 获取用户输入的 IP 地址
$target = $_REQUEST[ 'ip' ];
// 判断操作系统并执行 ping 命令
if( stristr( php_uname( 's' ), 'Windows NT' ) ) {
// 如果是 Windows 系统
$cmd = shell_exec( 'ping ' . $target );
}
else {
// 如果是类 Unix 系统
$cmd = shell_exec( 'ping -c 4 ' . $target );
}
// 将命令执行的结果反馈给用户
$html .= "<pre>{$cmd}</pre>";
}
?>
medium
经过测试,发现 **";" "&&"**被过滤了,其他的可以正常利用
源码审计
只过滤了**""&&" ";" **字符,不严格
php
<?php
// 检查是否通过 POST 方法提交了表单
if( isset( $_POST[ 'Submit' ] ) ) {
// 获取用户输入的 IP 地址
$target = $_REQUEST[ 'ip' ];
// 设置黑名单,列出需要过滤的字符
$substitutions = array(
'&&' => '', // 去掉 &&
';' => '', // 去掉 ;
);
// 将黑名单中的字符从输入中去除
$target = str_replace( array_keys( $substitutions ), $substitutions, $target );
// 判断操作系统并执行 ping 命令
if( stristr( php_uname( 's' ), 'Windows NT' ) ) {
// 如果是 Windows 系统
$cmd = shell_exec( 'ping ' . $target );
}
else {
// 如果是类 Unix 系统
$cmd = shell_exec( 'ping -c 4 ' . $target );
}
// 将命令执行的结果反馈给用户
$html .= "<pre>{$cmd}</pre>";
}
?>
high
通过测试以及对源码的审核,发现一处过滤不严格的地方,这个只是过滤了 '| ' 这样的模式,如果**|** 后面不加空格则无法过滤
可以正常回显
源码审计
php
<?php
// 检查是否通过 POST 方法提交了表单
if( isset( $_POST[ 'Submit' ] ) ) {
// 获取用户输入,去除多余空格
$target = trim($_REQUEST[ 'ip' ]);
// 设置黑名单,列出需要剔除的字符
$substitutions = array(
'&' => '', // 去掉 &
';' => '', // 去掉 ;
'| ' => '', // 去掉 | //此处过滤不严格,用户可以通过 |date 来绕过
'-' => '', // 去掉 -
'$' => '', // 去掉 $
'(' => '', // 去掉 (
')' => '', // 去掉 )
'`' => '', // 去掉 `
'||' => '', // 去掉 ||
);
// 将黑名单中的字符替换为空
$target = str_replace( array_keys( $substitutions ), $substitutions, $target );
// 判断操作系统并执行 ping 命令
if( stristr( php_uname( 's' ), 'Windows NT' ) ) {
// 如果是 Windows 系统
$cmd = shell_exec( 'ping ' . $target );
}
else {
// 如果是类 Unix 系统
$cmd = shell_exec( 'ping -c 4 ' . $target );
}
// 将命令执行的结果反馈给用户
$html .= "<pre>{$cmd}</pre>";
}
?>
impossible
源码审计
采用了白名单过滤,总体来说更加安全
php
<?php
// 检查表单是否提交
if( isset( $_POST[ 'Submit' ] ) ) {
// 检查反跨站请求伪造(Anti-CSRF)令牌
checkToken( $_REQUEST[ 'user_token' ], $_SESSION[ 'session_token' ], 'index.php' );
// 获取输入
$target = $_REQUEST[ 'ip' ];
$target = stripslashes( $target ); // 去除输入字符串中的反斜杠
// 将IP地址分割成4个八位字节
$octet = explode( ".", $target );
// 检查每个八位字节是否为整数
if( ( is_numeric( $octet[0] ) ) && ( is_numeric( $octet[1] ) ) && ( is_numeric( $octet[2] ) ) && ( is_numeric( $octet[3] ) ) && ( sizeof( $octet ) == 4 ) ) {
// 如果四个八位字节都是整数,则重新组合IP地址
$target = $octet[0] . '.' . $octet[1] . '.' . $octet[2] . '.' . $octet[3];
// 确定操作系统并执行ping命令
if( stristr( php_uname( 's' ), 'Windows NT' ) ) {
// Windows系统
$cmd = shell_exec( 'ping ' . $target );
}
else {
// Unix/Linux系统
$cmd = shell_exec( 'ping -c 4 ' . $target );
}
// 向用户提供反馈
$html .= "<pre>{$cmd}</pre>";
}
else {
// 出现错误,告知用户输入的IP无效
$html .= '<pre>ERROR: You have entered an invalid IP.</pre>';
}
}
// 生成反跨站请求伪造令牌
generateSessionToken();
?>