攻防世界题目练习——Web难度1,2024年最新2024网络安全目前最稳定和高效的UI适配方案

根据WriteUp提示先f12查看源码,发现了文件包含的漏洞点lan.php文件,如图:
在这里插入图片描述
$lan的值来自cookie中的language值,并且注意,include中有".php"字符串和$lan进行拼接,因此注意包含的时候不要带后缀以免重复。

对网页进行抓包,修改cookie,在cookie的内容中使用php://filter伪协议来进行任意文件读取:
language=php://filter/read=convert.base64-encode/resource=/var/www/html/flag
然后重放包:
在这里插入图片描述
将之前的内容进行base64解密得到flag。

2. fileclude

打开网址看到源码:
在这里插入图片描述
分析源码可以看到,存在flag.php这个文件。

继续看后面的代码,需要GET “file1”、"file2"两个参数,因此在url上需要构造
?file1=.. & file2=..这个形式的链接。

继续看后面的分析,需要获取file2中的内容为"hello ctf",然后将file1包含,这个file1就是我们文件包含漏洞可以利用的地方,将查看flag.php作为file1的内容被包含进去,此处可以利用php://filter伪协议来进行任意文件读取,内容如下:
file1=php://filter/read=convert.base64-encode/resource=flag.php

接下来考虑file2对file_get_contents函数的绕过,需要我们传入的file2文件内容为"hello ctf"才会进行下一步判断。
各个伪协议的含义参考该博客:CTF伪协议绕过file_get_contents
将几个本题用到的伪协议的含义贴在这里:
php://filter的作用是:读取源代码并进行base64编码输出
php://input 可以访问请求的原始数据的只读流(即可以直接读取到POST上没有经过解析的原始数据),将post请求中的数据作为PHP代码执行。
(注意:在“enctype="multipart/form-data"的时候 php://input 是无效的)

可以通过php://input来在post的请求体中进行内容的上传,也就是构造file2=php://input后,BurpSuite进行抓包,在请求体中添加内容 “hello ctf”

构造包与响应结果如下:
在这里插入图片描述
将响应包最后的加密内容用base64解密即可获得flag。

3. easyphp

打开链接看到源代码进行分析:
在这里插入图片描述
看到最后当 $key1$key2都不为0时可以拿到flag,因此需要让我们构造的参数的值满足前面的条件。
$a$b都是直接从GET获得参数。
isset()函数判断变量是否已经声明,参考博客:
PHP中isset函数的用法
intval()函数获取变量的整数值,具体用法参考博客:
php特性之intval学习小记
substr(string,start,length)函数返回字符串的一部分,start:负数 - 在从字符串结尾开始的指定位置开始;length:正数 - 从 start 参数所在的位置返回的长度,负数 - 从字符串末端返回的长度,如果 start 参数是负数且 length 小于或等于 start,则 length 为 0。
参考博客:
PHP substr() 函数

接下来, $a需要满足的条件有:
$a转换为整型后的值>6000000,且 $a的长度<=3。
根据函数intval()的参考博客我们知道,有1e这种格式可以用来表示10的多少次方,6e6就表示6*10^6也就是6000000,可以满足我们长度<=3的要求,因此可以构造:

a=7e6

接下来看 $b需要满足的条件:
substr(md5( $b),-6,6)表示将 $b用md5加密后的字符串从倒数第6个字符开始向后数6个字符,也就是最后6个字符,要求最后6个字符为’8b184b’。
这个需要写一个哈希碰撞的脚本,脚本如下:

import hashlib
for i in range(10000000):
i=str(i)
m=hashlib.md5(i.encode(encoding=‘UTF-8’))
psw=m.hexdigest()
#hash.hexdigest(),返回摘要,作为十六进制数据字符串值
#hash.digest(),返回摘要,作为二进制数据字符串值
if psw.endswith(“8b184b”):
print(i)
运行结果:
53724
7597945

因此可以构造:

b=53724

参考博客:
根据部分MD5数据解码原数据
python3中digest()和hexdigest()区别

接下来看参数c部分的代码:
首先参考博客:
json_decode详解
了解json_decode函数,它对JSON格式的字符串进行编码,源码中前面添加了(array),则是将其转换为Array类型。
因此我们构造的c应该是JSON格式的字符串,例如:

$json = ‘{“a”:“php”,“b”:“mysql”,“c”:3}’;
#其中a为键,php为a的键值。

其以Array格式输出的内容为:

Array (
[a] => php
[b] => mysql
[c] => 3 )

echo $json_Array[‘a’];
程序输出:php

再看源码要求:

!is_numeric(@$c[“m”]) && $c[“m”] > 2022

要求$c[“m”]不是数字字符串并且 $c[“m”] > 2022,根据我们前面
攻防世界题目练习——Web难度1(一)中的12.simple_php中学到的is_numeri绕过,

可以构造"m":"2023a"

再看对$c的"n"的要求:

if(is_array(@KaTeX parse error: Expected 'EOF', got '&' at position 9: c["n"]) &̲& count(c[“n”]) == 2 && is_array($c[“n”][0])){
$d = array_search(“DGGJ”, $c[“n”]);
d = = = f a l s e ? d i e ( " n o . . . " ) : N U L L ; f o r e a c h ( d === false?die("no..."):NULL; foreach( d===false?die("no..."):NULL;foreach(c[“n”] as k e y = > key=> key=>val){
$val===“DGGJ”?die(“no…”):NULL;
}
$key2 = 1;
}

is_array()判断是否是数组变量:PHP is_array()函数详解,PHP判断是否为数组
count()返回数组中元素的数目:PHP count() 函数
array_search("DGGJ", $c["n"])在数组 $c[“n”]中搜索键值 “DGGJ”,并返回它的键名:PHP array_search() 函数

foreach($c["n"] as $key=>$val)
foreach仅能用于遍历数组,每次循环中,当前单元的键值被赋给 $val,当前单元的键名也会在每次循环中被赋给变量 $key。参考博客:PHP: foreach - Manual

因此我们可以读懂对"n"的要求:
是数组、数组有2个元素、且第一个元素是数组。
if里面的内容:
$d = array_search("DGGJ", $c["n"]);要求存在键值"DGGJ";
后面foreach循环又说明遇到值为"DGGJ"的就退出;
这里看起来很矛盾,因此需要绕过其中一个条件。
参考博客的题解:
CTF之旅WEB篇(8)–[xctf] 江苏工匠杯easyphp
指出array_search()函数可以绕过,我们学习一下这个函数:
PHP: array_search - Manual
江苏工匠杯easyphp(array_search绕过)
array_search(mixed $needle, array $haystack, bool $strict = false): int|string|false
我们可以知道这个函数有3个参数,第3个参数通常默认为false,如果可选的第三个参数 strict 为 true,则 array_search() 将在 数组 中检查完全相同的元素。 这意味着同样严格比较前两个参数的类型。
因此当第3个参数为false时,就导致了弱类型比较漏洞,也就是这个函数的比较相当于在用"=="进行比较。
举例:
“admin”==0 //admin被转换成数字,由于admin是字符串,转换失败,int(admin)=0,所以比较结果是true。参考文章:【从零开始学CTF】4、PHP中的弱类型比较
因为本题中字符串"DGGJ"是没有数字的字符串,因此,当我们的$c[“n”]=0的时候(或者null),会将前面要查找的字符串自动转化为0然后进行比较。只需要保证在c[“n”]中非0下标的元素中存在值0即可,在php中"字符串"==0是成立的。

所以构造"n":[[],0]

其中[]是短数组语法,参考博客:PHP: Array 数组 - Manual

综上,构造url的GET参数为:
?a=7e6&b=53724&c={"m":"2023a","n":[[],0]}
成功获取flag

4. file_include

题目源码如下:

<?php highlight\_file(\_\_FILE\_\_); include("./check.php"); if(isset($\_GET['filename'])){ $filename = $\_GET['filename']; include($filename); } ?>

用御剑扫描目录后知道同一目录下存在flag.php文件。
尝试用php://filter/read=convert.base64-encode/resource=flag.php获取flag,出现报错提示:“do not hack”。
后又尝试了data://text/plain、php://input,想上传可执行命令或者木马来查看flag都失败了,页面没有任何反应。
查看WriteUp,他们说有存在一些字符过滤,可能对base64、read都进行了过滤。
看了他们的解答知道了有另一种转换过滤器iconv.* 可以用,具体参考博客:
详解php://filter以及死亡绕过

还是不懂加不加"read="有什么区别。

从博客知道convert.iconv.<input-encoding>.<output.encoding>支持多种编码方式,并且存在后面两个位置都要进行编码方式的设置。
需要构造url如下:
?filename=php://filter/convert.iconv.xx.xx/resource=flag.php

于是用BurpSuite对这两个位置用convert.iconv*支持的几种编码方式进行爆破。
支持的编码方式参考官方文档:PHP: Supported Character Encodings - Manual
筛选了一些常用的编码方式作为字典进行爆破:

UCS-4*
UCS-4BE
UCS-4LE*
UCS-2
UCS-2BE
UCS-2LE
UTF-32*
UTF-32BE*
UTF-32LE*
UTF-16*
UTF-16BE*
UTF-16LE*
UTF-7
UTF7-IMAP
UTF-8*
ASCII*

在一堆爆破结果返回长度较长的结果中查看他们的响应报文,找到flag显示比较正常的那些,如下图:
在这里插入图片描述

5. unseping

先放两篇参考文献,等我看懂再写
unseping
PHP反序列化漏洞详解(万字分析、由浅入深)

要看懂WriteUp,首先要理解php反序列化漏洞的原理,参考文献如上。

网页源码如下:

<?php highlight\_file(\_\_FILE\_\_); class ease{ private $method; private $args; function \_\_construct($method, $args) { $this->method = $method; $this->args = $args; } function \_\_destruct(){ if (in\_array($this->method, array("ping"))) { call\_user\_func\_array(array($this, $this->method), $this->args); } } function ping($ip){ exec($ip, $result); var\_dump($result); } function waf($str){ if (!preg\_match\_all("/(\||&|;| |\/|cat|flag|tac|php|ls)/", $str, $pat\_array)) { return $str; } else { echo "don't hack"; } } **自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。** **深知大多数网络安全工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!** **因此收集整理了一份《2024年网络安全全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。** ![img](https://img-blog.csdnimg.cn/img_convert/634eaf3d829cdfc695332590aad7a536.png) ![img](https://img-blog.csdnimg.cn/img_convert/dbdccbc3a3494f62295afe03c8673a7b.png) ![img](https://img-blog.csdnimg.cn/img_convert/a7dfa1788826c54d00f1bfebbca7306e.png) ![img](https://img-blog.csdnimg.cn/img_convert/0399e08c600ef53a9fa77da84c440511.png) ![img](https://img-blog.csdnimg.cn/img_convert/1cdac14a10efe5851f907151c8bd3bb3.png) ![img](https://img-blog.csdnimg.cn/img_convert/000f14f69601039da201bdbe4a0de23c.png) **既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上网络安全知识点,真正体系化!** **由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新** **如果你觉得这些内容对你有帮助,可以添加VX:vip204888 (备注网络安全获取)** ![img](https://img-blog.csdnimg.cn/img_convert/a342bcecf7216a1794330338e75a9e57.png) ## 写在最后 **在结束之际,我想重申的是,学习并非如攀登险峻高峰,而是如滴水穿石般的持久累积。尤其当我们步入工作岗位之后,持之以恒的学习变得愈发不易,如同在茫茫大海中独自划舟,稍有松懈便可能被巨浪吞噬。然而,对于我们程序员而言,学习是生存之本,是我们在激烈市场竞争中立于不败之地的关键。一旦停止学习,我们便如同逆水行舟,不进则退,终将被时代的洪流所淘汰。因此,不断汲取新知识,不仅是对自己的提升,更是对自己的一份珍贵投资。让我们不断磨砺自己,与时代共同进步,书写属于我们的辉煌篇章。** 需要完整版PDF学习资源私我 **一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!** ![img](https://img-blog.csdnimg.cn/img_convert/ae5fbcc31dc487113aeb225a1655ccea.png) ,如同在茫茫大海中独自划舟,稍有松懈便可能被巨浪吞噬。然而,对于我们程序员而言,学习是生存之本,是我们在激烈市场竞争中立于不败之地的关键。一旦停止学习,我们便如同逆水行舟,不进则退,终将被时代的洪流所淘汰。因此,不断汲取新知识,不仅是对自己的提升,更是对自己的一份珍贵投资。让我们不断磨砺自己,与时代共同进步,书写属于我们的辉煌篇章。** 需要完整版PDF学习资源私我 **一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!** [外链图片转存中...(img-cUaJBUnw-1712808180148)]
  • 26
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值