[RoarCTF 2019]Easy Calc

今天是简单的计算器
在这里插入图片描述
输什么出什么,猜想应该就是直接把这段拿去当系统命令了,看看源代码
在这里插入图片描述这里通过ajax远程加载calc.php

Ajax即Asynchronous Javascript And XML(异步JavaScript和XML)在 2005年被Jesse James Garrett提出的新术语,用来描述一种使用现有技术集合的‘新’方法,包括: HTML 或 XHTML, CSS, JavaScript, DOM, XML, XSLT, 以及最重要的XMLHttpRequest。 [3] 使用Ajax技术网页应用能够快速地将增量更新呈现在用户界面上,而不需要重载(刷新)整个页面,这使得程序能够更快地回应用户的操作。

这里去访问一下calc,php
在这里插入图片描述
又有源码,可以看到这里直接使用php的echo命令来进行计算,没动点脑筋,我还以为计算器是他自己写的🙃,那就是命令注入了,需要绕过前面的命令
下面的过滤会对黑名单中的每一个值都拿出来连接成正则表达式的字符串,/m表示多行查找,下面是一些参数用法

/i (忽略大小写)
/g (全文查找出现的所有匹配字符)
/m (多行查找)
/gi(全文查找、忽略大小写)
/ig(全文查找、忽略大小写)

简单地说就是不能有这些东西,剩下的就是专业知识了,涉及到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.将某些字符转换为下划线(包括空格)

下面是我的理解,其实就是这个题还有一个WAF,不是这个calc.php里面的,因为可以发现,在输入num=字母的时候就会报错,但是并没有看到过滤,可能是index.php里面的过滤,但是看不到源码,只能猜测,这里有一个技巧就是WAF只过滤num参数,但是如果加一个空格变成 【空格】num,那么WAF检测不到是num参数就不会过滤,但是php是能够检测到,也就是说在php里面num=【空格】num,这样构造参数就完成了WAF绕过
综上所述,我们需要加一个空格在传的参数前面,然后就是绕过引号,因为system函数中的内容必须要引号,所以这一条就不行了,但是首先我们要先扫根目录下的所有文件,这里用到的是scandir("/"),但是“/”被过滤了,所以我们用chr(“47”)绕过,发现flagg文件
在这里插入图片描述同样的方式去读文件

payload=calc.php? num=1;var_dump(file_get_contents(chr(47).chr(102).chr(49).chr(97).chr(103).chr(103)))

在这里插入图片描述
出来了,php处理参数方式还得好好学一学

posted @ 2021-08-26 23:49  pinfu  阅读(87)  评论(0)    收藏  举报