web-百度杯九月赛

web-百度杯九月赛

code

.changame.ichunqiu.com/index.php?jpg=index.php
http://e11eec896ded4871a4ba2cfbbfdf566660cd0fb8ba5b4c97.changame.ichunqiu.com/.idea/workspace.xml
http://e11eec896ded4871a4ba2cfbbfdf566660cd0fb8ba5b4c97.changame.ichunqiu.com/index.php?jpg=fl3gconfigichuqiu.php

查看源代码——>图片base64加密——>无法解密——>目录扫描(目录猜解)——>发现index.php——>查看源代码——>代码解密——>.idea/workspace.xml——>file://$PROJECT_DIR$/fl3g_ichuqiu.php——>发现存在fl3g_ichunqiu.php文件——>

$file = str_replace("config","", $file);(发现有一个替换,会将config替换成) ——>

访问——>文件fl3gconfigichuqiu.php——>源码base64解密——>根据其加密方式写爆破脚本——>发送GET /fl3g_ichuqiu.php HTTP/1.11请求包(bp)——>回显获得Set-Cookie: user=值——>将获取到的值带入爆破脚本$cookie_guest=值,运行——>获得回显——>制作字典——>爆破(bp)——>flag

第一次解密后的代码:

<?php
/**
 * Created by PhpStorm.
 * Date: 2015/11/16
 * Time: 1:31
 */
header('content-type:text/html;charset=utf-8');
if(! isset($_GET['jpg']))
    header('Refresh:0;url=./index.php?jpg=hei.jpg');
$file = $_GET['jpg'];
echo '<title>file:'.$file.'</title>';
$file = preg_replace("/[^a-zA-Z0-9.]+/","", $file);
$file = str_replace("config","_", $file);
$txt = base64_encode(file_get_contents($file));

echo "<img src='data:image/gif;base64,".$txt."'></img>";

/*
 * Can you find the flag file?
 *
 */

?>

Refresh:间隔一定的时间跳转,php利用Refresh实现重定向

例子:

<?php
//header(“Refresh: 3 ; url=http://www.sohu.com”);
header(“Refresh: 3 ; url=http:"//localhost/http/d.php");间隔三秒实现重定向
?>

php文件泄露:

JetBrains IDE workspace.xml文件泄露
发布时间:2016-12-9 分类: 运维资料库 阅读:1,123
JetBrains IDE workspace.xml文件泄露JetBrains IDE workspace.xml文件泄露-唯嘉利亚云安全

发现时间:
2016-12-08
漏洞类型:
其他
所属建站程序:
其他
所属服务器类型:
通用
所属编程语言:
其他
描述:
网站存在JetBrains系列IDE的工作区文件,可以泄露整个工程的目录结构信息。JetBrains是一家捷克的软件开发公司,该公司最为人所熟知的产品是Java编程语言开发撰写时所用的集成开发环境:IntelliJ IDEA。
相关影响IDE如下如下:

  • IntelliJ IDEA – 一套智慧型的Java整合开发工具,特别专注与强调程式师的开发撰写效率提升
    *PHPStorm 7.0 发布,PHP 集成开发工具
    *PyCharm 3发布,智能Python集成开发工具
    *RubyMine -RubyMine 是一个为Ruby 和Rails开发者准备的IDE,其带有所有开发者必须的功能,并将之紧密集成于便捷的开发环境中。
    *WebStorm8.0 发布,智能HTML/CSS/JS开发工具
    *AppCode – 开发的ObjC的IDE,是一个XCode的替代物

危害:
通过下载workspace.xml,可直接获取整个工程的目录结构,发现敏感文件,为渗透中收集信息、发现漏洞提供了极大的便利。
解决方案:
1、删除.idea目录
2、如使用git则
修改配置文件,隐藏workspace.xml:
.gitignore 中要写上 workspace.xml

如果已经commit workspace.xml 必须执行以下命令

$ git rm --cached .idea/workspace.xml

第二次解密后的代码:

<?php
/**
 * Created by PhpStorm.
 * Date: 2015/11/16
 * Time: 1:31
 */
error_reporting(E_ALL || ~E_NOTICE);
include('config.php');
function random($length, $chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyz') {
    $hash = '';
    $max = strlen($chars) - 1;
    for($i = 0; $i < $length; $i++)	{
        $hash .= $chars[mt_rand(0, $max)];
    }
    return $hash;
}

function encrypt($txt,$key){
    for($i=0;$i<strlen($txt);$i++){
        $tmp .= chr(ord($txt[$i])+10);
    }
    $txt = $tmp;
    $rnd=random(4);
    $key=md5($rnd.$key);
    $s=0;
    for($i=0;$i<strlen($txt);$i++){
        if($s == 32) $s = 0;
        $ttmp .= $txt[$i] ^ $key[++$s];
    }
    return base64_encode($rnd.$ttmp);
}
function decrypt($txt,$key){
    $txt=base64_decode($txt);
    $rnd = substr($txt,0,4);
    $txt = substr($txt,4);
    $key=md5($rnd.$key);

    $s=0;
    for($i=0;$i<strlen($txt);$i++){
        if($s == 32) $s = 0;
        $tmp .= $txt[$i]^$key[++$s];
    }
    for($i=0;$i<strlen($tmp);$i++){
        $tmp1 .= chr(ord($tmp[$i])-10);
    }
    return $tmp1;
}
$username = decrypt($_COOKIE['user'],$key);
if ($username == 'system'){
    echo $flag;
}else{
    setcookie('user',encrypt('guest',$key));
    echo "╮(╯▽╰)╭";
}
?>

讲解:

1)将用户的cookie,和变量key传入decrypt这个函数,看一下这个函数的作用
将传入的文本进行base64解码,赋给变量txt
将base64编码后的文本的前4位赋给变量rnd
将变量4位以后的内容赋给变量txt
将得到的变量rnd和传入的变量key进行md5加密,然后赋值给变量key
令变量s的值为0
对新txt的内容进行如下操作:
将内容以32个字节为度进行划分
txt内容与key相应位置进行异或运算,然后拼接,最终赋值给变量tmp
将tmp变量的每个字节转化为ascii,-10,再转为字符然后拼接,赋值给变量tmp1
最终返回tmp1
2)将传回的值赋值给变量username
3)如果变量username=system,则输出flag
4)否则,先将guest和变量key传入encrypt这个函数,看一下这个函数的作用
首先将传入的文本内容转为ascii然后+10,再转为字符,将加密后的文本赋值给tmp变量
将变量tmp的值赋给变量txt
变量rnd=随机输出的4个数
将得到的变量rnd和传入的变量key进行md5加密,然后赋值给变量key
令变量s的值为0
对新txt的内容进行如下操作:
将内容以32个字节为度进行划分
txt内容与key相应位置进行异或运算,然后拼接,最终赋值给变量ttmp
最后把rnd和ttmp拼接,返回base64加密后的内容

所以说,我们现在是需要得到变量key和变量rnd,如何得到呢,可以通过guest得到

error_reporting:函数能够在运行时设置 error_reporting 指令

strlen() 函数:返回字符串的长度,中文字符串的处理使用 mb_strlen() 函数。

<?php
echo strlen("Hello");
?>

count_chars() 函数:函数返回字符串所用字符的信息(例如,ASCII 字符在字符串中出现的次数,或者某个字符是否已经在字符串中使用过)

<?php
$str = "Hello World!";
print_r(count_chars($str,1));
?>

mt_rand() 函数:使用 Mersenne Twister 算法生成随机整数。

提示:该函数是产生随机值的更好选择,返回结果的速度是 rand() 函数的 4 倍。

提示:如果您想要一个介于 10 和 100 之间(包括 10 和 100)的随机整数,请使用 mt_rand (10,100)。

chr() 函数:从指定 ASCII 值返回字符。ASCII 值可被指定为十进制值、八进制值或十六进制值。八进制值被定义为带前置 0,十六进制值被定义为带前置 0x。

ord() 函数:返回字符串中第一个字符的 ASCII 值。

<?php
echo ord("h")."<br>";
echo ord("hello")."<br>";
?>

md5() 函数:计算字符串的 MD5 散列。

md5(string,raw)

string:必需。规定要计算的字符串。

raw:可选。规定十六进制或二进制输出格式:

  • TRUE - 原始 16 字符二进制格式
  • FALSE - 默认。32 字符十六进制数
<?php
$str = "Hello";
echo md5($str);
 
if (md5($str) == "8b1a9953c4611296a827abf8c47804d7")
{
    echo "<br>Hello world!";
    exit;
}
?>

substr() 函数返回字符串的一部分。

substr(string,start,length)

string 必需。规定要返回其中一部分的字符串。
start 必需。规定在字符串的何处开始。正数 - 在字符串的指定位置开始负数 - 在从字符串结尾的指定位置开始0 - 在字符串中的第一个字符处开始
length 可选。规定要返回的字符串长度。默认是直到字符串的结尾。正数 - 从 start 参数所在的位置返回负数 - 从字符串末端返回

setcookie() :函数向客户端发送一个 HTTP cookie。

setcookie(name,value,expire,path,domain,secure)

参数 描述
name 必需。规定 cookie 的名称。
value 必需。规定 cookie 的值。
expire 可选。规定 cookie 的过期时间。time()+36002430 将设置 cookie 的过期时间为 30 天。如果这个参数没有设置,那么 cookie 将在 session 结束后(即浏览器关闭时)自动失效。
path 可选。规定 cookie 的服务器路径。如果路径设置为 "/",那么 cookie 将在整个域名内有效.如果路径设置为 "/test/",那么 cookie 将在 test 目录下及其所有子目录下有效。默认的路径值是 cookie 所处的当前目录。
domain 可选。规定 cookie 的域名。为了让 cookie 在 example.com 的所有子域名中有效,您需要把 cookie 的域名设置为 ".example.com"。当您把 cookie 的域名设置为 www.example.com 时,cookie 仅在 www 子域名中有效。
secure 可选。规定是否需要在安全的 HTTPS 连接来传输 cookie。如果 cookie 需要在安全的 HTTPS 连接下传输,则设置为 TRUE。默认是 FALSE。

例子:

<?php
$value = "my cookie value";

// send a simple cookie
setcookie("TestCookie",$value);
?>

posted on 2022-03-19 23:00  寂寞梧桐#  阅读(21)  评论(0编辑  收藏  举报

导航