命令注入
命令注入漏洞是一种安全漏洞,攻击者可以通过向应用程序输入恶意命令,诱使系统执行这些命令,从而达到未授权访问、数据篡改、系统控制等目的。该漏洞通常出现在应用程序未对用户输入进行充分验证和清理时
常见管道符:
; 前面的执行完执行后面的
| 上一条命令的输出,作为下一条命令的参数(显示后面的执行结果)
|| 当前面的执行出错时(为假)执行后面的
& 将任务置于后台执行(不管前面是否为真都执行后面)
&& 前面的语句为假则直接出错,后面的也不执行,前面只能为真
%0a (换行)
%0d (回车)
如果出现乱码现象,可以如下更改
如下替换编码方式即可
low
ping 127.0.0.1试试,可以看到正常回显
执行 下面语句都可以,没有任何过滤
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// 检查是否通过 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// 检查是否通过 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// 检查是否通过 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// 检查表单是否提交
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();?>