文件包含漏洞-PHP伪协议
传入的file经过了过滤,但是没有过滤filter php://filter 协议
构造url ?file=php://filter/convert.base64-encode/resource=flag.php
?file=php://filter/read=convert.base64-encode/resource=flag.php
1.是格式
2.是可选参数,有read和write,字面意思就是读和写
3.是过滤器。主要有四种:字符串过滤器,转换过滤器,压缩过滤器,加密过滤器。filter里可以用1或多个过滤器(中间用|
隔开),这也为解题提供了多种方法,灵活运用过滤器是解题的关键。这里的过滤器是把文件flag.php
里的代码转换(convert)为base64编码(encode)
大写(转换)过滤器:string.toupper
4.是必选参数,后面写你要处理的文件名
php://filter还可以绕过,大概就是把不希望执行的语句先编码,这个编码类型可以破坏语句的正常执行
(比如base64编码只有64个字符,如果被编码的语句字符在64个字符里找不到对应的,就会忽略,略过它继续编码)
,然后再解码,这样就可以绕过这个语句了。
PHP的字符串解析特性
PHP将查询字符串(在URL或正文中)转换为内部关联数组 $_GET
或关联数组 $_POST
例如:/?foo=bar变成Array([foo] => “bar”)
值得注意的是,查询字符串在解析的过程中会将某些字符删除或用下划线代替
例如,/?%20news[id%00=42
会转换为Array([news_id] => 42)
如果一个IDS/IPS或WAF中有一条规则是当news_id参数的值是一个非数字的值则拦截,那么我们就可以用以下语句绕过:/news.php?%20news[id%00=42"+AND+1=0-
上述PHP语句的参数%20news[id%00
的值将存储到$_GET[“news_id”]
中。
PHP需要将所有参数转换为有效的变量名,因此在解析查询字符串时,它会做两件事:
1.删除前后的空白符(空格符,制表符,换行符等统称为空白符)
2.将某些字符转换为下划线(包括空格)
例如:
User input | Decoded PHP | variable name |
---|---|---|
%20foo_bar%00 | foo_bar | foo_bar |
foo%20bar%00 | foo bar | foo_bar |
foo%5bbar | foo[bar | foo_bar |
假如waf不允许num变量传递字母: http://www.xxx.com/index.php?num=aaaa //显示非法输入的话
那么我们可以在num前加个空格: http://www.xxx.com/index.php? num=aaaa //显示非法输入的话
这样waf就找不到num这个变量了,因为现在的变量叫" num",而不是"num"。但php在解析的时候,会先把空格给去掉,这样我们的代码还能正常运行,还上传了非法字符
某些过滤字符 可用chr进行绕过
密码总结:
base族
特征:base64,32密文都有等于号
base16
base16就是16进制转ASCII问题base16中只有数字0-9以及大写字母ABCDEF
base32
base32编码是由大写字母(A-Z)和数字234567组成与base64类似
解密网站:https://www.qqxiuzi.cn/bianma/base.php 里面也有详细的说明,有兴趣的自己看看
转化密文:MZWGCZZRGIZQ====
base64
base64是由大写字母(A-Z),小写字母(a-z),数字(0-9)以及+/组成
如果字符不足则会用“=”补齐,特征很明显。
转化密文:ZmxhZzEyMw==
凯撒密码
它是一种替换加密的技术,明文中的所有字母都在字母表上向后(或向前)按照一个固定数目进行偏移后被替