Adworld Web Writeups 1
注意, 这里的大部分题都是 动态flag.
Training-WWW-Robots
先访问 /robots.txt:
User-agent: * |
再访问 /fl0g.php.
Flag: cyberpeace{a727b7e6310991a4dc9d8020eaa232c5}
PHP2
拿dirsearch扫了半天, 扫不出一个200.
只好开摆, 查了一下这道题, 才知道有.phps文件… 而我的所有字典都没有.phps, 难怪扫不出来.
拿到源码就好办了:
|
要求: urldecode后是admin, 直接URL编码绕过.
a的ASCII是 97 , 十六进制是 61 .%的ASCII是 37, 十六进制是 25 .
构造 id 为 %2561dmin即可.
Flag: cyberpeace{068c53f5e2709a1f18ee797ed388492d}
unserialize3
class xctf{ |
代码漏了一个}.
是一道简单的 PHP 反序列化绕过的题.
显然, 我们要尝试绕过 __wakeup 函数.
当成员属性数目大于实际数目时, 即可绕过 __wakeup.
|
构造的 code 为:
Flag: cyberpeace{610f9c0c99ab7b07276966de257e2da1}
PHP反序列化漏洞可参见这篇文章进行学习.
ics-06
点击 报表中心 跳转 /index.php?id=1.
审计了一下页面的源码, 没发现什么异常.
看看题目描述: 云平台报表中心收集了设备管理基础服务的数据,但是数据被删除了,只有一处留下了入侵者的痕迹。
改了一下 id , 没任何反应.
盲猜要爆破 id.
爆破脚本:
import requests |
几秒就爆破出 id=2333, 访问即可得到 flag.
Flag: cyberpeace{8c3fdb44278bc65198b6da8c732b7ed6}
view_source
F12 即可.
Flag: cyberpeace{f200b00df770f8fd9df2da5d7f3e505e}
get_post
没啥好说的.
exp:
import requests |
Flag: cyberpeace{ba973dd8b02a14c684fe76531c9ccfbc}
robots
和 Training-WWW-Robots 一样.
先访问 /robots.txt, 再访问 /f1ag_1s_h3re.php.
Flag: cyberpeace{2d17e2577a19509abf26908004bb5f60}
backup
Q: “”你知道index.php的备份文件名吗?”
A: “index.php.bak”
Flag: Cyberpeace{855A1C4B3401294CB6604CCC98BDE334}
cookie
F12, 发现请求头里 look-here=cookie.php
访问 /cookie.php , flag 在响应头里.
Flag: cyberpeace{93fba8d1795a8bf596106002e7621db8}
这个系列好简单啊, 不想做了.
disabled_button
F12:
<input disabled class="btn btn-default" style="height:50px;width:200px;" type="submit" value="flag" name="auth" /> |
把 disabled 删了, 再点击按钮.
或者用脚本模拟请求:
import requests |
Flag: cyberpeace{1dde99168aaacfeb8003d771cc6d5f2e}
weak_auth
用户名: admin
密码: 123456
Flag: cyberpeace{5b096bbe212168f19a8578d023a80f90}
simple_php
|
考察 PHP 的特性.
- ==: 类型转换后再判断是否相等. (值相等, 类型可不相等)
- ===: 类型也要相同才相等. (值和类型都相等)
$a == 0 and $a: 很容易实现, 让 $a 是一个非数字字符串即可.
not is_numeric($b) and $b > 1234: 字符串 114514HHH 弱类型转换后是 114514, 像这样绕过即可.
exp:
import requests |
Flag: Cyberpeace{647E37C7627CC3E4019EC69324F66C7C}
baby_web
一打开 link, 就被重定向到 /1.php.
初始界面? 不就是 /index.php吗?
改 url 为 /index.php, 仍然被重定向到 /1.php.
打开控制台, 发现 /index.php 的相应头里有一句 FLAG: flag{very_baby_web}.
Flag: flag{very_baby_web}
inget
页面就一句话: Please enter ID,and Try to bypass
F12 发现请求头里有一句 look-here=cookie.php. (其实每道题都是这样)
访问 /cookie.php, 404…
拿 dirsearch 没扫出任何东西.
于是开始揣摩出题人意图.
题目名为 inget, 结合 enter ID, 猜测就是要用 GET 请求发送一个 id 参数.
而 id 的内容, 就是要用于 bypass. 要绕过啥?
我的第一反应就是SQL 注入…
构造 id 为: ' OR '1' = '1:
成功 get flag.
Flag: cyberpeace{2f96c137abbaa0a44e4674d072e8ca34}
easyupload
发现上传的文件可以直接被访问.
看了一下源码, 没看到文件校验的代码, 说明是后端校验.
尝试构造一个 PHP 文件, 执行传入的命令并打印.
但是提交的时候, 页面显示 Your file looks wicked. 看来*.php 被 ban 了.
随便传了个 *.txt 上去, 显示 your filetype looks wicked.
文件最开始加一行 GIF89a, 再次提交, 成功.
而文件内容只要包含 php, 就不行.
总结一下题目要求:
- 格式校验, 用文件头
GIF89a绕过就行. - 后缀不能是
.php - 文件内容不能出现
php. 这个用 绕过即可.
重点在于第二个要求. 如何让 PHP 解析非 .php 文件 ?
知识点: .htaccess 和 .user.ini
.htaccess是 Apache 服务器的配置文件, 用于配置网站的一些参数, 其中包括文件的解析方式.
通过上传如下的 .htaccess 文件:
<FilesMatch "\.jpg"> |
就可以让 *.jpg 文件被视为 PHP 代码来执行.
不过, 这是 Apache 服务器的配置文件, 此题的环境是 Nginx, 行不通.
.user.ini是 PHP 的配置文件, 功能和.htaccess有点像, 其中有用的两条是auto_prepend_file和auto_append_file, 其意义是将指定的文件内容插入到每个 PHP 文件, 其中prepend是在文件开头插入,append是在文件结尾插入.
利用 .user.ini 的前提:
- 题目开启了
CGI或者FastCGI.
- 题目开启了
- 同目录下有可以访问的
.php文件.
- 同目录下有可以访问的
此题可以通过上传如下 .user.ini 文件:
GIF89a |
然后再上传如下 hack.gif 文件:
GIF89a |
攻击过程
直接传 .user.ini, 显示 your filetype looks wicked.
只能启动 Burp Suite 了.
把 Intercept 打开, 上传 .user.ini 的时候, 把 Content-Type 由 application/octet-stream 改为 image/gif 即可成功上传.
然后再上传 hack.gif.
最后, 用 菜刀 连接即可, 打开虚拟终端, 一顿操作和观察, 发现 flag 在根目录下.
cat /flag 即可 get flag.
Flag: cyberpeace{1812ad12734cd4c9a47f1e6482a31c82}
fileinclude
F12 查看源码, 发现有一段 php:
|
发现 @include , 是文件包含漏洞.
在这篇文章进行了学习.
需要利用 php伪协议: php://filter/read=?/resource=?.
其中, read 是过滤器, 多个过滤器用 | 分隔, resource 是要读取的文件路径.
构造 language 为 php://filter/convert.base64-encode/resource=flag.
import requests |
在其中找到 PD9waHANCiRmbGFnPSJjeWJlcnBlYWNlezFkZGFkYzdlNjI2MTlmNDVlYWU3OTA2ZDliYTY2MGJkfSI7DQo/Pg==, 解码得到:
|
Flag: cyberpeace{1ddadc7e62619f45eae7906d9ba660bd}
fileclude
|
$file1 的构造和上一题一样, 接下来思考怎么构造 $file2.
目标: 让 file_get_contents($file2) 返回字符串 hello ctf.
这个用 php://input 即可实现.
import requests |
输出中找到 PD9waHAKZWNobyAiV1JPTkcgV0FZISI7Ci8vICRmbGFnID0gY3liZXJwZWFjZXtiOTQzYTBlNzZiMWI1NWZhODljNzQ2N2MyYTRlOGI2OX0=, 解码得到:
|
Flag: cyberpeace{b943a0e76b1b55fa89c7467c2a4e8b69}
easyphp
|
a的条件
目标: intval($a) > 6000000 && strlen($a) <= 3
我想到的是用科学技术法, 构造 $a=9e9. 但不同的 php 版本, 这样的结果可能不同.
b的条件
目标: '8b184b' === substr(md5($b), -6, 6), 即 $b 的md5 后 6 位为 8b184b.
直接爆破! 我这里爆了 3 个出来.
from hashlib import md5 |
c的条件
- 是一个 array.
- 包含键
m,m不是数字, 但转为数字后大于 2022. - 包含键
n,n是一个 array, 且n中有两个元素,n[0]也是一个 array. - 在
c["n"]里必须有DGGJ(array_search查找, 其比较是用==而不是===). c["n"]中不能有DGGJ.
构造:
{ |
最后的参数为:
a=9e9&b=7Xxpgw9t&c={"m":"114514qwq","n":[[],0]}
Flag: cyberpeace{7654290768236bd2dd393bce0018d745}
file_include
|
以为和 fileinclude 一样, 构造 filename 为 php://filter/convert.base64-encode/resource=flag.php.
结果显示 do not hack!
盲猜过滤了关键词.
几次尝试, 得知 base 被过滤.
那就搜一下除 base64-encode 外其它的 filter: PHP Manual 列举的 filters
quoted-printable-encode 也被 ban 了, 只能使用 iconv.*. 支持的编码
直接用官网的例子: php://filter/convert.iconv.utf-16le.utf-8/resource=flag.php
把输出的乱码扔到乱码恢复网站, 即可得到 flag.
顺便看看 check.php 长啥样:
|
Flag: cyberpeace{52752fc6688c4ec81d7707ec8db50d5c}
unseping
|
又是一道 PHP 反序列化漏洞.
由 waf 可知, | & ; 空格 / cat flag tac php ls 被过滤了.
考虑绕过.
以下是常见的绕过方式:
黑名单绕过
变量拼接
a=ca;b=t;c=fl;d=ag;$a$b $c$d |
引号
ca''t fl""ag |
反斜杠
ca\t fl\ag |
Base64
echo "Y2F0IGZsYWc="|base64 -d|bash |
[终极] printf编码绕过
$(printf "\154\163") # ls |
Python转换代码:
CMD = "ls" # 命令 |
在这题中, 2 种绕过空格的方式均可用, 黑名单可以用反斜杠或引号绕过.
$a = new ease("ping", ['l\\s${IFS}-l']); |
上传 payload , 得到:
array(3) { |
看到一个目录 flag_1s_here.
$a = new ease("ping", ['l\\s${IFS}fl""ag_1s_here']); |
得到:
array(1) { |
最后还是得用 printf编码绕过.
exp:
CMD = "cat flag_1s_here/flag_831b69012c67b35f.php" # 命令 |
|
import requests |
Flag: cyberpeace{a765167d90c33c4df7ce9297482a4676}
- 标题: Adworld Web Writeups 1
- 作者: Coast23
- 创建于 : 2025-03-15 17:38:23
- 更新于 : 2025-03-18 00:16:04
- 链接: https://coast23.github.io/2025/03/15/Adworld-Web-Writeups-1/
- 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。