前言
文章所涉及的资料来自互联网整理和个人总结,意在于个人学习和经验汇总,如有什么地方侵权,请联系本人删除,谢谢!本文仅用于学习与交流,不得用于非法用途!
照抄参考了Anonymous师傅的文章:https://blog.csdn.net/qq_45521281/article/details/106425266
get_headers()函数
get_headers() 是PHP系统级函数,他返回一个包含有服务器响应一个 HTTP 请求所发送的标头的数组。 如果失败则返回 FALSE 并发出一条 E_WARNING 级别的错误信息(可用来判断远程文件是否存在)。
语法:
array get_headers ( string $url [, int $format = 0 ] )
CVE-2020-7066
PHP 7.2.29之前的7.2.x版本、7.3.16之前的7.3.x版本和7.4.4之前的7.4.x版本中的get_headers()
函数存在安全漏洞。攻击者可利用该漏洞造成信息泄露。
将get_headers()与用户提供的URL一起使用时,如果URL包含零(\ 0)字符,则URL将被静默地截断。
这个就是它函数可以触发CVE进行利用的点,为了更好的理解,附上一道CTF的题目流程
[GKCTF2020]cve版签到
打开题目
查看头部信息看到提示
可以看到PHP版本是7.3.15,还提示说host最后是123
非常符合该CVE漏洞的版本,先试试其它功能,看看有没有利用点
点一下View CTFHub
看到GET里面有url参数,后面跟着一个域名,输出的是一个数组,内容多半是url提交域名的头部,这个就是get_headers()
函数的输出内容
看到这里就不难猜出是需要利用CVE来截断url的传参来绕过匹配,读取自己的头部来获得flag
首页这里有提示
说的是只能访问末尾是.ctfhub.com
的url
那我们来构造payload
我们可以用%00来截断后面的.ctfhub.com
,就可以绕过过滤访问自己的头
再根据提示把末尾改为123
获得flag