ctfhub技能树_web_RCE之eval、文件包含
这次我们来看看RCE(远程代码/命令执行)吧。由于篇幅限制,这篇文章不包含命令注入,命令注入我会在另一篇文章中详细的记录。
eval执行
打开题目,可以看到网页的源代码

通过代码可以看到,这就是典型的web后门,配置中国蚁剑
进入后台,获取flag
文件包含
看看代码:

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:

则shell要传的参数是ctfhub:

查找flag:
1 | find / -name flag* |

得到flag:

php://input
首先看代码:

可以看到如果get的参数file前六个字符为”php://“则执行include函数
看看phpinfo
可以看到allow_url_include是On,说明可以使用php://input伪协议。
php://input 是个可以访问请求的原始数据的只读流。其实说白了它就是用来获取post内容的,但是其实只要你把内容写到请求包中,post和get都能获取。
那我们就通过这个伪协议和精心构造的请求包来获取我们想要的信息(注意此时虽然我是get请求而不是post,但由于我的包中有内容,所以伪协议依然是接收到了):

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

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

远程包含
看代码:

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

读取源代码

代码审计:

首先尝试php://input,发现没有返回结果
测试了好多遍都无果,那看来是没法用input了。再看题目,题目告诉我们了flag的路径,于是我们可以用另一条伪指令php://filter来进行读取
php://filter是一种元封装器, 设计用于数据流打开时的筛选过滤应用。简单理解就是个可以读取数据的过滤器。我们可以用它选择想要进行操作并读取的内容。
php://filter 目标使用以下的参数作为它路径的一部分。 复合过滤链能够在一个路径上指定。详细使用这些参数可以参考具体范例。
名称 | 描述 |
---|---|
resource=<要过滤的数据流> | 这个参数是必须的。它指定了你要筛选过滤的数据流。 |
read=<读链的筛选列表> | 该参数可选。可以设定一个或多个过滤器名称,以管道符(|)分隔。 |
write=<写链的筛选列表> | 该参数可选。可以设定一个或多个过滤器名称,以管道符(|)分隔。 |
<;两个链的筛选列表> | 任何没有以 read= 或 write= 作前缀 的筛选器列表会视情况应用于读或写链。 |
关于php://filter更多的妙用可以看这个大佬的文章。
知道了php://filter的用法,我们就可以读取flag了。

关于伪协议部分,这里是官方的文档。
至此,我们初步了解了文件包含和eval执行,解锁了对应的技能树,下一步,我们就来看看命令注入吧。