0%

PHP文件操作漏洞

今天师傅们在群里聊到一个问题,有关于PHP文件操作对目录和文件判定相关的一个点,看了师傅们找到的一篇文章,感觉很有意思

PHP底层实现存在的一些问题,导致PHP写入、读取时对畸形文件名存在一些错误处理,导致漏洞产生

例一

file_put_contents和fopen等函数,使用了PHP的底层封装流,面对/var/www/html/index.php/. 这种畸形路径时会将其解析为正常的/var/www/html/index.php,导致对后缀名的绕过,而对于rename,unlink等函数,则会直接将此路径在Linux下进行系统调用,得到not a directory的错误,无法删除
此问题在Linux与Windows系统下均存在

阅读全文 »

[watevrCTF-2019]Pickle Store

之前做了他们的一个cookie store的题目,cookie伪造一下就能过,是个水题,就顺着做了他们的pickle store,做起来就不太对劲了,难度upup

同样在cookie处能取得一串base64,解码之后用pickle.loads加载,可以看到一个数组,记载了钱数和货物,但是这回多了一个hmac的签名,加密用的密钥是没办法搞出来了,那就只能另寻他路

pickle反序列化漏洞

python的反序列化漏洞危害比PHP要大,因为能做到任意代码执行,直接写一个类,创建一个__reduce__方法,该方法在该类被序列化时使用,返回字符串或元组。
我们可以在返回值处调用我们想要使用的函数,不过这种方法只能调用一个函数,例如return (os.system,('ls',)),并且这里是一定要加逗号的,圆括号中添加逗号会将其声明为元组,而规定__reduce__方法的返回值必须是字符串或元组,使用不这么用就会报错

阅读全文 »

[嘶吼CTF] Online Proxy

嘶吼的一个题,好像上次打了嘶吼,然后一个题磨了一天没摸出来

一开始以为是ssrf,试了半天发现写死了必须要http:// 开头,感觉就没机会了,查看源码,发现一个注释显示显示了当前IP,修改XFF头发现可控,并且会保存上一次访问的IP,这里就会用到数据库,所以可能存在一个注入

测试,打一个0’ or sleep(5) or ‘0过去,无延迟,显示payload,然后再重新随便打一个xff过去,出现延迟,在输入相同的xff,返回了0,出现延迟证明存在注入,只是没懂后端的查询代码是怎么样的,给人的感觉就像是直接是一句select xff一样。union select打了一下没有反应,报错也不存在,返回值有0和1,那就只能盲注了

然后自己动手做盲注,踩了一个小坑,即or和||是一致的,而|代表按位或,一开始用0’ or length(payload) or ‘0这么打,连length的返回值都是1。因为这种用or and这些来进行判断的结果只能是true 1和false 0嘛,愚蠢了。
而与零按位或数字则保持不变,就能获取结果,但是0和字符串或就会把字符串强制类型转换成数字,所以还是只能盲注

阅读全文 »

国赛 Love Math

太难了,我不会

解法

先上源码

<?php
error_reporting(0);
//听说你很喜欢数学,不知道你是否爱它胜过爱flag
if(!isset($_GET['c'])){
    show_source(__FILE__);
}else{
    //例子 c=20-1
    $content = $_GET['c'];
    if (strlen($content) >= 80) {
        die("太长了不会算");
    }
    $blacklist = [' ', '\t', '\r', '\n','\'', '"', '`', '\[', '\]'];
    foreach ($blacklist as $blackitem) {
        if (preg_match('/' . $blackitem . '/m', $content)) {
            die("请不要输入奇奇怪怪的字符");
        }
    }
    //常用数学函数http://www.w3school.com.cn/php/php_ref_math.asp
    $whitelist = ['abs', 'acos', 'acosh', 'asin', 'asinh', 'atan2', 'atan', 'atanh', 'base_convert', 'bindec', 'ceil', 'cos', 'cosh', 'decbin', 'dechex', 'decoct', 'deg2rad', 'exp', 'expm1', 'floor', 'fmod', 'getrandmax', 'hexdec', 'hypot', 'is_finite', 'is_infinite', 'is_nan', 'lcg_value', 'log10', 'log1p', 'log', 'max', 'min', 'mt_getrandmax', 'mt_rand', 'mt_srand', 'octdec', 'pi', 'pow', 'rad2deg', 'rand', 'round', 'sin', 'sinh', 'sqrt', 'srand', 'tan', 'tanh'];
    preg_match_all('/[a-zA-Z_\x7f-\xff][a-zA-Z_0-9\x7f-\xff]*/', $content, $used_funcs);  
    foreach ($used_funcs[0] as $func) {
        if (!in_array($func, $whitelist)) {
            die("请不要输入奇奇怪怪的函数");
        }
    }
    //帮你算出答案
    eval('echo '.$content.';');
}
阅读全文 »

[安洵杯 2019]easy_web

刷题记录

题目第一层那个文件名两次base64加密一次十六进制转ascii,真的有点毒,我用的在线解码还出问题了。。。过了就可以拿到index.php的源码

<?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 ~");
    }
}

说白了就是不让直接获取flag,强类型md5过了之后可以过一个超级过滤来执行命令

阅读全文 »