Fork me on github

BUUCTF | [RoarCTF 2019]Easy Calc

解题过程

    打开靶机,原以为是注入,尝试注入后无果后,查看代码源发现两处有用的信息。

 

先将calc.php输入url栏里打开,查看:

 

 

WAF源码,分析代码:

  1. 需要传入变量num的值
  2. 设置了一系列黑名单的值
  3. 如果传入的变量num中有黑名单包括的符号,将终止程序
  4. 否则将输出num的内容
  5. 假如waf不允许num变量传递字母:

    http://www.xxx.com/index.php?num = aaaa //显示非法输入的话

    那么我们可以在num前加个空格:

    http://www.xxx.com/index.php? num = aaaa

    这样waf就找不到num这个变量了,因为现在的变量叫“ num”,而不是“num”。但php在解析的时候,会先把空格给去掉,这样我们的代码还能正常运行,还上传了非法字符。

 WAF限制了参数num,将传入的参数'num'前添加空格,即'? num'可绕过WAF的判断。然后我们要列出参数目录中的文件和目录,

要不然我们怎么知道flag在哪,因此我们要用到函数scandir()。scandir() 函数返回指定目录中的文件和目录的数组。

var_dump() 函数用于输出变量的相关信息。

var_dump() 函数显示关于一个或多个表达式的结构信息,包括表达式的类型与值。数组将递归展开值,通过缩进显示其结构。

? num=1;var_dump(scandir(chr(47)))

 

发现有flagg这个文件,他一应该就是目标了,我们要用file_get_contents()函数来查询信息

file_get_contents() 把整个文件读入一个字符串中。

该函数是用于把文件的内容读入到一个字符串中的首选方法。如果服务器操作系统支持,还会使用内存映射技术来增强性能。

? num=1;var_dump(file_get_contents(chr(47).chr(102).chr(49).chr(97).chr(103).chr(103)))
 1.知识点
1.1PHP的字符串解析特性

这是别人对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”]中。

HP需要将所有参数转换为有效的变量名,因此在解析查询字符串时,它会做两件事:

1.删除空白符

2.将某些字符转换为下划线(包括空格) 

 

posted @ 2021-02-04 10:45  北孤清茶。  阅读(203)  评论(0编辑  收藏  举报