就是这样一个界面。
查看源码
提示有waf。
这里JS读取了calc.php这个页面的数据。
查看这个页面:
果然:
黑名单过滤了一些字符。
每当我输入字母,他就会直接报错,虽然不是黑名单中的字符,怎么也报错了,那就应该是一个waf的拦截了。
这里要绕waf,要绕过黑名单,最后用eval()函数执行PHP代码。
网上学的方法:地址
利用PHP字符串解析特性绕过waf:
我们知道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"]中。
HP需要将所有参数转换为有效的变量名,因此在解析查询字符串时,它会做两件事:
1.删除空白符
2.将某些字符转换为下划线(包括空格)
大致我理解的意思就是:
这里的waf会对num变量进行检查,看是不是含有字母,有字母就拦截,所以我们这里利用PHP解析特性,在num变量名中加入特殊字符,让waf识别不到这个变量,他就没办法检查,但是到了后端num变量又会被PHP解析成num,就不影响后面利用num变量的值执行PHP代码。
所以这里在num前面加空格绕waf。
过滤了很多函数,包括常用的system函数。
所以要用其他的方法了。