首页 » Network_security » 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