【NSSCTF-Round#16】 Web和Crypto详细完整WP

每天都要加油哦!    ------2024-01-18  11:16:55


[NSSRound#16 Basic]RCE但是没有完全RCE

<?php
error_reporting
(0);
highlight_file(__file__);
include(
'level2.php');
if (isset(
$_GET['md5_1']) && isset($_GET['md5_2'])) {
    if ((string)
$_GET['md5_1'] !== (string)$_GET['md5_2'] && md5($_GET['md5_1']) === md5($_GET['md5_2'])) {
        if (isset(
$_POST['md5_3'])&&md5($_POST['md5_3']) == md5($_POST['md5_3'])) {
            echo 
$level2;
        } else {
            echo 
"您!!!!!那么现在阁下又该如何应对呢";
        }
    } else {
        echo 
"还在用传统方法????";
    }
} else {
    echo 
"来做做熟悉的MD5~";
}
来做做熟悉的MD5~

这道题要md5_1和md5_2的string后的值要强不等于一样,并且他们的md5值要一样

参考这篇文章https://blog.csdn.net/qq_19980431/article/details/83018232

成功过去。其中md5_3没有任何限制,什么都行。

进入3z_RC3.

<?php
error_reporting
(0);
highlight_file(__FILE__);
$shell $_POST['shell'];
$cmd $_GET['cmd'];
if(
preg_match('/f|l|a|g|\*|\?/i',$cmd)){
    die(
"Hacker!!!!!!!!");
}
eval(
$shell($cmd));

cmd中不能有flag。会执行我们输入的语句。

进行目录穿越,可以得到根目录有个flag.使用通配符绕过。

得到flag:NSSCTF{79575ef9-a587-4557-8d5f-99074758ba48} 


[NSSRound#16 Basic]了解过PHP特性吗

<?php
error_reporting
(0);
highlight_file(__FILE__);
include(
"rce.php");
$checker_1 FALSE;
$checker_2 FALSE;
$checker_3 FALSE;
$checker_4 FALSE;
$num $_GET['num'];
if (
preg_match("/[0-9]/"$num)) {
    die(
"no!!");
}
if (
intval($num)) {
    
$checker_1 TRUE;
}
if (isset(
$_POST['ctype']) && isset($_POST['is_num'])) {
    
$ctype strrev($_POST['ctype']);
    
$is_num strrev($_POST['is_num']);
    if (
ctype_alpha($ctype) && is_numeric($is_num) && md5($ctype) == md5($is_num)) {
        
$checker_2 TRUE;
    }
}
$_114 $_GET['114'];
$_514 $_POST['514'];
if (isset(
$_114) && intval($_114) > 114514 && strlen($_114) <= 3) {
    if (!
is_numeric($_514) && $_514 9999999) {
        
$checker_3 TRUE;
    }
}
$arr4y $_POST['arr4y'];
if (
is_array($arr4y)) {
    for (
$i 0$i count($arr4y); $i++) {
        if (
$arr4y[$i] === "NSS") {
            die(
"no!");
        }
        
$arr4y[$i] = intval($arr4y[$i]);
    }
    if (
array_search("NSS"$arr4y) === 0) {
        
$checker_4 TRUE;
    }
}
if (
$checker_1 && $checker_2 && $checker_3 && $checker_4) {
    echo 
$rce;
}

当num是一个数组时,preg_match会将它转化为bool类型,而使整个句子返回false;

intval当遇到非空数组时,会返回true

第二个绕过

PHP 的弱类型比较QNKCDZO 和 240610708 进行 md5 后加密的数值为 0e 开头,在 PHP 中会被识别为科学计数法,所有 0e 开头的数据进行弱类型比较皆为 True

第三个,search默认第三个参数是false类型。弱比较,输入0,NSS0,NSS1都行。

绕过后会提示你去别的地方

这里就是一个简单的create_function注入。shell变量对应的是新建匿名函数的参数列表,nss变量对应的是函数体。这里给shell变量传一个空值,这样这个新建的匿名函数就能在没有参数的情况下执行。
create_function注入原理见

https://www.cnblogs.com/-chenxs/p/11459374.html

https://www.cnblogs.com/GTL-JU/p/16831601.html

类似于sql注入的闭合,只不过这个是闭合}。

flag:shell=&nss=1;}system("cat /flag");/*


[NSSRound#16 Basic]pr

原题:

from Crypto.Util.number import *
import random

flag=plaintext = 'NSSCTF{****************}'
charset = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'
padding_length = 100 - len(plaintext)

for _ in range(padding_length):
    plaintext += random.choice(charset)

public_exponent = 31413537523
message = bytes_to_long(plaintext.encode())
assert message > (1 << 512)
assert message < (1 << 1024)

prime_p = getPrime(512)
prime_q = getPrime(512)
prime_r = getPrime(512)
n1 = prime_p * prime_q
n2 = prime_q * prime_r
ciphertext1 = pow(message, public_exponent, n1)
ciphertext2 = pow(message, public_exponent, n2)
print('c1=', ciphertext1)
print('c2=', ciphertext2)
print('p=', prime_p)
print('r=', prime_r)


'''
c1= 36918910341116680090654563538246204134840776220077189276689868322808977412566781872132517635399441578464309667998925236488280867210758507758915311644529399878185776345227817559234605958783077866016808605942558810445187434690812992072238407431218047312484354859724174751718700409405142819140636116559320641695
c2= 15601788304485903964195122196382181273808496834343051747331984997977255326224514191280515875796224074672957848566506948553165091090701291545031857563686815297483181025074113978465751897596411324331847008870832527695258040104858667684793196948970048750296571273364559767074262996595282324974180754813257013752
p= 12101696894052331138951718202838643670037274599483776996203693662637821825873973767235442427190607145999472731101517998719984942030184683388441121181962123
r= 10199001137987151966640837133782537428248507382360655526592866939552984259171772190788036403425837649697437126360866173688083643144865107648483668545682383
'''

c1me(mod n1​)   等价与 me ​≡c1(mod n1​)  

c2me(mod n2)      等价于 me c2(mod n1)  

因为n1=p*q,n2=q*r,把上式子分解。

me ​≡c1(mod p​)  

me ​≡c1(mod r​)  

已知e,c1,c2,p,r.可以把m求出来。

用中国剩余定理将两者结合在一起。

以下是解题代码:

# -*- coding:utf-8 -*-
""" 
作者:Wang Xinwei
日期:2024年01月21日
"""
from Crypto.Util.number import *
from gmpy2 import *
from functools import reduce
import sympy
def chinese_remainder(a, n):
    sum = 0
    prod = reduce(lambda a, b: a * b, n)
    for n_i, a_i in zip(n, a):
        p = prod // n_i
        sum += a_i * sympy.invert(p, n_i) * p
    return int(sum % prod)
c1 = 36918910341116680090654563538246204134840776220077189276689868322808977412566781872132517635399441578464309667998925236488280867210758507758915311644529399878185776345227817559234605958783077866016808605942558810445187434690812992072238407431218047312484354859724174751718700409405142819140636116559320641695
c2 = 15601788304485903964195122196382181273808496834343051747331984997977255326224514191280515875796224074672957848566506948553165091090701291545031857563686815297483181025074113978465751897596411324331847008870832527695258040104858667684793196948970048750296571273364559767074262996595282324974180754813257013752
p = 12101696894052331138951718202838643670037274599483776996203693662637821825873973767235442427190607145999472731101517998719984942030184683388441121181962123
r = 10199001137987151966640837133782537428248507382360655526592866939552984259171772190788036403425837649697437126360866173688083643144865107648483668545682383
e = 31413537523
c_p=c1%p
c_r=c2%r
c=chinese_remainder([c_p,c_r],[p,r])
phi=(p-1)*(r-1)
d=inverse(e,phi)
m=pow(c,d,p*r)
print(long_to_bytes(m))

得到flag:NSSCTF{yUanshEnx1ncHun2o23!}

 

posted @ 2024-01-18 13:14  AllFalls  阅读(236)  评论(0编辑  收藏  举报