CTF赛程结束后,Web题目环境关了不是太好复现,学习了下怎么用Dockerfile来重新搭建一下环境(只学会了怎么用,自己出题还是不会写,菜哭)
Docker简介
Docker常用命令
拉取镜像:
docker pull imagename
查看docker当前镜像:
docker images
新建一个docker容器,并映射端口号:
docker run -d -p host port:docker port imagename
用到的一些命令:
-d 后台运行
-P(大写) 随机把容器的端口映射到一个主机未使用的高端口
-p(小写) 格式为主机端口:容器端口 ,自选端口映射
-i 以交互模式运行容器,常与-t连用
-t 为容器重新分配一个伪输入终端,常与-i连用
查看运行中的docker容器:
docker ps -a
进入一个docker容器:
docker exec -it container—id bash
拷贝本地文件到docker:
docker cp /root/ container id:容器内路径(var/www/html)
开始/停止容器
docker start/stop container id
首先我们在github下载开源的Web题目源码
php4fun的好多challenge,选取了challenge2
利用xftp6将文件上传到服务器root文件夹下,cd命令进入该文件,
docker build -t w .
使用下载的dockerfile文件创建一个命名为w的镜像
新建容器,并随机分配端口
docker run -d -P w
访问32774端口,题目搭建完成
搭建时遇到的问题
docker: Error response from daemon: OCI runtime create failed: container_linux.go:345: starting container process caused "exec: \"httpd-foreground\": executable file not found in $PATH": unknown.
解决方案 更改文件权限
chmod +x httpd-foreground
解题payload:
PHP 复杂变量
PHP 中的变量用一个$+变量名来表示。变量区分大小写,我们还可以利用${xxx}的形式来表达一个变量。
函数、方法、静态类变量和类常量只有在 PHP 5 以后才可在 {$} 中使用。然而,只有在该字符串被定义的命名空间中才可以将其值作为变量名来访问。只单一使用花括号 ({}) 无法处理从函数或方法的返回值或者类常量以及类静态变量的值。
eval()函数函数的作用如下: eval() 函数把字符串按照 PHP 代码来计算。 该字符串必须是合法的 PHP 代码,且必须以分号结尾。
解题
题目意思:接受一个$_GET[‘str’]的传参,在经过addslashes()函数转义特殊符号与正则表达式检验之后,传入eval()当中拼接到$str=””;变量当中。
?str=${phpinfo()}
但phpinfo()并非变量名却依旧执行了该命令,在 php 中,可以接受函数的返回值作为变量名,而phpinfo()的返回值为TRUE,所以先将phpinfo()执行了,将返回值返回作为了变量名。
读取flag.php的内容:
?str=${eval($_REQUEST[c])}&c=system('cat *');
执行了eval($_REQUEST[c],并用其返回值表达了一个变量。