从输入表单到C源代码,检查不允许的关键字

时间:2018-09-02 12:21:51

标签: php c

从html表单输入区域,我编写了一个C源文件(使用PHP'file_put_contents'),然后编译并运行它(),并使用PHP打印结果。

但是在运行它之前,我会检查输入数据中我认为是C禁止的单词,例如'fopen','goto'等。 (使用PHP“ strpos”)。

为什么要“打开”?因为我不希望用户使用此表单打开PHP源文件并从中获取明智的数据...

我的问题:黑客是否有可能使用转义序列或其他任何可以使用这些禁止词的东西?

实际源代码的摘录: -编译:

$reponseModele = shell_exec("gcc -o source.exe source.c  2>&1");
  • 运行(带有“ scanf”的输入数据)

    $ reponseTest = shell_exec(“ gcc -o cource.exe &1”);

编辑1

PHP源文件中没有任何秘密(数据库密码除外...但不是“ root”用户...)

我考虑到安全性非常低的事实,但是由于它是一个个人网站,因此对于教育和学生评估,风险是有限的,除非用户可以从该网站发起大规模攻击。

正如我在评论中告诉的那样,我检查了一些C关键字(从您的评论中,我添加了“ asm”,“ extern”,“ volatile”),检查了循环。

控制的东西可能是“ malloc”。

仍然要记住的问题是:是否可以转义字符以便执行'fopen'或其他关键字?

更多PHP代码将有所帮助

$ srcprog是主要的C语言源,我添加了一个count(我将更改名称...),$ contenuTest是要编译的代码:

$contenuTest = "static int ctz = 0; \n#include <stdlib.h> \n" . "$srcprog";

然后,我添加循环检查(我还将更改100个限制...):

$contenuTest = str_replace("{", "{ ctz++; if (ctz>100) {printf(\"BOUCLE !!!\");exit(99);}", $contenuTest);

1 个答案:

答案 0 :(得分:2)

将单词列入黑名单是不够的。无法验证远程用户提供的代码不会尝试进行任何恶意操作。无法通过限制程序的源文本来防止恶意访问:如果您要运行不受信任的代码,则需要操作系统沙箱(例如,在虚拟机内部运行代码以及将计算机与其他所有设备隔离开的防火墙)。 (即使那样,也存在对VM主机进行Spectre攻击的危险。)

让您对这里的危险有所了解:编写一个程序在堆栈上构造任意字节,然后“偶然地”将执行返回到该缓冲区是不容易的;这意味着攻击者可以编写直接执行的任意机器代码。编译器对此无能为力(它可能会发出警告,但可以将其禁用),并且没有将关键字列入黑名单将阻止您在堆栈上分配值或从函数返回,如果您不想这样做,该程序能够执行任何有用的操作。

更不用说这里有很多琐碎的拒绝服务攻击:攻击者可以编写一个程序,该程序可以炸毁或永远消耗100%的CPU,或者可以执行其他许多不是明确恶意的事情,但这样做使您的服务器无法进行其他任何工作。

有评论者提到Halting problem,以证明这种方法永远行不通。更有力的证明是Rice's theorem,它证明了程序的任何非平凡语义属性是无法确定的。本质上,如果给您一段代码,并要求X的任何值要求“该代码执行X吗”,那么总会有一些代码可以执行X,但是您不能在不实际执行并查看发生了什么的情况下就无法弄清楚。