BUU Web[17-20]

[RoarCTF 2019]Easy Calc

解题思路

看到输入框下意识尝试sql注入和SSTI,无果,查看源码
calc.php
发现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.';');
}
?> 

可以看到考点是通过构造str的值来进行命令执行,而str就是num,进行了黑名单筛选,访问
http://node4.buuoj.cn:29026/calc.php?num=phpinfo()
理论上能通过过滤,如下图所示
test
但是在本题中不知道为什么不行,我的猜测是:
在/calc.php代码解析之前,先经过waf检测,但是具体waf规则不知道,大概就是只允许num的值为数字
403 forbidden
这里需要尝试绕过waf检测,涉及到的知识点是PHP的字符串解析特性
PHP将查询字符串(在URL或正文中)转换为内部$_GET或的关联数组$_POST。例如:/?foo=bar变成Array([foo] => "bar")。值得注意的是,查询字符串在解析的过程中会将某些字符删除或用下划线代替。例如,/?%20news[id%00=42会转换为Array([news_id] => 42)
PHP需要将所有参数转换为有效的变量名,因此在解析查询字符串时,它会做两件事:

1.删除空白符
2.将某些字符转换为下划线([)

因此这里我们通过在num前加空格构造payload:
? num=phpinfo()

查看disable_functions,可以看到system、exec、passthru和shell_exec都被禁用了disable-functions因此我们尝试使用scan_dir配合print_r或者var_dump来进行目录读取,file_get_contents进行文件读取。注意到引号被过滤了,因此需要使用chr绕过waf
? num=var_dump(scandir(chr(47)))
f1agg
可以看到有一个名为f1agg的文件,查看:
? num=file_get_contents(chr(47).chr(102).chr(49).chr(97).chr(103).chr(103))
在这里插入图片描述

总结

  • PHP的字符串解析特性
    PHP将查询字符串(在URL或正文中)转换为内部$_GET或的关联数组$_POST。例如:/?foo=bar变成Array([foo] => "bar")。值得注意的是,查询字符串在解析的过程中会将某些字符删除或用下划线代替
  • scan_dir配合print_r或者var_dump来进行目录读取,file_get_contents进行文件读取

[ACTF2020 新生赛]BackupFile

解题思路

根据提示,找到备份文件index.php.bak
index.php.bak查看文件,得到index.php源码

<?php
include_once "flag.php";

if(isset($_GET['key'])) {
    $key = $_GET['key'];
    if(!is_numeric($key)) {
        exit("Just num!");
    }
    $key = intval($key);
    $str = "123ffwsfwefwf24r2f32ir23jrw923rskfjwtsw54w3";
    if($key == $str) {
        echo $flag;
    }
}
else {
    echo "Try to find out source file!";
}

可以看到,我们需要传入一个参数key等于str,但是key只能为数字,这里需要用到PHP的弱类型比较:当字符串与数字比较的时候,会提取字符串从开头到第一个非数字之间的数字作为比较的值
所以这里我们只需要传入key=123即可
key=123

总结

  • index.php文件备份名
    • “.git” 、“.svn”、“ .swp”“.~”、“.bak”、“.bash_history”、“.bkf”
  • PHP弱类型比较

[极客大挑战 2019]BuyFlag

解题思路

f12查看源码,发现pay.php(其实右上角的paymenu也能看到)
pay.php
共有三个条件
money

cookie&passwordf12查看源码,发现提示,money和password都是需要POST,password弱类型比较绕过即可,或者可以用截断的方法也可以

//~~~post money and password~~~
if (isset($_POST['password'])) {
	$password = $_POST['password'];
	if (is_numeric($password)) {
		echo "password can't be number</br>";
	}elseif ($password == 404) {
		echo "Password Right!</br>";
	}
}

通过观察数据包发现最后一个条件在cookie有一个user=0,顺手把user=0改成user=1,最后的数据包长这样
burp数据包final
得到flag

总结

  • is_numeric()是检测变量是否为数字或者数字字符串,is_numeric函数对于空字符%00,无论是%00放在前后都可以判断为非数值,而%20空格字符只能放在数值后
  • 需要更改三个部分,这样就可以解决burpsuite无法识别POST参数的问题
    POST数据包修改

[护网杯 2018]easy_tornado

解题思路

打开网站可以看到三个文件,一一查看
flag.txt:提示flag在fllllllllllllag中
flag.txt
welcome.txt:应该和渲染有关,那可能是SSTI
welcome.txt
hints.txt:结合访问的url:file?filename=/flag.txt&filehash=9e41f2b3c8a672145378c791e19b9c5a,应该是hash的生成方法
hints.txt
尝试访问/fllllllllllllag,发现会出错,这是显然的,因为文件hash对不上,但是值得注意的是,url中的msg被渲染出来了
访问/fllllllllllllag因此尝试SSTI,搜索文档获取cookie_secret,发现这个:
Application.settings
cookie_secretApplication对象settings的属性中 ,访问它的话就需要知道它的属性名字
self.application.settings有一个别名是RequestHandler.settings,其中handler又是指向处理当前这个页面的RequestHandler对象,RequestHandler.settings指向self.application.settings,因此handler.settings指向RequestHandler.application.settings

因此得到cookie_secret:c1cec204-a381-401e-9117-b0f9764b3aff

cookie_secret
按照hints处理后作为filehash的值访问fllllllllllllag
flag

总结

  • tornado
    • 模板格式类似于jinjia2
    • cookie_secretApplication对象settings的属性中 ,访问它的话就需要知道它的属性名字
      self.application.settings有一个别名是RequestHandler.settings,其中handler又是指向处理当前这个页面的RequestHandler对象,RequestHandler.settings指向self.application.settings,因此handler.settings指向RequestHandler.application.settings
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值