Bugku-CTF never give up

never give up

题目链接

F12,发现有个1p.html

image-20191111161727342

访问发现被重定向了Bugku官网,我们burp抓包拦截

image-20191111161903598

%3Cscript%3Ewindow.location.href%3D%27http%3A//www.bugku.com%27%3B%3C/script%3E%20%0A%3C%21--JTIyJTNCaWYlMjglMjElMjRfR0VUJTVCJTI3aWQlMjclNUQlMjklMEElN0IlMEElMDloZWFkZXIlMjglMjdMb2NhdGlvbiUzQSUyMGhlbGxvLnBocCUzRmlkJTNEMSUyNyUyOSUzQiUwQSUwOWV4aXQlMjglMjklM0IlMEElN0QlMEElMjRpZCUzRCUyNF9HRVQlNUIlMjdpZCUyNyU1RCUzQiUwQSUyNGElM0QlMjRfR0VUJTVCJTI3YSUyNyU1RCUzQiUwQSUyNGIlM0QlMjRfR0VUJTVCJTI3YiUyNyU1RCUzQiUwQWlmJTI4c3RyaXBvcyUyOCUyNGElMkMlMjcuJTI3JTI5JTI5JTBBJTdCJTBBJTA5ZWNobyUyMCUyN25vJTIwbm8lMjBubyUyMG5vJTIwbm8lMjBubyUyMG5vJTI3JTNCJTBBJTA5cmV0dXJuJTIwJTNCJTBBJTdEJTBBJTI0ZGF0YSUyMCUzRCUyMEBmaWxlX2dldF9jb250ZW50cyUyOCUyNGElMkMlMjdyJTI3JTI5JTNCJTBBaWYlMjglMjRkYXRhJTNEJTNEJTIyYnVna3UlMjBpcyUyMGElMjBuaWNlJTIwcGxhdGVmb3JtJTIxJTIyJTIwYW5kJTIwJTI0aWQlM0QlM0QwJTIwYW5kJTIwc3RybGVuJTI4JTI0YiUyOSUzRTUlMjBhbmQlMjBlcmVnaSUyOCUyMjExMSUyMi5zdWJzdHIlMjglMjRiJTJDMCUyQzElMjklMkMlMjIxMTE0JTIyJTI5JTIwYW5kJTIwc3Vic3RyJTI4JTI0YiUyQzAlMkMxJTI5JTIxJTNENCUyOSUwQSU3QiUwQSUwOXJlcXVpcmUlMjglMjJmNGwyYTNnLnR4dCUyMiUyOSUzQiUwQSU3RCUwQWVsc2UlMEElN0IlMEElMDlwcmludCUyMCUyMm5ldmVyJTIwbmV2ZXIlMjBuZXZlciUyMGdpdmUlMjB1cCUyMCUyMSUyMSUyMSUyMiUzQiUwQSU3RCUwQSUwQSUwQSUzRiUzRQ%3D%3D--%3E

首先我们将那些百分号,也就是url编码的进行解码,URL解码为

<script>window.location.href='http://www.bugku.com';</script> 
<!--JTIyJTNCaWYlMjglMjElMjRfR0VUJTVCJTI3aWQlMjclNUQlMjklMEElN0IlMEElMDloZWFkZXIlMjglMjdMb2NhdGlvbiUzQSUyMGhlbGxvLnBocCUzRmlkJTNEMSUyNyUyOSUzQiUwQSUwOWV4aXQlMjglMjklM0IlMEElN0QlMEElMjRpZCUzRCUyNF9HRVQlNUIlMjdpZCUyNyU1RCUzQiUwQSUyNGElM0QlMjRfR0VUJTVCJTI3YSUyNyU1RCUzQiUwQSUyNGIlM0QlMjRfR0VUJTVCJTI3YiUyNyU1RCUzQiUwQWlmJTI4c3RyaXBvcyUyOCUyNGElMkMlMjcuJTI3JTI5JTI5JTBBJTdCJTBBJTA5ZWNobyUyMCUyN25vJTIwbm8lMjBubyUyMG5vJTIwbm8lMjBubyUyMG5vJTI3JTNCJTBBJTA5cmV0dXJuJTIwJTNCJTBBJTdEJTBBJTI0ZGF0YSUyMCUzRCUyMEBmaWxlX2dldF9jb250ZW50cyUyOCUyNGElMkMlMjdyJTI3JTI5JTNCJTBBaWYlMjglMjRkYXRhJTNEJTNEJTIyYnVna3UlMjBpcyUyMGElMjBuaWNlJTIwcGxhdGVmb3JtJTIxJTIyJTIwYW5kJTIwJTI0aWQlM0QlM0QwJTIwYW5kJTIwc3RybGVuJTI4JTI0YiUyOSUzRTUlMjBhbmQlMjBlcmVnaSUyOCUyMjExMSUyMi5zdWJzdHIlMjglMjRiJTJDMCUyQzElMjklMkMlMjIxMTE0JTIyJTI5JTIwYW5kJTIwc3Vic3RyJTI4JTI0YiUyQzAlMkMxJTI5JTIxJTNENCUyOSUwQSU3QiUwQSUwOXJlcXVpcmUlMjglMjJmNGwyYTNnLnR4dCUyMiUyOSUzQiUwQSU3RCUwQWVsc2UlMEElN0IlMEElMDlwcmludCUyMCUyMm5ldmVyJTIwbmV2ZXIlMjBuZXZlciUyMGdpdmUlMjB1cCUyMCUyMSUyMSUyMSUyMiUzQiUwQSU3RCUwQSUwQSUwQSUzRiUzRQ==-->

image-20191111162138927

解码完了以后,发现还需要url解码

image-20191111162239688

解码后的结果整理了以下,源代码为

<?php
// ";
if(!$_GET['id']) // 限制了url非空非零的变量id
{
    header('Location: hello.php?id=1');
    exit();
}
$id=$_GET['id'];
$a=$_GET['a'];
$b=$_GET['b'];
// 以上定义三个GET请求的变量
if(stripos($a,'.')) // 变量$a 不能含有.
{
    echo 'no no no no no no no';
    return ;
}
$data = @file_get_contents($a,'r'); // 获取数据,来自与$a
if($data=="bugku is a nice plateform!" and $id==0 and strlen($b)>5 and eregi("111".substr($b,0,1),"1114") and substr($b,0,1)!=4)
{
// 判断条件的代码很有意思
/*
    1. $data弱等于字符串bugku is a nice plateform!
    2. $id弱等于整数型0
    3. 变量$b的长度大于5 strlen()函数的作用是判断字符串的长度
    4. 字符串 1114 要与字符串 111 连接变量 $b 的第一个字符构成的正则表达式匹配
    5. $b 的第一个字符不能弱等于整数4
*/
    require("f4l2a3g.txt");
    // 包含文件 f4l2a3g.txt
}
else
{
    print "never never never give up !!!";
}
?>

因为暴露了flag文件的地址,我们直接访问http://123.206.87.240:8006/test/f4l2a3g.txt 即可得到flag

但我们需要突破的是判断的那一层,如何绕过

我们接下来分析$a,$b,$id三个变量

PHP弱类型比较

首先我们来说以下$id弱类型,代码看懂问题

image-20191111163914021

image-20191111164050811

参考表: https://www.php.net/manual/zh/types.comparisons.php

PHP伪协议

因为源代码中变量$data是由file_get_contents()函数读取变量$a,所以$a必须为数据流

在这里$a=bugku is a nice plateform!所以我们需要使用伪协议php://来访问输出数据库, 其中 php://input可以访问原始请求数据中的只读流。这里令 $a = php://input ,并且提交的数据流为bugku is a nice plateform!

关于PHP支持的协议详解(参考官网): https://www.php.net/manual/zh/wrappers.php

eregi() 截断漏洞

这里是我第一次遇到,所以我才想把这题做个记录。

在PHP中 ereg() 函数或 eregi() 函数存在空字符截断漏洞,即参数中的正则表达式或待匹配字符串遇到空字符则截断丢弃后面的数据

  • GET请求

    • %00
  • POST请求

    • 0x00 或者手动修改hex数据为00

源码中待匹配字符串(第二个参数)已确定为 "1114",正则表达式(第一个参数)由 "111" 连接 $b 的第一个字符组成,若令 substr($b,0,1) = "\x00",即满足 "1114""111"匹配 ,因此在这里,我们假设$b=\x0012345也就满足以上三个条件!!!

PHP黑魔法: PHP函数黑魔法小总结 | CTF之PHP黑魔法总结

FLAG

接下来我们就构造请求来拿flag,注意,因为我们这边是GET请求,所以我们使用url编码的'%00'即可

还有一点要注意 $id只能使用弱类型,不能等于0,虽然判断条件哪里==0,但是被重定向的判断限制了

if(!$_GET['id']) // 限制了url非空非零的变量id
{
    header('Location: hello.php?id=1');
    exit();
}

如果$id=0

image-20191111170040342

所以我们必须利用弱类型拿下flag,注意,虽然 b=%0012345 实际字符串长度为 8 字节,但在后台脚本读入数据时,会将 URL 编码 %00 转换成 1 字节。所以说,空字符应该在后台脚本的变量中出现,而不是在 URL 查询字符串变量中出现

image-20191111170126672

总结

eregi() 截断漏洞/ 学到了学到了!

本文链接:

https://www.betao.cn/archives/giveup.html
1 + 7 =
快来做第一个评论的人吧~