buu摸鱼日记(11)
这个题目,是我图样了
[GKCTF2020]CheckIN
乍一看我以为是反序列化,然后仔细看了下发现我想多了,这不是个白给的shell嘛(RCE)
<?php
highlight_file(__FILE__);
class ClassName
{
public $code = null;
public $decode = null;
function __construct()
{
$this->code = @$this->x()['Ginkgo'];
$this->decode = @base64_decode( $this->code );
@Eval($this->decode);
}
public function x()
{
return $_REQUEST;
}
}
new ClassName();
然后我就一堆操作猛如虎,先print_r(scandir(‘/’))
出了一个flag,果断print_r(readfile(“/flag”))
然而并没有什么卵用……
陷入了对人生的思考当中,后来发现phpinfo把一堆函数给禁用了
正解
从phpinfo我们可以看到php版本7.3
7.0~7.3有一个bypass漏洞
php7-gc-bypass漏洞利用PHP garbage collector程序中的堆溢出触发进而执行命令
官方有exp(麻了这不是pwn吗)
https://github.com/mm0r1/exploits/blob/master/php7-gc-bypass/exploit.php
pwn(‘要执行的语句’)
打上去然后rce即可
[GKCTF2020]cve版签到
md,找cve找到wp了,见鬼
cve-2020-7066
题不难,就把cve记录一下好了
php有着一个漏洞就是如果被\0(urlencode = %00)截断
header里面只会保留截断前的部分
比方说
http://localhost\0.example.com
header里面只会留下localhost 没有example.com那部分,可以用来绕过一些检测
[安洵杯 2019]easy_web
去年被暴打的时候做过,但是还是没做出来(我真是屑啊)
凭借记忆用img读取index.php
<?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 ~");
}
}
?>
那个img对他进行了一次hex两次base64,(解开这个真是需要运气和经验)
然后是md5碰撞,为了记录把这个payload记下来,非常有用
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%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&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%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
强绕过md5
然后就是rce的绕过
官方wp是sort /flag,不过
因为过滤了大多常见的文件读取的命令,最后的核心考点是拿 linux 命令去 fuzz ,但是因为过滤反斜杠
|\\|\\\\|
这里的时候正则没有写好,导致了反斜杠逃逸。因此造成了ca\t
命令可以直接读取 flag
涨了点姿势
[ASIS 2019]Unicorn shop
这玩意儿脑洞题
主要就是utf8转换,找一个奇奇怪怪的字符,来表示超过1000的数字就行
https://blog.lyle.ac.cn/2018/10/29/unicode-normalization/
https://www.compart.com/en/unicode/ 搜索一个thousand million什么的就行了
[BJDCTF2020]Mark loves cat
还以为是xss什么的,结果根本不是…
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'){
exit($handsome);
}
}
if(!isset($_GET['flag']) && !isset($_POST['flag'])){
exit($yds);
}
if($_POST['flag'] === 'flag' || $_GET['flag'] === 'flag'){
exit($is);
}
echo "the flag is: ".$flag;
因为$flag是flag,所以说我们post $flag=flag
foreach($_POST as $x($flag) => $y(flag)){ $$x = $y; }
就会让$$flag=flag
那我们get yds
所以说$yds==$flag,然后exit就会弹出flag
头有点痛,妈的