[RoarCTF 2019]Easy Calc 手把手教会你
[RoarCTF 2019]Easy Calc 手把手教会你
目录
- [RoarCTF 2019]Easy Calc 手把手教会你
- 了解Calc
- 题目分析
了解Calc
很多人都不知道calc()是什么,那今天就来学习calc(),学习之前我们有必要先知道calc()是什么?只有知道了他是个什么东西?在实际运用中才能更好的使用他。那接下来就围绕calc()展开。
calc()是什么?
calc()从字面我们可以把他理解为一个函数function。其实calc是英文单词calculate(计算)的缩写,是css3的一个新增的功能,用来指定元素的长度。比如说,你可以使用calc()给元素的border、margin、pading、font-size和width等属性设置动态值。为何说是动态值呢?因为我们使用的表达式来得到的值。不过calc()最大的好处就是用在流体布局上,可以通过calc()计算得到元素的宽度。
calc()能做什么?
calc()能让你给元素的做计算,你可以给一个div元素,使用百分比、em、px和rem单位值计算出其宽度或者高度,比如说“width:calc(50% + 2em)”,这样一来你就不用考虑元素DIV的宽度值到底是多少,而把这个烦人的任务交由浏览器去计算。
calc()语法
calc()语法非常简单,就像我们小时候学加 (+)、减(-)、乘(*)、除(/)一样,使用数学表达式来表示:.elm {undefined
width: calc(expression);
}
其中"expression"是一个表达式,用来计算长度的表达式。
calc()的运算规则
calc()使用通用的数学运算规则,但是也提供更智能的功能:
1、使用“+”、“-”、“*” 和 “/”四则运算;
2、可以使用百分比、px、em、rem等单位;
3、可以混合使用各种单位进行计算;
4、表达式中有“+”和“-”时,其前后必须要有空格,如"widht: calc(12%+5em)"这种没有空格的写法是错误的;
5、表达式中有“*”和“/”时,其前后可以没有空格,但建议留有空格。
题目分析
经过上面的简单介绍,知道了calc不过是一个函数,可以实现网页里的加减乘除功能,我们打开我们的url,发现也是一个实现运算的功能。如图;
我们输入了1+1.发现确实有加减乘除的功能
查看源代码,可以发现是有WAF的,且存在一个calc.php文件
貌似发现了新大陆,我们尝试进入calc.php?num=1试试
果然不出所料,但传入字母就会报错,这里应该是被WAF文件给拦截了。
要对这WAF进行绕过,这里就涉及到一个知识点了。
PHP的字符串解析特性
我们知道PHP将查询字符串(在URL或正文中)转换为内部 G E T 或 的 关 联 数 组 _GET或的关联数组 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.将某些字符转换为下划线(包括空格)
在了解到PHP的字符串解析之后,我们思考一个问题,WAF它不让num参数传入字母,所以我们不能让WAF文件检测到字母,但是我们又需要传入字母来构成我们的命令,这种情况下我们该怎么对其进行绕过呢?
绕过方法
因为num不可以传入字母,但是我们在num参数之前添加一个空格,这样在PHP的语言特性下会默认删除这个空格,但是WAF会因为这个空格导致检测不到num这个参数,最终导致WAF被绕过。
Payload
http://node4.buuoj.cn:29240/calc.php?num=a 被拦截
http://node4.buuoj.cn:29240/calc.php? num=a 绕过WAF
现在我们就对WAF进行了绕过,接下来就是一些常规操作了。
http://node4.buuoj.cn:29240/calc.php? num=var_dump(scandir(chr(47)))
scandir():列出 参数目录 中的文件和目录,要不然我们怎么知道flag在哪。
因为过滤了"/"符号,所以我们用chr(47)进行绕过
最终Payload
http://node4.buuoj.cn:29240/calc.php? num=var_dump(file_get_contents(chr(47).chr(102).chr(49).chr(97).chr(103).chr(103)))