为什么要用evelmatlab查看函数源代码,直接用PHP代码不行吗

浅谈变形PHP WEBSHELL检测 - 博客 - 腾讯安全应急响应中心
腾讯安全应急响应中心
Tencent Security Response Center
扫一扫分享到微信朋友圈
一、变形webshellwebshell比如eval($_POST[])大家都耳熟能详,近几年在常见的webshell基础上衍生了很多变种,加大了检测难度,下面先看几个从网上摘取的样本:1、无ascii码和数字的webshell&2、隐藏关键字&3、编码 + 隐藏关键字&从目前已经公开的样本来看,变形的php webshell都是采取了隐藏关键字(eval、system等)的方法来躲避查杀。有一位monyer同学写过一篇webshell的检测文章,他把webshell拆分为下面的结构,执行数据和数据传递,检测思路是:以小括号为界限,匹配执行数据部分是否命中收集的样本的关键字。这种思路很好,个人觉得有两处不足:1、需要人工维护收集新样本。2、误报量不可预估。 &再看这个结构,变形的webshell无非是隐藏了执行数据部分或者数据传递部分,不过无论怎么变形本质上还是去调用eval、调用system、exec等命令执行函数,杀毒软件通过异常行为来检测木马病毒,比如开机自启动,这种思想同样也可以用在webshell的检测中。获取行为数据是第一步。&二、PHP HOOK这里我们只需要一些敏感的行为数据,比如eval、system的调用。实现方法很简单,hook这些php函数或语法结构,这里通过php扩展来实现hook。下面以eval和system来简要概述下hook的方法。Eval是一个语法结构,调用eval最终会调用php内核的zend_compile_string函数,hook eval的只需要重写zend_complie_string函数即可,流程如下:&System是php的一个内部函数,php代码是转化为opcode(指令)来执行,函数调用的指令是ZEND_DO_FCALL,风雪之隅大牛在taint扩展(详见参考二)就是通过重载ZEND_DO_FCALL的方法实现了。因为我们并不需要hook每个内部函数,所以这里介绍另外一种方法,流程如下:&上报的数据写在一个日志文件中,包括文件名、调用函数名、代码在文件的行数。日志结构和内容如下:&附件中有eval、system函数hook实现的demo,具体细节可以查看代码。demo只在php-5.3.6上测试过,不兼容之处忘见谅。&三、检测变形webshell分为两大类,下面依次说明一下检测逻辑。1、执行数据隐藏一个正常的程序员如果使用eval、system是不会刻意的转换隐藏的,如果发现某个函数执行了,代码中却找不到这个函数名,我们认为这是一个异常行为。以下面这个变形为例&比如黑客传入参数nonalpha.php?_=system&__=whoami执行了一条命令,日志会记录 我们在后端取nonalpha.php文件的第7行内容匹配system(字符串,如果没找到,则认为是一个变形webshell。&2、数据传递隐藏先看下面这个例子&这个webshell通过编码的referer来传递攻击载荷,利用日志文件记录到的文件名和行数把代码上报到后端,和后端svn中的代码做对比,如果不一致,则认为是一个webshell。&四、不足web承受着大量的访问请求,增加的php扩展的性能和稳定性是一个严峻的考验,另外在服务器比较多的公司还存在一个推广和部署成本。&五、参考:[1] [2] [3] 附件:
扫一扫分享到微信朋友圈
捐款成功,感谢您的无私奉献
系统检测到您还未登录或登录态已失效,请先登录
扫一扫关注 TSRC 公众号eval(Javascrip函数)_百度百科
声明:百科词条人人可编辑,词条创建和修改均免费,绝不存在官方及代理商付费代编,请勿上当受骗。
?Javascrip函数
(Javascrip函数)
eval是Javascript内置函数,用于计算字符串表达式的值。例如eval(&2+3&)
返回的是5。
eval基本参数
codeString(编程函数)
必选。包含有效 JScript 代码的字符串。 //Jscript
可选项。确定要应用于 codeString 中代码的安全权限的字符串。
eval 函数允许动态执行 JScript。
传递给 eval 方法的代码执行时所在的上下文和调用 eval 方法时的上下文一样。请注意,在 eval 语句中定义的新变量或类型对于封闭程序是不可见的。
除非将字符串“unsafe”传递为第二个参数,否则,传递至 eval 方法的代码在受限安全上下文中执行。受限安全上下文禁止访问系统资源,如文件系统、网络或用户界面。如果代码试图访问这些资源,则会产生安全异常。
当 eval 的第二个参数为字符串“unsafe”时,传递给 eval 方法的代码在调用代码所在的安全上下文中执行。第二个参数是区分大小写的,因此,字符串“Unsafe”或“UnSAfE”不会重写受限安全上下文。
例如,下面的代码将变量mydate 初始化为测试日期或当前日期,这取决于变量 doTest 的值:
var doTest : boolean =
var dateFn : S
if(doTest)
dateFn = &Date()&;
dateFn = &Date()&;
var mydate : D
eval(&mydate = new &+dateFn+&;&);
print(mydate);
该程序的输出为:Thu Mar 8 00:00:00 PDT 1971
在本例中,我们将在几个字符串上运用 eval(),并看看返回的结果:
&script type=&text/javascript&&
eval(&x=10;y=20;document.write(x*y)&);
document.write(eval(&2+2&));
document.write(eval(x+17));
看一下在其他情况中,eval() 返回的结果:
eval(&2+3&) // 返回 5
var myeval = // 可能会抛出 EvalError 异常
myeval(&2+3&); // 可能会抛出 EvalError 异常
可以使用下面这段代码来检测 eval() 的参数是否合法:
try { alert(&Result:& + eval((&Enter an expression:&,&&))); }catch(exception) { alert(exception);[1]
ActionScript 中
eval(:Object) : Object
eval(expression:String) : Object
按照名称访问变量、属性、对象或影片剪辑。如果是变量或属性,则返回该变量或属
性的值。如果表达式是对象或影片剪辑,则返回对该对象或影片剪辑的引用。如果无法找到
表达式中列举的元素,则返回 undefined。
在 Flash 4 中,eval() 用于模拟;在 Flash 5 或更高版本中,您应该使用 Array 类来模
在 Flash 4 中,您还可以使用 eval() 动态地设置和检索变量值或实例名称。然而,也可以
使用数组访问运算符 ([]) 来实现这一点。
在 Flash5 或更高版本中,不能使用 eval() 动态设置和检索变量值或实例名称,因为不能在
等式的左侧使用 eval()。例如,将代码
eval (&var& + i) = &first&;
this[&var&+i] = &first&
或者替换为:
set (&var& + i, &first&);
可用性:Flash Player 5 ; ActionScript 1.0
让我们来比较一下eval的威力
第一种情况,不用eval:
输入3+2 ,出来还是3+2
第二种情况,用上eval:
x=Inputbox(&&)
msgbox eval(x)
输入3+2,会出来5
输入6*9,会出来54
输入sqr(49),会出来7
( sqr()是函数 )
很神奇啊!
eval — 把字符串作为PHP代码执行
mixedeval( string $code_str )
把字符串code_str作为PHP代码执行。 除了其他,该函数能够执行储存于数据库文本字段内的PHP代码。
使用eval()时需注意几个因素:注意字符必须是有效的PHP代码,包括结尾的分号,以不至于在eval()之后退出。并且正确地转义code_str中的东西。你可以使用一个PHP闭合标签来混合输出HTML和PHP代码。
同时需注意eval中的变量会被保留在之后的主脚本中。
code_str需要被执行的字符串code_str不能包含 PHP Opening tags。
return语句会立即中止当前字符串的执行。
eval()返回NULL,除非在执行的代码中return了一个值,函数返回该值。 如果在执行的代码中有一个解析错误,eval()返回FALSE,之后的代码将正常执行。无法使用 set_error_handler() 捕获eval()中的解析错误。
Example #1eval()例子 - 简单的文本合并
$string = 'cup';
$name = 'coffee';
$str = 'This is a $string with my $name in it.';
echo $str. &\n&;
eval(&\$str = \&$str\&;&);
echo $str. &\n&;
以上例程会输出:
This is a $string with my $name in it.This is a cup with my coffee in it.
Note: 因为是一个语言而不是一个函数,不能被 可变函数 调用。
Tip和直接将结果输出到浏览器一样,可使用输出控制函数来捕获当前函数的输出,然后(例如)保存到一个 string 中。
如果在执行的代码中产生了一个致命的错误(fatal error),整个脚本会退出。
shell中的eval命令将会首先扫描命令行进行所有的替换,然后再执行命令。该命令使用于那些一次扫描无法实现其功能的变量。该命令对变量进行两次扫描。这些需要进行两次扫描的变量有时候被称为复杂变量。
cmd=&$cmd \$$count&
ext 11 22 33
此时cmd=& echo $3&
eval $cmd 等价于 &echo 33 &
.w3school[引用日期]作者的其他最新日志
评论 ( 个评论)基本方法/eval
javascripteval(string) 函数可计算某个字符串,并执行其中的 JavaScript 代码。参数:string ;描述:要计算的字符串,其中含有要计算的 JavaScript 表达式或要执行的语句。jscript中的用法很相似。详见参考jscript与javascript的关系。JScript参数 :codeString(编程函数)必选。包含有效 JScript 代码的字符串。 //Jscriptoverrideeval可选项。确定要应用于 codeString 中代码的安全权限的字符串。eval 函数允许动态执行 JScript源代码。传递给 eval 方法的代码执行时所在的上下文和调用 eval 方法时的上下文一样。请注意,在 eval 语句中定义的新变量或类型对于封闭程序是不可见的。除非将字符串“unsafe”传递为第二个参数,否则,传递至 eval 方法的代码在受限安全上下文中执行。受限安全上下文禁止访问系统资源,如文件系统、网络或用户界面。如果代码试图访问这些资源,则会产生安全异常。当 eval 的第二个参数为字符串“unsafe”时,传递给 eval 方法的代码在调用代码所在的安全上下文中执行。第二个参数是区分大小写的,因此,字符串“Unsafe”或“UnSAfE”不会重写受限安全上下文。示例例如,下面的代码将变量mydate 初始化为测试日期或当前日期,这取决于变量 doTest 的值:var doTest : boolean =var dateFn : Sif(doTest)dateFn = "Date()";elsedateFn = "Date()";var mydate : Deval("mydate = new "+dateFn+";");print(mydate);该程序的输出为:Thu Apr 8 00:00:00 PDT 1971
例子 1在本例中,我们将在几个字符串上运用 eval(),并看看返回的结果:eval("x=10;y=20;document.write(x*y)");document.write(eval("2+2"));var x=10;document.write(eval(x+17));输出:200427例子 2看一下在其他情况中,eval() 返回的结果:eval("2+3") // 返回 5var myeval = // 可能会抛出 EvalError 异常myeval("2+3"); // 可能会抛出 EvalError 异常可以使用下面这段代码来检测 eval() 的参数是否合法:try { alert("Result:" + eval(prompt("Enter an expression:",""))); }catch(exception) { alert(exception);
ActionScript 中eval 函数eval(expression:Object) : Objecteval(expression:String) : Object按照名称访问变量、属性、对象或影片剪辑。如果表达式是变量或属性,则返回该变量或属性的值。如果表达式是对象或影片剪辑,则返回对该对象或影片剪辑的引用。如果无法找到表达式中列举的元素,则返回 undefined。在 Flash 4 中,eval() 用于模拟数组;在 Flash 5 或更高版本中,您应该使用 Array 类来模拟数组。在 Flash 4 中,您还可以使用 eval() 动态地设置和检索变量值或实例名称。然而,也可以使用数组访问运算符 ([]) 来实现这一点。在 Flash5 或更高版本中,不能使用 eval() 动态设置和检索变量值或实例名称,因为不能在等式的左侧使用 eval()。例如,将代码eval ("var" + i) = "first";替换为:this["var"+i] = "first"或者替换为:set ("var" + i, "first");可用性:Flash Player 5 ; ActionScript 1.0VBS中让我们来比较一下eval的威力第一种情况,不用eval:dim xx=Inputbox("")msgbox x输入3+2 ,出来还是3+2第二种情况,用上eval:dim xx=Inputbox("")msgbox eval(x)输入3+2,会出来5输入6*9,会出来54输入sqr(49),会出来7( sqr()是开平方函数 )很神奇啊!PHP中eval — 把字符串作为PHP代码执行说明mixedeval( string $code_str )把字符串code_str作为PHP代码执行。 除了其他,该函数能够执行储存于数据库文本字段内的PHP代码。使用eval()时需注意几个因素:注意字符必须是有效的PHP代码,包括结尾的分号,以不至于解释器在eval()之后退出。并且正确地转义code_str中的东西。你可以使用一个PHP闭合标签来混合输出HTML和PHP代码。同时需注意eval中的变量会被保留在之后的主脚本中。参数code_str需要被执行的字符串code_str不能包含 PHP Opening tags。return语句会立即中止当前字符串的执行。返回值eval()返回NULL,除非在执行的代码中return了一个值,函数返回该值。 如果在执行的代码中有一个解析错误,eval()返回FALSE,之后的代码将正常执行。无法使用 set_error_handler() 捕获eval()中的解析错误。范例$string = 'cup';$name = 'coffee';$str = 'This is a $string with my $name in it.';echo $str. "\n";eval("\$str = \"$str\";");echo $str. "\n";?&以上例程会输出:This is a $string with my $name in it.This is a cup with my coffee in it.Note: 因为是一个语言构造器而不是一个函数,不能被 可变函数 调用。Tip和直接将结果输出到浏览器一样,可使用输出控制函数来捕获当前函数的输出,然后(例如)保存到一个 string 中。Note:如果在执行的代码中产生了一个致命的错误(fatal error),整个脚本会退出。Linux 中shell中的eval命令将会首先扫描命令行进行所有的替换,然后再执行命令。该命令使用于那些一次扫描无法实现其功能的变量。该命令对变量进行两次扫描。这些需要进行两次扫描的变量有时候被称为复杂变量。例如$:cat extcount=3cmd=echocmd="$cmd \$$count"ext 11 22 33此时cmd=" echo $3"eval $cmd 等价于 "echo 33 "eval
&|&相关影像
互动百科的词条(含所附图片)系由网友上传,如果涉嫌侵权,请与客服联系,我们将按照法律之相关规定及时进行处理。未经许可,禁止商业网站等复制、抓取本站内容;合理使用者,请注明来源于。
登录后使用互动百科的服务,将会得到个性化的提示和帮助,还有机会和专业认证智愿者沟通。
此词条还可添加&
编辑次数:10次
参与编辑人数:9位
最近更新时间: 14:54:04
申请可获得以下专属权利:
贡献光荣榜
猜你想了解}

我要回帖

更多关于 函数不行 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信