从无回显SSRF到任意文件写入
前言今年5月份参加了第十七届全国大学生信息安全竞赛创新实践能力赛初赛,有有一道 迅睿CMS 的题目。题目考察的是通过 SSRF 漏洞获取本机仅允许 127.0.0.1 访问的 flag.php 文件。
当时还写了关于这道题的解题思路,请移步: https://www.qwesec.com/2024/05/ciscn2024.html#easycms-revenge
后面跟师傅讨论,发现都是通过 qrcode() 方法进行 SSRF 漏洞的利用,但是不同点是触发点不同。
其他师傅的触发点:
查看该 CMS 的漏洞公司,发现在早期该方法就存在 SSRF 漏洞。
后来可能被修复了,今天,笔者又在该方法发现了无回显的 SSRF 漏洞。
我的触发点:
可以发现,qrcode 方法接收了 GET 传入的 text 和 thumb 以及 level,其中 thumb 的值如果是 URL 则会带入到 getimagesize 函数中,从而触发 SSRF 漏洞。
SSRF 触发点构造如下参数执行 qrcode方法 并进行传参:
1?s=api&c=api&m=qrcode& ...
Flask 的模版注入漏洞
前言前期学习主要以 Python 的 Flask 框架使用的 Jinja2 模版为主,同时 x1ong 也借此机会学习一下 Python 的 Flask 模块。
Flask 基础模块的安装安装方法比较简单,直接使用 pip 安装即可:
1pip3 install flask
最小的应用12345678from flask import Flaskapp = Flask(__name__)@app.route('/')def hello(): return "Hello Flask!"app.run()
以上代码解释如下:
首先我们导入了 Flask 类。该类的实例将会成为我们的 WSGI 应用。
接着我们创建一个该类的实例。第一个参数是应用模块或者包的名称。 __name__ 是一个适用于大多数情况的快捷方式。有了这个参数, Flask 才能知道在哪里可以找到模板和静态文件等东西。
然后我们使用 route() 装饰器来告诉 Flask 触发函数的 PATH 。
函数返回需要在用户浏览器中显示的信息。默认的内容类型是 HTML ,因此 ...
第一届"长城杯"信息安全铁人三项半决赛AWD题解
前言2024年4月经过初赛选拔,成功进入到线下半决赛,在西安邮电大学承办,设备使用的是某盟的网络安全方针平台。真的被虐爆了,开局统一 ssh 密码(强密码),让我们误以为是随机生成的密码,没想到全场都是这个密码,开局基本上全场都被某只队伍跑脚本修改密码了。
所以 awd 比赛上来第一件事就是修改靶机的密码。。。
靶机1: funadmin靶机简介该靶机是由 funadmin CMS 搭建,采用 PHP + mysql 的架构,所以说就是 PHP 的网站喽。
漏洞一 后门代码第一步就是先备份网站源码,然后将源码脱下来 (这里推荐使用 xshell + xftp一体化工具),然后放入到 D盾 webshell 扫描工具中扫描:
发现存在已知后门,位于: app/api/controller/v1/Token.php 后门如下:
12345678910111213141516171819202122232425262728293031323334353637383940414243444546<?phpnamespace app\api\co ...
第十七届全国大学生信息安全竞赛创新实践能力赛初赛WEB
前言最近参加了第十七届全国大学生信息安全竞赛 CISCN 的初赛,身为 web 手的我,做出来两道 web 题目,最终队伍也成功进入半决赛。
感觉题目还是很有含金量的,故而进行记录。
其中 easycms 这个题目考了两次,第一天的没做出来,第二天又考了一次,说是加固了安全漏洞。
Simple_PHP源码如下:
12345678910111213<?phpini_set('open_basedir', '/var/www/html/');error_reporting(0);if(isset($_POST['cmd'])){ $cmd = escapeshellcmd($_POST['cmd']); if (!preg_match('/ls|dir|nl|nc|cat|tail|more|flag|sh|cut|awk|strings|od|curl|ping|\*|sort|ch|zip|mod|sl|find|sed|cp|mv|ty|grep|fd|df|s ...
CTF 中的 XXE 那些事儿
XML 基础什么是 XML
XML 指可扩展标记语言(Extensible Markup Language)
XML 是一种标记语言,很类似 HTML
XML 的设计宗旨是传输数据,而非显示数据
XML 标签没有被预定义。您需要自行定义标签。
XML 被设计为具有自我描述性。
XML 是 W3C 的推荐标准
特点:
仅仅是纯文本,他不会做任何事情,XML可以自己发明标签(允许定义自己的标签和文档结构),他常被用于数据的传输格式。
XML文件格式如下:
XML 构成
DTDDTD(文档类型定义)的作用是定义 XML 文档的合法构建模块。
DTD 可以在 XML 文档内声明,也可以外部引用。
内部声明:
外部声明:
实体根据类型划分,实体一般分为 一般实体 和 参数实体
一般实体一般实体(通用实体)的声明语法: <!ENTITY 实体名 "实体内容">
引用实体的方式: &实体名;
在 DTD 中定义实体,在 XML 文档中引用:
参数实体参数实体只能在 DTD 中使用,参数实体的声明格式: <!ENTITY % 实体名 &q ...
CTF 中的反序列化考点总结
PHP 类和对象基础基础概念类是对一个类别的抽象概念,而具体的则是对象,比如汽车就是一个类
而对象则是我的宝马,而不是宝马,宝马也是一个类,对象是一个具体到每个事物
PHP官方解释: 类是对象的抽象,对象是类的具像(具体对象)
如何创建一个类:
使用class关键字进行创建,Class ClassName{}
12345<?php class Car { // 这里是类的内容}>
类名的命名规范: 类名通常使用大驼峰命名法。例如: persontest 的大驼峰命名法就是PersonTest 小驼峰命名法就是personTest。
类中的成员
成员属性 (在类中定义的变量称之为属性)
方法 (在类中定义的函数称之为方法)
成员常量
创建一个类12345678910111213<?php class Demo { public $username = 'x1ong'; public $password = "admin@123"; public func ...
CTF中的命令执行总结
前言最近在复习总结关于CTFWEB 方向的考点,因为之前虽然学过,但是一直并没有成体系的笔记或者文章发布。于是最近趁着在系统的学习 CTFWEB 方向的考点。对 CTF 中的命令执行做一次总结。
PHP中的命令执行函数systemsystem — 执行外部程序,并且显示输出
参数
说明
command
要执行的命令
返回值: 成功则返回命令输出的最后一行,失败则返回 false。
passthrupassthru — 执行外部程序并且显示原始输出
参数
说明
command
要执行的命令
返回值: 成功时返回 null, 或者在失败时返回 false。
execexec — 执行一个外部程序,并返回执行结果的最后一行内容。
参数
说明
command
要执行的命令
output
如果设置该参数则使用命令执行的结果填充该数组。
返回值: 命令执行结果的最后一行内容,失败时返回 false。
shell_execshell_exec — 通过 shell 执行命令并将完整的输出以字符串的方式返回。
参数
说明
comm ...
无字母数字 RCE 的总结
前言最近正在复习关于 无参RCE 以及 无字母RCE 相关的 CTF 题目, 之前也有做过类似的题目,但是都没有做总结,于是最近准备系统的对 CTFWeb 的知识点进行总结。
主要参考资料为 P神 2017 年发布的文章:
https://www.leavesongs.com/PENETRATION/webshell-without-alphanum.html
问题11234<?phpif(!preg_match('/[a-z0-9]/is',$_GET['shell'])) { eval($_GET['shell']);}
如果把数字和字母都 ban 了我们该如何进行 RCE 呢?下面是 P神 的思考,x1ong 只是进行学习并做记录。
思路首先我们明确思路,我们的核心目的就是不使用字母、数字,去构造诸如 assert、system 函数的字符串,然后利用动态执行的方法进行调用。
动态调用:
12345<?php $a = 'assert';$a('phpin ...
GXYCTF2019 禁止套娃
信息收集使用目录扫描工具 dirsearch 对其进行扫描,发现存在 .git 目录。
猜测可能是 git 泄露,使用 GitHacker 工具尝试获取其源码信息。
分析得到源码,如下:
123456789101112131415161718192021222324<?phpinclude "flag.php";echo "flag在哪里呢?<br>";if(isset($_GET['exp'])){ if (!preg_match('/data:\/\/|filter:\/\/|php:\/\/|phar:\/\//i', $_GET['exp'])) { if(';' === preg_replace('/[a-z,_]+\((?R)?\)/', NULL, $_GET['exp'])) { if (!preg_match( ...
Python 的 HackerRequest 模块学习记录
模块简介HackRequests 是基于Python3.x的一个给黑客们使用的 http 底层网络库。如果你需要一个不那么臃肿而且像 requests 一样优雅的设计,并且提供底层请求包/返回包原文来方便你进行下一步分析,如果你使用Burp Suite,可以将原始报文直接复制重放,对于大量的 HTTP 请求,hack-requests 线程池也能帮你实现最快速的响应。
像 requests 一样好用的设计
提供接口获得底层请求包、返回包原文,方便下一步分析
支持发送 HTTP 原始报文,支持从 Burp Suite 等抓包软件中重放
hack-requests 是单文件模块,可方便移植到其他项目中。
模块安装1pip install HackRequests
仅支持 Python3.x
特征不需要关注参数类型在requests模块中,为了方便使用,header、cookie、post等信息都是以字典形式传参,但对于黑客来说,常常截获到的是一个文本,手动转换成字典费时费力。但在HackRequests中,这些参数你既可以传入一个字典,也可以传入一个文本,程序会自动识别并转 ...