代码审计的一些套路总结

[buuctf] [HCTF 2018]WarmUp strpos/substr截取代码

首先来看源码:

1
2
3
4
5
6
7
8
<?php
function(&$_page){
$_page = mb_substr(
$_page,
0,
mb_strpos($_page . '?', '?')
);
}

特别注意的点就是:
这里substr截取代码时的第三个参数是截取代码的长度,第二个参数是开始的长度
而巧妙之处就在于:

1
mb_strpos($_page,'?','?')

这段代码将page手动加了一个?然后探测?的位置,而在主流编程语言中,字符串位置的参数都是从0开始的,例如我要探测:

1
mmk&nina?

这里?的位置在参数8的位置,而截取的时候,长度是8,所以刚好把?前面的截取走了,并没有包含?
这里就可以解释为什么buuctf那道题的payloads为:

1
/?file=hint.php?/../../../../ffffllllaaaagggg

为什么本应是../../../../ffffllllaaaagggg,还在前面多加了一个/,因为函数把?前面的字符全部截取走了,只剩下?和前面多加的/以及后面的路径: ../../../../flag,这里的/是include的分割符号

详细见[HCTF 2018]WarmUp1的wp。