感觉自己越来越懒了这个文件创建了很久,但是一直没有做好总结

1.rce后拼接字符时绕过的方法

在xy时我碰到了新的绕过方法,之前我有了解到可以使用#和短标签<?=?>来进行绕过,但这次比赛并不可以。于是我就在网上找到了这个新方法。

使用phar文件尾来截断代码,实现绕过。

如标题当php文件在执行代码时遇到phar文件尾时效果与?>相似不会解析后面的代码也就不会出现后面的报错。

我们可以发现即使在文件尾后面出现严重的语法错误也不会报错程序会正常运行
那么在遇到如下代码时我们就可以尝试使用这个方法绕过

1
2
3
4
5
$cmd=$_POST[cmd];
if(preg_match("/#|<|>/",$cmd);){
die("nonono");
}
eval($cmd."lalalala");

当遇到如上的题目即可使用该方法绕过
1
cmd=phpinfo();__HALT_COMPILER();

2.在文件包含时使用php://filter伪协议的过滤器来任意构造字符串。

hxp CTF 2021 - The End Of LFI?
这篇文章写了在进行LFI进行文件包含时使用filter过滤器来构造字符。实现从文件包含到命令执行的漏洞升级。(只能说真的酷)
器原理时借助字符集转换时产生的一些字母,并使用convert.base64-encode过滤器会将非base64字符的给进行清除的特性来构造出字符。重复以上步骤就可以构造出自己想构造的字符。(发现这个的人太强了。orz)
在XY中考察的是利用过滤器和/etc/passwd文件构建XYCTF。这个构建方法光看文章是无法实现的。但是看着文章进行理解思考就可以写出来
这里我还有贴一下p牛的文章
谈一谈php://filter的妙用
只能说p牛不愧是p牛大佬好几年前玩剩下的,都够我这个渣渣喝上一壶
这篇文章提到了利用convert.base64-encode的宽泛性和string.strip_tags来绕过死亡exit
其中string.strip_tags可以直接删除标签内的内容,即其会删除如下字符串

1
2
<?phplalalalalla?>
<?lalallalalal

那么我们只要构造出XYCTF<?再加上这个过滤器不就迎刃而解了吗?

3.phar文件上传时的一些绕waf小技巧

参考文章phar反序列化总结

1.后缀或者文件头验证

phar文件的识别和使用phar://伪协议来时matedata序列化只与其文件尾有关即我们可以再文件头部添加照片文件的文件头或者随意修改后缀其并不影响其phar://对其的处理

2.检测phar文件尾

phar文件是必须要有文件尾才可以被phar://所识别,使用我们的phar文件是必须有HALT_COMPILER(),绕过方式也不难可以使用liunx的gzip来压缩文件,再压缩之后就不存在HALT_COMPILER()了,而且仍然可以被phar://所处理。

1
gzip phar.phar

3.无法再开头使用phar://来触发

这个的绕过方法有很多因为其只检测其是否在开头,我们只要使用伪协议嵌套即可绕过

1
2
3
4
5
6
7
 Bzip/Gzip 当环境限制了phar不能出现在前面的字符里。可以使用compress.bzip2://和compress.zlib://绕过
compress.bzip://phar:///test.phar/test.txt
compress.bzip2://phar:///home/sx/test.phar/test.txt
compress.zlib://phar:///home/sx/test.phar/test.txt
php://filter/resource=phar:///test.phar/test.txt
// 还可以使用伪协议的方法绕过
php://filter/read=convert.base64-encode/resource=phar://phar.phar

4.反序列化的小trick// 还可以使用伪协议的方法绕过

参考文章反序列化及常用trick
在写xy php套娃的题目时耗时最久的不是最后一个而是第一个,其中一个非常简单的trick给我搞忘了,这里记录一下

使用&来传址使得两个属性的值始终相等

学过c语言对传址应该不陌生即

1
2
$a=$_POST[1];
$b=&$a;

这时随便修改变量a,b也会发生改变

5.ssti的绕waf技巧

这个的内容有点太多了我就直接贴我看的文章就好了
以 Bypass 为中心谭谈 Flask-jinja2 SSTI 的利用
这篇文章几乎将所有的bypass技巧写了下来