这次我们来看看RCE(远程代码/命令执行)吧。由于篇幅限制,这篇文章不包含命令注入,命令注入我会在另一篇文章中详细的记录。

eval执行

image-20200730155557512

打开题目,可以看到网页的源代码

image-20200728222754175

通过代码可以看到,这就是典型的web后门,配置中国蚁剑

image-20200730153921884

进入后台,获取flag

image-20200730153821908

文件包含

image-20200728223933664

看看代码:

image-20200728223945677

strpos(string,find,start) 函数查找字符串在另一字符串中第一次出现的位置

参数 描述
string 必需。规定要搜索的字符串。
find 必需。规定要查找的字符串。
start 可选。规定在何处开始搜索。
返回值: 返回字符串在另一字符串中第一次出现的位置,如果没有找到字符串则返回 FALSE。
注释:字符串位置从 0 开始,不是从 1 开始。

可以看到如果get传入参数file的值开头为xflag(x为任意字符),则执行include()函数。

include (或 require)语句会获取指定文件中存在的所有文本/代码/标记,并复制到使用 include 语句的文件中。

服务器后台有一句话木马shell.txt,因此我们的目标就是让服务器执行shell.txt中的语句。所以file的值为shell.txt

看看shell:

image-20200728224421429

则shell要传的参数是ctfhub:

image-20200730154818635

查找flag:

find / -name flag*

image-20200730154859368

得到flag:

image-20200730154918100

php://input

image-20200728230112933

首先看代码:

image-20200728230147871

可以看到如果get的参数file前六个字符为”php://“则执行include函数

看看phpinfo

image-20200728230338863

可以看到allow_url_include是On,说明可以使用php://input伪协议。

php://input 是个可以访问请求的原始数据的只读流。其实说白了它就是用来获取post内容的,但是其实只要你把内容写到请求包中,post和get都能获取。

那我们就通过这个伪协议和精心构造的请求包来获取我们想要的信息(注意此时虽然我是get请求而不是post,但由于我的包中有内容,所以伪协议依然是接收到了):

image-20200728231301739

这样我们就可以来找我们要的flag了

image-20200728231554765

有了flag的路径,就可以得到flag了。

image-20200728231744426

远程包含

image-20200728231924149

看代码:

image-20200728232001224

这个题的解法和上一题php://input一模一样,不再赘述。

image-20200728232316912

读取源代码

image-20200728232832725

代码审计:

image-20200728232902587

首先尝试php://input,发现没有返回结果

image-20200728233102208

测试了好多遍都无果,那看来是没法用input了。再看题目,题目告诉我们了flag的路径,于是我们可以用另一条伪指令php://filter来进行读取

php://filter是一种元封装器, 设计用于数据流打开时的筛选过滤应用。简单理解就是个可以读取数据的过滤器。我们可以用它选择想要进行操作并读取的内容。

php://filter 目标使用以下的参数作为它路径的一部分。 复合过滤链能够在一个路径上指定。详细使用这些参数可以参考具体范例。

名称 描述
resource=<要过滤的数据流> 这个参数是必须的。它指定了你要筛选过滤的数据流。
read=<读链的筛选列表> 该参数可选。可以设定一个或多个过滤器名称,以管道符(|)分隔。
write=<写链的筛选列表> 该参数可选。可以设定一个或多个过滤器名称,以管道符(|)分隔。
<;两个链的筛选列表> 任何没有以 read=write= 作前缀 的筛选器列表会视情况应用于读或写链。

关于php://filter更多的妙用可以看这个大佬的文章

知道了php://filter的用法,我们就可以读取flag了。

image-20200728232928462

关于伪协议部分,这里是官方的文档

至此,我们初步了解了文件包含和eval执行,解锁了对应的技能树,下一步,我们就来看看命令注入吧。


"Imagination will take you everywhere."