我正在尝试构建一个可用于任意代码执行的函数列表.目的不是列出应列入黑名单或以其他方式禁止的功能.相反,我希望在搜索受感染的后台服务器时,有一个grep
可用的红旗关键字列表.
这个想法是,如果你想构建一个多用途的恶意PHP脚本 - 比如像c99或r57这样的"web shell"脚本 - 你将不得不使用一组或多组相对较小的函数文件中的某个位置,以便允许用户执行任意代码.搜索这些功能可以帮助您更快地将数万个PHP文件的大海捞变到相对较小的脚本集中,这些脚本需要仔细检查.
显然,例如,以下任何一种都会被视为恶意(或可怕的编码):
<? eval($_GET['cmd']); ?>
<? system($_GET['cmd']); ?>
<? preg_replace('/.*/e',$_POST['code']); ?>
Run Code Online (Sandbox Code Playgroud)
等等.
前几天通过一个被入侵的网站进行搜索,我没有注意到一段恶意代码,因为我没有意识到preg_replace
使用该/e
标志可能会造成危险(严重的是,为什么即使那样?).还有其他我错过的吗?
到目前为止,这是我的清单:
Shell执行
system
exec
popen
backtick operator
pcntl_exec
PHP执行
eval
preg_replace
(带/e
修饰符)create_function
include
[ _once
]/require
[ _once
](有关漏洞利用详情,请参阅mario的回答)拥有一个能够修改文件的函数列表可能也很有用,但我想99%的时间漏洞利用代码至少包含一个上述函数.但是如果你有一个能够编辑或输出文件的所有功能的列表,请发布它,我会在这里包含它.(而且我不算数mysql_execute
,因为那是另一类漏洞利用的一部分.)
MySQL Workbench报告了一个与服务器健康状况相关的名为"密钥效率"的值.这意味着什么?它的含义是什么?
来自MySQL.com,"关键效率"是:
......表明
key_read_requests
实际数量的指示key_reads
.
好的,那是什么意思.它告诉我有关我应该如何调整服务器的信息?
我试图找到一个简单的(即非正式的)解释,正如乔姆斯基所阐述的4级正式语法(无限制,上下文敏感,无上下文,常规).
自从我学习正式语法以来,这已经是一个时代了,各种各样的定义现在让我难以想象.要明确的是,我不是在寻找你到处都可以找到的正式定义(例如这里和这里 - 我可以谷歌以及其他任何人),或者甚至是任何形式的正式定义.相反,我希望找到的是干净简单的解释,为了完整性而不牺牲清晰度.
grammar context-free-grammar regular-language context-sensitive-grammar
我正在开始一个普通C(c99)的新项目,该项目主要用于文本.由于外部项目的限制,这段代码必须非常简单和紧凑,由一个没有外部依赖的源代码文件或除libc和类似的无处不在的系统库之外的库组成.
根据这种理解,哪些最佳实践,陷阱,技巧或其他技术可以帮助使项目的字符串处理更加健壮和安全?
我需要替换rand()
使用加密强随机数生成器的PHP 函数.
该openssl_random_pseudo_bytes()
函数使您可以访问强随机数生成器,但它将其数据作为字节字符串输出.相反,我需要一个介于0和X之间的整数.
我想关键是将输出openssl_random_pseudo_bytes()
转换为整数,然后你就可以对它进行任何数学运算.我可以想到一些从字节串转换为整数的"蛮力"方式,但我希望有一些......优雅.
在Apache坐在反向代理(例如Squid)后面的情况下,cgi环境变量REMOTE_ADDR
获取代理的地址而不是客户端.
但是,代理将设置一个名为X-Forwarded-For
包含客户端原始IP地址的标头,以便Apache可以看到它.
问题是,我们如何让Apache替换标头中REMOTE_ADDR
的值,X-Forwarded-For
以便所有Web应用程序都能透明地看到正确的地址?
我已经遇到了在Linux中给出其文件描述符的路径引用目录的需要.路径不必是规范的,它必须是功能性的,以便我可以将它传递给其他功能.因此,采用与传递给函数相同的参数fstatat()
,我需要能够调用一个getxattr()
没有f-XYZ-at()
变量的函数.
到目前为止,我已经提出了这些解决方案; 虽然没有一个特别优雅.
最简单的解决方案是通过调用openat()
然后使用类似函数来避免问题fgetxattr()
.这有效,但不是在所有情况下都有效.因此需要另一种方法来填补空白.
下一个解决方案涉及在proc中查找信息:
if (!access("/proc/self/fd",X_OK)) {
sprintf(path,"/proc/self/fd/%i/",fd);
}
Run Code Online (Sandbox Code Playgroud)
当然,这完全打破了没有proc的系统,包括一些chroot环境.
最后一个选项,一个更便携但可能更具竞争条件的解决方案,如下所示:
DIR* save = opendir(".");
fchdir(fd);
getcwd(path,PATH_MAX);
fchdir(dirfd(save));
closedir(save);
Run Code Online (Sandbox Code Playgroud)
这里显而易见的问题是,在多线程应用程序中,更改工作目录可能会产生副作用.
然而,它工作的事实是令人信服的:如果我可以通过调用fchdir()
后跟我来获取目录的路径getcwd()
,为什么我不能直接获取信息:fgetcwd()
或者其他东西.很明显,内核正在跟踪必要的信息.
那我该怎么做呢?
Linux getcwd
在内核中实现的方式是:它从相关的目录条目开始,并将该目录的父级名称添加到路径字符串中,并重复该过程直到它到达根目录.理论上可以在用户空间中实现相同的机制.
感谢Jonathan Leffler指出这个算法.以下是此函数的内核实现的链接:https://github.com/torvalds/linux/blob/v3.4/fs/dcache.c#L2577
如何在运行时更改函数加载的库?
例如,假设我想取代标准的printf
新的东西的功能,我可以写我自己的版本,并把它编译成一个共享库,然后把"LD_PRELOAD = /我的/ library.so"的环境中运行的可执行我之前.
但是,让我们说,我想改变程序本身内部的联系.当然那一定是可能的......对吗?
编辑
不,不,以下不起作用(但如果你能告诉我如何使它工作,那就足够了).
void* mylib = dlopen("/path/to/library.so",RTLD_NOW);
printf = dlsym(mylib,"printf");
Run Code Online (Sandbox Code Playgroud) 通过一些apache日志,我已经多次遇到以下模式(URL解码):
GET /foo.php?id=1 and union select 0x5E5B7D7E,0x5E5B7D7E,0x5E5B7D7E,... --
Run Code Online (Sandbox Code Playgroud)
显然这是一次SQL注入尝试.但为什么上面显示的常数?我看不出它有多么特别重要,尽管看起来很频繁.
对于它的价值,上面的常量映射到以下ASCII字符:" ^[}~
"或" ~}[^
",如果你颠倒字节顺序.十进制的值是1,583,054,206
八进制的013626676576
.代码似乎没有映射到有用的x86指令序列.
谷歌搜索这个数字只是揭示了在其他网站上使用相同的SQL注入攻击的尝试的残余 - 没有关于攻击本身的信息.
有人有任何见解吗?
在编写基于某些事件发送电子邮件的应用程序时,我想强制执行以下规则:每个电子邮件都会启动一个新的"对话".
诸如Gmail的电子邮件系统将组电子邮件消息分组为"对话",使得消息A被假定为对消息B的回复.他们使用许多方法来确定您要回复的邮件,例如Subject:标头或In-Reply-To:标头.
但是,由于自动电子邮件有时会重复使用主题行(例如" 监视服务器foo.bar.com上的失败 "),因此邮件服务通常会认为给定的电子邮件实际上是对具有相同主题行的先前邮件的回复,即使这两者是无关的.这可能会导致混淆,客户可能会错过重要通知.
是否有可能(如果是,那么如何)在您的邮件标题中发信号通知给定的电子邮件不是对任何其他邮件的回复,尽管主题行中有任何潜在的相似之处?
由于客户端可以看到电子邮件主题本身,我宁愿避免像这样的愚蠢: "Subject: Automated reminder for $task [".md5sum(date())."]"