第35名
代码审计,伪造X-Real-IP就行了,太简单的代码了没啥必要
composer.json中,引入了两个模块
我们通过composer install命令来安装这里两个模块
审计源码可以发现,文件上传的路径可控
symfony/string:操作字符串
参考文档:
https://symfony.com/doc/current/components/string.html
opis/closure:序列化闭包
参考文档:
https://opis.io/closure/3.x/serialize.html
根据上面的分析,思路就很清晰了,我们需要构造一个序列化payload,然后上传到/tmp/sess_xxx后,使用我们上传的sessID再上传一次文件达到触发反序列化的效果
根据代码可知,引用$_SESSION["upload_path"]后使用点操作符来拼接字符串,所以如果我们的$_SESSION["upload_path"]是一个对象的话,就会触发__toString()。那么我们就需要找一个有__toString()且__toString()中有类似$this->xxx()这样操作用于触发闭包的类
先序遍历j得到下面字符串
Q2hpbmVzZSB0cmFkaXRpb25hbCBjdWx0dXJlIGlzIGJyb2FkIGFuZCBwc**mb3VuZCEgU28gSSBXYW50IEdpdmUgWW91IE15IEZsYWcgQnV0IFlvdSBOZWVkIERlY29kZSBJdC5FbmpveSBUaGUgRmxhZyEhOuW4iCDlhZEg5aSNIOaNnyDlt70g6ZyHIOaZiyDlp6Qg5aSn6L+HIOiuvCDlmazll5Eg6ZyHIOaBkiDoioIg6LGrIA==
base64解密
Chinese traditional culture is broad and profound! So I Want Give You My Flag But You Need Decode It.Enjoy The Flag!!:师 兑 复 损 巽 震 晋 姤 大过 讼 噬嗑 震 恒 节 豫
然后将“师兑复损巽震晋姤大过讼噬嗑震恒节豫”转换
enc= "师兑复损巽震晋姤大过讼噬嗑震恒节豫" mydisc={'坤': '000000', '剥': '000001', '比': '000010', '观': '000011', '豫': '000100', '晋': '000101', '萃': '000110', '否': '000111', '谦': '001000', '艮': '001001', '蹇': '001010', '渐': '001011', '小过': '001100', '旅': '001101', '咸': '001110', '遁': '001111', '师':'010000', '蒙': '010001', '坎': '010010', '涣': '010011', '解': '010100', '未济': '010101', '困': '010110', '讼': '010111', '升': '011000', '蛊': '011001', '井': '011010', '巽': '011011', '恒': '011100', '鼎': '011101', '大过': '011110', '姤': '011111', '复': '100000', '颐': '100001', '屯': '100010', '益': '100011', '震': '100100', '噬嗑': '100101', '随': '100110', '无妄': '100111', '明夷': '101000', '贲': '101001', '既济': '101010', '家人': '101011', '丰': '101100', '离': '101101', '革': '101110', '同人': '101111', '临': '110000', '损': '110001', '节': '110010', '中孚': '110011', '归妹': '110100', '睽': '110101', '兑': '110110', '履': '110111', '泰': '111000', '大畜': '111001', '需': '111010', '小畜': '111011', '大壮': '111100', '大有': '111101', '夬': '111110', '乾':'111111'} keys=['坤', '剥', '比', '观', '豫', '晋', '萃', '否', '谦', '艮', '蹇', '渐', '小过', '旅', '咸', '遁', '师', '蒙', '坎', '涣','解', '未济', '困', '讼', '升', '蛊', '井', '巽', '恒', '鼎', '大过', '姤', '复', '颐', '屯', '益', '震', '噬嗑', '随', '无妄', '明夷','贲', '既济', '家人', '丰', '离', '革', '同人', '临', '损', '节', '中孚', '归妹', '睽', '兑', '履', '泰', '大畜', '需', '小畜', '大壮' , '大有', '夬', '乾'] def decrypt(): global mingwen mingwen=enc for each in keys: mingwen=mingwen.replace(each,mydisc[each]) print(mingwen) if __name__ == '__main__': decrypt()
字符转换成二进制得到
010000110110100000110001011011100100000101011111011110010111100101100100011100110010000100
然后解码二进制
Ch1nA_yyds!
nc进去按住回车有链接,访问进去是微信的专访,底部照片可以发现有一些点,但不是缩略图,ps观察坐标发现是间隔9个位置
写脚本提取就行了
题目叫做xor cli,nc进去后会有彩色段,那就是把彩色的空间内容跟图片提出来的彩**块进行xor就好了,这里的话懒得贴图了,你们也看得懂(主要是图片删了
彩色代码这里直接这样提取 nc ip port > 123
然后把非彩色内容手工删掉就ok了
撰写脚本
from PIL import Image pic = Image.open('TpMSkq.png') f = open('aaaaa','r').readlines() for i in range(len(f)): f[i] = f[i].split('[') for j in range(1, len(f[i])): f[i][j] = f[i][j].split(';') w,h = pic.size img = Image.new('RGB',(100,134),(255,255,255)) k = 1 b = 1 time=0 img2 = Image.new('RGB',(100,134),(0,0,0)) for i in range(100): for j in range(1,134): tmp = pic.getpixel((b,k)) #print((tmp[0]^int(f[i][j][2]),tmp[1]^int(f[i][j][3]),tmp[3]^int(f[i][j][4][:-3])))#img.putpixel((i,j-1),tmp) #img2.putpixel((i,j-1),((int(f[i][j][2]),int(f[i][j][3]),int(f[i][j][4][:-3])))) #print((int(f[i][j][2]),int(f[i][j][3]),int(f[i][j][4][:-3]))) img.putpixel((i,j-1),(tmp[0]^int(f[i][j][2]),tmp[1]^int(f[i][j][3]),tmp[2]^int(f[i][j][4][:-3]))) #pic.putpixel((i,j-1),(int(f[i][j][2]),int(f[i][j][3]),int(f[i][j][4][:-3]))) if(k<=1200): k+=9 else: breakif(b<=w): b+=9 k=1 else: break time+=1 if time == 10: exit img.show() #img2.show() #img.save('1.png') print(w,h)
cJSON_Minify
,由于函数没有溢出,所以问题肯定在这个函数上,在网上找到对应版本的cJSON_Minify
函数源码来查看下:"
也可以实现,但是要读取22个字符地缘故,输入"
无法泄露出足够的数目,所以这里输入/*
来实现。本文作者:Timeline Sec
本文为安全脉搏专栏作者发布,转载请注明:https://www.secpulse.com/archives/172195.html